TransferInRequest
The body of `POST /api/transfer-in`. The frozen contract's shape. `idempotency_key` is in the BODY here, unlike `/api/buy-domain` which takes it as a header. That is the contract the frontend wizard is being built to, so it wins; the route also accepts the `Idempotency-Key` header and uses it when the body field is absent, so a client that follows the older convention is not broken by the difference.
Properties
| Name | Type | Description |
|---|---|---|
| domain | string | |
| auth_code | object | The transfer authorisation code from the losing registrar. Optional only because a handful of endings do not use one; the server refuses the transfer when the ending requires it. |
| idempotency_key | object | |
| dns_plan | string | keep | prestage | copy_at_completion. |
| name_servers | object | The delegation to submit with the transfer. Optional; when omitted the server resolves it from the DNS plan. Never sent empty to the registrar - an omitted delegation is undocumented behaviour with th |
| dns_records | object | The record set the customer reviewed before paying - the public-DNS probe, plus anything they added by hand or uploaded as a BIND export. It FILLS the pre-staged zone, so the records are already being |
| contact | object | |
| expected_price_usd | object | Price ceiling the client computed for the FULL TERM. A server price above it returns 409 price_higher_than_expected rather than charging more than was shown. |
| consent_version | object | The version of the transfer text the client showed before the customer pressed pay. Recorded, as the client reported it, on the evidence-of-permission audit row written before the charge. Optional: a |
| consent_text | object | The assent line the client rendered beside the Pay button, verbatim ("By paying you agree to our Terms, Refund Policy and Privacy Policy..."). Stored as reported on the same audit row, the way the reg |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/justdomain-ai/json-schema/justdomain-ai-transfer-in-request-schema.json",
"title": "TransferInRequest",
"description": "The body of `POST /api/transfer-in`. The frozen contract's shape.\n\n`idempotency_key` is in the BODY here, unlike `/api/buy-domain` which\ntakes it as a header. That is the contract the frontend wizard is being\nbuilt to, so it wins; the route also accepts the `Idempotency-Key` header\nand uses it when the body field is absent, so a client that follows the\nolder convention is not broken by the difference.",
"x-generated": "2026-11-13",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/mcp-openapi.json#/components/schemas/TransferInRequest",
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"minLength": 3,
"title": "Domain"
},
"auth_code": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Auth Code",
"description": "The transfer authorisation code from the losing registrar. Optional only because a handful of endings do not use one; the server refuses the transfer when the ending requires it."
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Idempotency Key"
},
"dns_plan": {
"type": "string",
"title": "Dns Plan",
"description": "keep | prestage | copy_at_completion.",
"default": "keep"
},
"name_servers": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array",
"maxItems": 13
},
{
"type": "null"
}
],
"title": "Name Servers",
"description": "The delegation to submit with the transfer. Optional; when omitted the server resolves it from the DNS plan. Never sent empty to the registrar - an omitted delegation is undocumented behaviour with the customer's live DNS on the other side."
},
"dns_records": {
"anyOf": [
{
"items": {
"$ref": "#/$defs/DnsRecordOut"
},
"type": "array",
"maxItems": 400
},
{
"type": "null"
}
],
"title": "Dns Records",
"description": "The record set the customer reviewed before paying - the public-DNS probe, plus anything they added by hand or uploaded as a BIND export. It FILLS the pre-staged zone, so the records are already being served at the instant the registry moves the delegation to us, and it is what the post-completion check diffs against. Required in practice for the `prestage` and `copy_at_completion` plans: without it the zone would be empty at completion, which is a site and a mailbox going dark. Ignored for `keep`, where the delegation stays where it is."
},
"contact": {
"$ref": "#/$defs/RegistrantInfo"
},
"expected_price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Expected Price Usd",
"description": "Price ceiling the client computed for the FULL TERM. A server price above it returns 409 price_higher_than_expected rather than charging more than was shown."
},
"consent_version": {
"anyOf": [
{
"type": "string",
"maxLength": 32
},
{
"type": "null"
}
],
"title": "Consent Version",
"description": "The version of the transfer text the client showed before the customer pressed pay. Recorded, as the client reported it, on the evidence-of-permission audit row written before the charge. Optional: a client that predates it is recorded as having reported no version, never as having shown one."
},
"consent_text": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"title": "Consent Text",
"description": "The assent line the client rendered beside the Pay button, verbatim (\"By paying you agree to our Terms, Refund Policy and Privacy Policy...\"). Stored as reported on the same audit row, the way the registration lane stores the auto-renew disclosure text: the server did not see the pixels, and says so."
}
},
"type": "object",
"required": [
"domain",
"contact"
],
"$defs": {
"DnsRecordOut": {
"properties": {
"type": {
"type": "string",
"title": "Type",
"description": "A, AAAA, CNAME, MX, TXT, NS, SRV, CAA."
},
"name": {
"type": "string",
"title": "Name",
"description": "The absolute host, e.g. 'example.com' or '_dmarc.example.com'."
},
"value": {
"type": "string",
"title": "Value"
},
"ttl": {
"type": "integer",
"title": "Ttl",
"default": 3600
},
"prio": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Prio"
}
},
"type": "object",
"required": [
"type",
"name",
"value"
],
"title": "DnsRecordOut",
"description": "One DNS record, in the five fields the rest of the product uses.\n\nIdentical in shape to what the DNS-management screen sends, so a record\nread off somebody else's nameservers and a record typed into our own\nform are the same object and never need translating between the two."
},
"RegistrantInfo": {
"properties": {
"first_name": {
"type": "string",
"title": "First Name"
},
"last_name": {
"type": "string",
"title": "Last Name"
},
"org_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Org Name"
},
"email": {
"type": "string",
"title": "Email"
},
"phone": {
"type": "string",
"title": "Phone"
},
"country": {
"type": "string",
"title": "Country"
},
"address1": {
"type": "string",
"title": "Address1"
},
"city": {
"type": "string",
"title": "City"
},
"state": {
"type": "string",
"title": "State"
},
"postal_code": {
"type": "string",
"title": "Postal Code"
},
"additional_data": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"title": "Additional Data",
"description": "Extra registrant data a registry demands beyond standard contacts - a .us nexus declaration, an ISOC-IL registrant ID. Keyed by OUR checkout form keys (`us_nexus_category`, `registrant_id`), NOT by a registrar's wire field names: the translation happens in the provider adapter, so a registrar swap does not rewrite the checkout form. Validated against the ending's JSON Schema BEFORE a card is charged - see `shared.services.requirements`."
}
},
"type": "object",
"required": [
"first_name",
"last_name",
"email",
"phone",
"country",
"address1",
"city",
"state",
"postal_code"
],
"title": "RegistrantInfo",
"description": "WHOIS registrant contact, persisted alongside an `Order`.\n\nInternal DTO. The HTTP API (`/api/buy-domain`) accepts and validates\nthese fields; the Openprovider registration job reads them off the\nOrder row when fulfilling."
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/justdomain-ai-transfer-in-request"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.