schemas/security-contacts.schema.json
security-contacts.schema.json
JSON Schema for the registrar_security_contacts dataset. Versioned alongside the data.
Overview#overview
Field definitions#fields
| Field | Type | Required | Description |
|---|---|---|---|
| registrar_id | string | required | Foreign key to registrars.id. |
| abuse_email | string | required | Registrar abuse contact email, or 'unknown' when not resolvable. |
| security_txt | enum | required | present | absent | unknown (RFC 9116 .well-known presence). |
| policy_url | string · uri | null | optional | Published abuse/acceptable-use policy URL, if confirmed. |
| verification_status | enum | required | See verification statuses. |
| last_checked | string · date-time | required | ISO 8601 timestamp. |
| field_provenance | object | optional | Per-field source_url, verification_status, last_checked and note. |
JSON Schema#preview
{
"$id": "https://opendomaindata.org/schemas/security-contacts.schema.json",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "RegistrarSecurityContacts",
"description": "Abuse and security contact metadata for a single registrar.",
"version": "2026.06",
"type": "object",
"required": ["registrar_id", "abuse_email", "security_txt", "verification_status", "last_checked"],
"properties": {
"registrar_id": { "type": "string", "description": "Foreign key to registrars.id." },
"abuse_email": { "type": "string", "description": "Registrar abuse contact email, or 'unknown' when no primary record was resolvable." },
"security_txt": { "type": "string", "enum": ["present", "absent", "unknown"], "description": "RFC 9116 security.txt presence at the registrar's .well-known path." },
"policy_url": { "type": ["string", "null"], "format": "uri", "description": "Published abuse/acceptable-use policy URL, if confirmed." },
"verification_status": {
"type": "string",
"enum": ["unknown", "public_sources", "independently_tested", "registrar_submitted", "registrar_verified", "deprecated"]
},
"last_checked": { "type": "string", "format": "date-time" },
"field_provenance": { "$ref": "#/$defs/fieldProvenance" }
},
"additionalProperties": false,
"$defs": {
"fieldProvenance": {
"type": "object",
"description": "Per-field provenance. Maps a field name in this record to the source URL it was checked against, its verification status and the timestamp of that check. Field-level entries are authoritative over the record-level verification_status/last_checked for the field they describe.",
"additionalProperties": {
"type": "object",
"required": ["source_url", "verification_status", "last_checked"],
"properties": {
"source_url": { "type": "string", "format": "uri", "description": "Primary source URL the field value was checked against." },
"verification_status": {
"type": "string",
"enum": ["unknown", "public_sources", "independently_tested", "registrar_submitted", "registrar_verified", "deprecated"]
},
"last_checked": { "type": "string", "format": "date-time" },
"note": { "type": "string", "description": "Optional human-readable note describing how this specific field was checked." }
},
"additionalProperties": false
}
}
}
}
Validation example#validation
Validate a record locally using any JSON Schema validator. The schema is draft 2020-12; for ajv use the 2020 import.
import Ajv from "ajv/dist/2020";
import schema from "https://opendomaindata.org/schemas/security-contacts.schema.json" assert { type: "json" };
const ajv = new Ajv();
const validate = ajv.compile(schema);
const ok = validate(record);
if (!ok) console.error(validate.errors);Changelog#changelog
Schema changes are recorded in the project changelog and follow the dataset release tag.