Just Domain Transfer In API

The Transfer In API from Just Domain — 4 operation(s) for transfer in.

GitHub OpenAPI

Operations 4

POST /api/transfer-in Post Transfer In #
GET /api/transfer-in/dns-plans Get Transfer Dns Plans #
GET /api/transfer-in/{order_id} Get Transfer In #
POST /api/transfer-in/queue Post Transfer In Queue #

Work with this as data

Every API 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 apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/justdomain-ai:justdomain-ai-transfer-in-api"
All apis
curl "https://apis.io/api/v1/apis?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.

OpenAPI Specification

justdomain-ai-transfer-in-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: just-domain-mcp Transfer In API
  version: 0.1.0
tags:
- name: Transfer In
paths:
  /api/transfer-in:
    post:
      summary: Post Transfer In
      description: Pay for an inbound transfer. Re-prechecks server-side before charging.
      operationId: post_transfer_in_api_transfer_in_post
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Idempotency-Key
      - name: Authorization
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferInRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferInResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      tags:
      - Transfer In
  /api/transfer-in/dns-plans:
    get:
      summary: Get Transfer Dns Plans
      description: 'The DNS plans a transfer may use today. Public, no DB, no provider.


        The wizard reads this before it offers a plan, so a domain whose DNS sits

        with its current registrar is told on the first screen, before anybody

        fetches an authorization code, that it cannot move here yet - instead of

        at the payment step. The list is `accepted_dns_plans`, the function the

        money path refuses with; there is no second copy of the rule anywhere.

        Behind the transfer-in flag like the rest of this surface.'
      operationId: get_transfer_dns_plans_api_transfer_in_dns_plans_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferDnsPlansResponse'
      tags:
      - Transfer In
  /api/transfer-in/{order_id}:
    get:
      summary: Get Transfer In
      description: 'Where this transfer got to, with the day counter and the real dates.


        Reads the row. It does NOT poll the registrar: the poll runs on the

        scheduler and stamps `transfer_status_checked_at`, which is returned

        beside every answer so a status never appears without its read time. A

        per-request registrar call would put a five-second third-party round trip

        inside a page a customer refreshes while they are anxious, and would let

        a customer''s refresh key drive our rate limit at the registrar.'
      operationId: get_transfer_in_api_transfer_in__order_id__get
      parameters:
      - name: order_id
        in: path
        required: true
        schema:
          type: string
          title: Order Id
      - name: Authorization
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Authorization
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferInStatusResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      tags:
      - Transfer In
  /api/transfer-in/queue:
    post:
      summary: Post Transfer In Queue
      description: 'Free. No charge, no PaymentIntent, no order.


        A domain inside its post-registration hold cannot be transferred at any

        price, so taking a card for one would be selling a wait. We work out the

        date from the registry''s own record and the checkout happens on the day,

        at the price that is true on the day.'
      operationId: post_transfer_in_queue_api_transfer_in_queue_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferQueueRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferQueueResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      tags:
      - Transfer In
