Registry-specific attributes
Some TLDs require additional information about contacts beyond the standard fields like name, address, and email. These are called registry-specific attributes — things like entity type, tax IDs, nexus categories, or legal status declarations mandated by the registry operator.
The OpusDNS API handles these through contact attribute sets: reusable bundles of key–value pairs that you create once and link to one or more contacts.
Flow overview
- Query the TLD specification to discover which attributes are required.
- Create a contact attribute set with the correct values.
- Link the attribute set to a contact.
1. Discover required attributes
Use the TLD specifications endpoint to check whether a TLD requires
registry-specific attributes. The contacts.possible_attributes array lists
every attribute the registry accepts or requires.
curl "$OPUSDNS_API_BASE/v1/tlds/us" \
--header "X-Api-Key: $OPUSDNS_API_KEY"
The response includes a contacts.possible_attributes array. Each entry is a
ContactAttributeDefinition:
{
"contacts": {
"possible_attributes": [
{
"key": "US_NEXUS_CATEGORY",
"type": "enum",
"values": ["C11", "C12", "C21", "C31", "C32"],
"required": true,
"contact_roles": ["registrant"]
},
{
"key": "US_APP_PURPOSE",
"type": "enum",
"values": ["P1", "P2", "P3", "P4", "P5"],
"required": true,
"contact_roles": ["registrant"]
},
{
"key": "US_NEXUS_COUNTRY_CODE",
"type": "country_code",
"required": true,
"contact_roles": ["registrant"],
"conditions": [
{
"field": "US_NEXUS_CATEGORY",
"operator": "in",
"value": ["C31", "C32"]
}
]
}
]
}
}
Attribute definition fields
| Field | Description |
|---|---|
key |
Unique attribute identifier (e.g. US_NEXUS_CATEGORY, DE_CONTACT_TYPE) |
type |
Data type — enum, string, boolean, datetime, integer, or country_code |
values |
Allowed values when type is enum |
required |
Whether the attribute is required when its conditions are met |
contact_roles |
Roles this attribute applies to (e.g. registrant, admin). null means all roles |
conditions |
Conditions that must all be true for this attribute to apply. null means always active |
Conditional attributes
Some attributes only apply when another attribute has a specific value. For
example, US_NEXUS_COUNTRY_CODE is only required when US_NEXUS_CATEGORY is
C31 or C32. Conditions use operators like equals, not_equals, in, and
not_in.
2. Create an attribute set
Once you know which attributes are needed, create a contact attribute set with
POST /v1/contacts/attribute-sets. Each set is scoped to a single TLD.
curl "$OPUSDNS_API_BASE/v1/contacts/attribute-sets" \
--request POST \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"label": "US registrant - personal",
"tld": "us",
"attributes": {
"US_NEXUS_CATEGORY": "C11",
"US_APP_PURPOSE": "P1"
}
}'
The response includes the created set with its ID:
{
"contact_attribute_set_id": "cas_01j5...",
"organization_id": "org_01h4...",
"label": "US registrant - personal",
"tld": "us",
"attributes": {
"US_NEXUS_CATEGORY": "C11",
"US_APP_PURPOSE": "P1"
},
"linked_contacts": 0,
"created_on": "2025-01-15T10:30:00Z",
"updated_on": "2025-01-15T10:30:00Z"
}
The label must be unique per TLD within your organization. The tld field
accepts formats like us, .us, or US — it is normalized automatically.
The API validates that the provided attribute keys are valid for the given TLD.
If the TLD has no possible_attributes or you supply an invalid key, the
request is rejected.
3. Link the attribute set to a contact
After creating the set, link it to a contact with
PATCH /v1/contacts/{contact_id}/link/{contact_attribute_set_id}.
curl "$OPUSDNS_API_BASE/v1/contacts/contact_01h45ytscbebyvny4gc8cr8ma2/link/cas_01j5..." \
--request PATCH \
--header "X-Api-Key: $OPUSDNS_API_KEY"
A contact can only have one attribute set linked per TLD. Attempting to link a
second set for the same TLD returns a 409 conflict.
Once linked, the attribute values are automatically applied when the contact is used for domain operations on that TLD.
List attribute sets
Retrieve all attribute sets in your organization with
GET /v1/contacts/attribute-sets. You can filter by tld or label.
curl --get "$OPUSDNS_API_BASE/v1/contacts/attribute-sets" \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--data-urlencode "tld=us"
Update an attribute set
Update the label of an existing attribute set with
PATCH /v1/contacts/attribute-sets/{contact_attribute_set_id}.
curl "$OPUSDNS_API_BASE/v1/contacts/attribute-sets/cas_01j5..." \
--request PATCH \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"label": "US registrant - business"
}'
Delete an attribute set
Remove an attribute set with
DELETE /v1/contacts/attribute-sets/{contact_attribute_set_id}.
curl "$OPUSDNS_API_BASE/v1/contacts/attribute-sets/cas_01j5..." \
--request DELETE \
--header "X-Api-Key: $OPUSDNS_API_KEY"
Supported TLDs and attributes
The following TLDs currently require or accept registry-specific attributes.
Use GET /v1/tlds/{tld} for the authoritative, up-to-date list.
| TLD | Registry | Key attributes | Roles |
|---|---|---|---|
.us |
GoDaddy (Neustar) | US_NEXUS_CATEGORY, US_APP_PURPOSE, US_NEXUS_COUNTRY_CODE |
registrant |
.de |
DENIC | DE_CONTACT_TYPE |
registrant |
.eu |
EURid | eurid:type |
registrant, tech |
.be |
DNS Belgium | dnsbe:type |
registrant, tech |
.fr |
AFNIC | AFNIC_CONTACT_TYPE, AFNIC_PP_FIRST_NAME, AFNIC_PM_LEGAL_STATUS, AFNIC_PM_SIREN, and more |
registrant, admin, tech |
.re, .pm, .wf, .yt, .tf |
AFNIC | Same as .fr |
registrant, admin, tech |
.uk |
Nominet | NOMINET_CONTACT_TYPE, NOMINET_CO_NO, NOMINET_TRAD_NAME |
registrant |
.ca |
CIRA | CIRA_CPR |
registrant, admin |
.nl |
SIDN | SIDN_LEGAL_FORM, SIDN_LEGAL_REG_NO |
registrant, admin, tech |
.ro |
ROTLD | ROTLD_CONTACT_TYPE, ROTLD_CNP_FISCAL_CODE, ROTLD_ID_NUMBER, ROTLD_REGISTRATION_NUMBER |
registrant, admin, tech, billing |
Example: .fr registration (AFNIC)
AFNIC TLDs distinguish between natural persons (PP) and legal entities
(PM). A natural person requires AFNIC_CONTACT_TYPE and
AFNIC_PP_FIRST_NAME. A legal entity requires AFNIC_PM_LEGAL_STATUS and,
depending on the status, identifiers like AFNIC_PM_SIREN or association
details.
curl "$OPUSDNS_API_BASE/v1/contacts/attribute-sets" \
--request POST \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"label": "FR registrant - company",
"tld": "fr",
"attributes": {
"AFNIC_CONTACT_TYPE": "PM",
"AFNIC_PM_LEGAL_STATUS": "company",
"AFNIC_PM_SIREN": "123456789"
}
}'
Example: .de registration (DENIC)
curl "$OPUSDNS_API_BASE/v1/contacts/attribute-sets" \
--request POST \
--header "X-Api-Key: $OPUSDNS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"label": "DE registrant - person",
"tld": "de",
"attributes": {
"DE_CONTACT_TYPE": "PERSON"
}
}'