components:
  schemas:
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    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: '#/components/schemas/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: '#/components/schemas/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
      title: TransferInRequest
      description: '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.'
    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.


        Identical in shape to what the DNS-management screen sends, so a record

        read off somebody else''s nameservers and a record typed into our own

        form are the same object and never need translating between the two.'
    TransferQueueResponse:
      properties:
        domain:
          type: string
          title: Domain
        queued_at:
          type: string
          title: Queued At
        eligible_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Eligible At
        blockers:
          items:
            $ref: '#/components/schemas/TransferBlockerOut'
          type: array
          title: Blockers
          default: []
      type: object
      required:
      - domain
      - queued_at
      title: TransferQueueResponse
    TransferRefundOut:
      properties:
        state:
          type: string
          title: State
        amount:
          anyOf:
          - type: string
          - type: 'null'
          title: Amount
        at:
          anyOf:
          - type: string
          - type: 'null'
          title: At
        failure_code:
          anyOf:
          - type: string
          - type: 'null'
          title: Failure Code
      type: object
      required:
      - state
      title: TransferRefundOut
    TransferQueueRequest:
      properties:
        domain:
          type: string
          maxLength: 253
          minLength: 3
          title: Domain
        email:
          type: string
          maxLength: 320
          minLength: 3
          title: Email
      type: object
      required:
      - domain
      - email
      title: TransferQueueRequest
    TransferDnsPlansResponse:
      properties:
        dns_plans:
          items:
            type: string
          type: array
          title: Dns Plans
      type: object
      required:
      - dns_plans
      title: TransferDnsPlansResponse
      description: '`GET /api/transfer-in/dns-plans`: the DNS plans a transfer may use today.


        The wizard offers a plan only if it is here, and `POST /api/transfer-in`

        refuses any plan that is not, from the same function

        (`services.transfer_in.accepted_dns_plans`). Configuration, not a

        per-domain answer: which plans fit a given domain is the precheck''s

        `dns_continuity.case`.'
    TransferInResponse:
      properties:
        order_id:
          type: string
          title: Order Id
        client_secret:
          anyOf:
          - type: string
          - type: 'null'
          title: Client Secret
        amount:
          type: string
          title: Amount
        currency:
          type: string
          title: Currency
        term_years:
          type: integer
          title: Term Years
        term_note:
          type: string
          title: Term Note
        status:
          type: string
          title: Status
      type: object
      required:
      - order_id
      - client_secret
      - amount
      - currency
      - term_years
      - term_note
      - status
      title: TransferInResponse
    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`.


        Internal DTO. The HTTP API (`/api/buy-domain`) accepts and validates

        these fields; the Openprovider registration job reads them off the

        Order row when fulfilling.'
    TransferBlockerOut:
      properties:
        code:
          type: string
          title: Code
        detail:
          type: string
          title: Detail
        eligible_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Eligible At
      type: object
      required:
      - code
      - detail
      title: TransferBlockerOut
    TransferInStatusResponse:
      properties:
        order_id:
          type: string
          title: Order Id
        domain:
          type: string
          title: Domain
        status:
          type: string
          title: Status
        status_label:
          type: string
          title: Status Label
        submitted_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Submitted At
        day:
          anyOf:
          - type: integer
          - type: 'null'
          title: Day
        auto_completes_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Auto Completes At
        checked_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Checked At
        term_years:
          type: integer
          title: Term Years
        term_note:
          type: string
          title: Term Note
        amount:
          anyOf:
          - type: string
          - type: 'null'
          title: Amount
        currency:
          anyOf:
          - type: string
          - type: 'null'
          title: Currency
        refund:
          anyOf:
          - $ref: '#/components/schemas/TransferRefundOut'
          - type: 'null'
        dns:
          anyOf:
          - $ref: '#/components/schemas/TransferDnsOut'
          - type: 'null'
      type: object
      required:
      - order_id
      - domain
      - status
      - status_label
      - term_years
      - term_note
      title: TransferInStatusResponse
    TransferDnsOut:
      properties:
        plan:
          anyOf:
          - type: string
          - type: 'null'
          title: Plan
        name_servers:
          items:
            type: string
          type: array
          title: Name Servers
          default: []
        source:
          anyOf:
          - type: string
          - type: 'null'
          title: Source
        zone_ready:
          type: boolean
          title: Zone Ready
          default: false
        zone_status:
          anyOf:
          - type: string
          - type: 'null'
          title: Zone Status
        zone_provider:
          anyOf:
          - type: string
          - type: 'null'
          title: Zone Provider
        zone_error:
          anyOf:
          - type: string
          - type: 'null'
          title: Zone Error
        records_staged:
          type: integer
          title: Records Staged
          default: 0
        verified_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Verified At
        diff:
          anyOf:
          - items:
              type: string
            type: array
          - type: 'null'
          title: Diff
      type: object
      title: TransferDnsOut