Coldrig Byo Domains API

The byo-domains API from Coldrig — 6 operation(s) for byo-domains.

Operations 7

GET /byo-domains List every bring-your-own domain for the account #
POST /byo-domains Register a bring-your-own domain and run the pre-flight intake scan #
GET /byo-domains/{id} One BYO domain's full intake detail #
POST /byo-domains/{id}/poll-dns Re-check DNS delegation/records for a domain in pending_dns #
POST /byo-domains/{id}/managed-mailboxes Request mailboxes Coldrig sets up on an already-active BYO domain #
POST /byo-domains/{id}/connect-mailbox Declare an existing mailbox connection on a BYO domain #

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/coldrig-dev:coldrig-dev-byo-domains-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

coldrig-dev-byo-domains-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Coldrig Dev Byo Domains API
  version: 0.3.0
  contact:
    name: EpiphanyMade
    email: support@coldrig.dev
  license:
    name: MIT
  description: 'Operations tagged byo-domains across 2 of this provider''s published API definitions: coldrig-dev-openapi.yaml, coldrig-dev-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.coldrig.dev
  description: Production API host.
security:
- bearerAuth: []
tags:
- name: byo-domains
paths:
  /byo-domains:
    get:
      operationId: get_byo_domains
      tags:
      - byo-domains
      summary: List every bring-your-own domain for the account
      description: Summary rows only — use GET /byo-domains/{id} for the full intake detail (pre-flight scan, abuse verdict, consent status).
      responses:
        '200':
          description: BYO domain summaries.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ByoDomainSummary'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: register_byo_domain
      tags:
      - byo-domains
      summary: Register a bring-your-own domain and run the pre-flight intake scan
      description: Runs the live-infra scan, the abuse gate, and the reputation ladder, returning the starting byoStatus. A live-infra hit hard-refuses NS delegation and falls back to records_to_apply; a primary domain is always records_to_apply, never we_manage_zone. Real DNS delegation activates per-account the same way real sending does — this endpoint is reachable today, but registering a domain does not itself set up anything real until the account is activated.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterByoDomainInput'
      responses:
        '201':
          description: Domain registered — intake started.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ByoDomainRecord'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
    servers:
    - url: https://api.coldrig.dev
      description: Production API host.
  /byo-domains/{id}:
    get:
      operationId: get_byo_domain
      tags:
      - byo-domains
      summary: One BYO domain's full intake detail
      parameters:
      - $ref: '#/components/parameters/ByoDomainId'
      responses:
        '200':
          description: BYO domain detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ByoDomainRecord'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    servers:
    - url: https://api.coldrig.dev
      description: Production API host.
  /byo-domains/{id}/poll-dns:
    post:
      operationId: poll_byo_domain_dns
      tags:
      - byo-domains
      summary: Re-check DNS delegation/records for a domain in pending_dns
      description: 'Poll-verify: advances pending_dns → active on success, or → abandoned after a 7-day idle timeout with no verification. A no-op (returns current state) once past pending_dns.'
      parameters:
      - $ref: '#/components/parameters/ByoDomainId'
      responses:
        '200':
          description: Poll result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PollDnsResult'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    servers:
    - url: https://api.coldrig.dev
      description: Production API host.
  /byo-domains/{id}/consent:
    post:
      operationId: acknowledge_byo_consent
      tags:
      - byo-domains
      summary: Acknowledge the primary-domain risk disclosure
      description: Required before a primary-domain intake can proceed past pending_consent. acknowledged must be the literal true — there is no default or implied acknowledgment. Idempotent past pending_consent. The acknowledgment documents informed consent; it does not itself remove the business's exposure or substitute for the technical safeguards in §20.1/§20.2.
      parameters:
      - $ref: '#/components/parameters/ByoDomainId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AcknowledgeByoConsentInput'
      responses:
        '200':
          description: Consent recorded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ByoDomainRecord'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    servers:
    - url: https://api.coldrig.dev
      description: Production API host.
  /byo-domains/{id}/managed-mailboxes:
    post:
      operationId: request_managed_byo_mailboxes
      tags:
      - byo-domains
      summary: Request mailboxes Coldrig sets up on an already-active BYO domain
      description: 'The primary build target: the vendor sets up new mailboxes under the customer''s own domain, reusing the same setup path as the lookalike-domain flow. Requires the domain to already be active (past DNS verification). These are mailboxes Coldrig sets up, so they count toward the standard per-mailbox quantity billing, at your plan''s mailbox price; pass `quoteOnly: true` to preview the new count + projected monthly before setup.'
      parameters:
      - $ref: '#/components/parameters/ByoDomainId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RequestManagedByoMailboxesInput'
      responses:
        '201':
          description: Mailboxes set up.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ManagedMailboxesResult'
        '202':
          description: 'A large order: it would bring the account more than 20 mailboxes past what its last confirmed payment covered, so nothing was set up or charged. Returns { provisioning: "payment_pending", billing, payment }. Pay at `payment.url`; then repeat this same request.

            '
          content:
            application/json:
              schema:
                type: object
                required:
                - provisioning
                - billing
                - payment
                properties:
                  provisioning:
                    type: string
                    enum:
                    - payment_pending
                  billing:
                    $ref: '#/components/schemas/MailboxBilling'
                  payment:
                    $ref: '#/components/schemas/LargeOrderPayment'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/CapacityPending'
        '502':
          $ref: '#/components/responses/VendorError'
        '503':
          $ref: '#/components/responses/NotActivated'
    servers:
    - url: https://api.coldrig.dev
      description: Production API host.
  /byo-domains/{id}/connect-mailbox:
    post:
      operationId: connect_byo_mailbox
      tags:
      - byo-domains
      summary: Declare an existing mailbox connection on a BYO domain
      description: 'Bypasses vendor setup entirely: the caller already holds the OAuth refresh token or SMTP+IMAP app password for a mailbox that already exists. This declares the mailbox the caller is connecting — it is not a claim about this platform''s own outbound send transport. A connected mailbox is billed like any mailbox, at your plan''s mailbox price (the preview shows it), and the billed quantity follows at once; pass `quoteOnly: true` to preview the new count + projected monthly before connecting.'
      parameters:
      - $ref: '#/components/parameters/ByoDomainId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConnectByoMailboxInput'
      responses:
        '200':
          description: 'Either a quoteOnly preview (nothing was connected; the body is `{ quoteOnly: true, billing }`), or a repeat of an identical connect that already landed (the mailbox is already connected and billed; the body is the existing mailbox, the same as the 201 body, with no `quoteOnly`).

            '
          content:
            application/json:
              schema:
                oneOf:
                - type: object
                  required:
                  - quoteOnly
                  - billing
                  properties:
                    quoteOnly:
                      type: boolean
                      enum:
                      - true
                    billing:
                      $ref: '#/components/schemas/MailboxBilling'
                - $ref: '#/components/schemas/ConnectByoMailboxResult'
        '201':
          description: Mailbox connection recorded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConnectByoMailboxResult'
        '400':
          description: 'Validation error. Also returned when the address is already connected to this account with different settings, or is a mailbox Coldrig set up; nothing is changed.

            '
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    servers:
    - url: https://api.coldrig.dev
      description: Production API host.
components:
  schemas:
    LargeOrderPayment:
      type: object
      required:
      - url
      - amountCents
      - mailboxes
      - coveredAfter
      - expiresAt
      - text
      description: 'The one hosted card payment page a large order waits on. Its amount is this billing period''s share of the mailboxes past what the last confirmed payment covered, and is taken off the next bill. The cardholder''s bank may ask for a code. Repeating the order returns the same page until it is paid or expires.

        '
      properties:
        url:
          type: string
          description: Open in a browser and pay here.
        amountCents:
          type: integer
        mailboxes:
          type: integer
          description: How many mailboxes past the last confirmed payment this page pays for.
        coveredAfter:
          type: integer
          description: The mailbox count the account's confirmed payments cover once this page is paid.
        expiresAt:
          type: integer
          description: Unix milliseconds.
        text:
          type: string
    RegisterByoDomainInput:
      type: object
      required:
      - domain
      - domainRelationship
      properties:
        domain:
          type: string
          minLength: 3
          maxLength: 253
          description: 'One line of plain text: a line break, tab, control character or invisible text-direction mark is refused (400) naming this field.'
        domainRelationship:
          $ref: '#/components/schemas/DomainRelationshipInput'
    ByoDomainRecord:
      type: object
      required:
      - domainId
      - domain
      - isPrimary
      - dnsMode
      - byoStatus
      - breakerTier
      - reputationBranch
      - scan
      - abuseVerdict
      - consentAcknowledged
      properties:
        domainId:
          type: string
        domain:
          type: string
        isPrimary:
          type: boolean
        dnsMode:
          type: string
          enum:
          - we_manage_zone
          - records_to_apply
        byoStatus:
          type: string
          enum:
          - pending_kyc
          - pending_consent
          - pending_dns
          - active
          - rejected
          - abandoned
        breakerTier:
          type: string
          enum:
          - standard
          - elevated
          - primary
        reputationBranch:
          type:
          - string
          - 'null'
        scan:
          type: object
          additionalProperties: true
          description: Pre-flight live-infra scan result.
        abuseVerdict:
          type: string
          description: Abuse-gate verdict.
        consentAcknowledged:
          type: boolean
    ByoDomainSummary:
      type: object
      required:
      - domainId
      - domain
      - isPrimary
      - dnsMode
      - byoStatus
      - breakerTier
      - reputationBranch
      - mailboxCount
      properties:
        domainId:
          type: string
        domain:
          type: string
        isPrimary:
          type: boolean
        dnsMode:
          type: string
          enum:
          - we_manage_zone
          - records_to_apply
        byoStatus:
          type: string
          enum:
          - pending_kyc
          - pending_consent
          - pending_dns
          - active
          - rejected
          - abandoned
        breakerTier:
          type: string
          enum:
          - standard
          - elevated
          - primary
        reputationBranch:
          type:
          - string
          - 'null'
        mailboxCount:
          type: integer
    DomainRelationshipInput:
      type: string
      enum:
      - fresh_standalone
      - subdomain_of_primary
      - is_primary
      description: 'fresh_standalone = brand-new domain, no history; subdomain_of_primary = a subdomain of the account''s existing primary domain; is_primary = the account''s own flagship business domain.

        '
    ConnectByoMailboxResult:
      type: object
      required:
      - mailboxId
      - email
      - transportKind
      - billing
      properties:
        mailboxId:
          type: string
        email:
          type: string
        transportKind:
          type: string
        billing:
          $ref: '#/components/schemas/MailboxBilling'
    ConnectByoMailboxSmtpInput:
      type: object
      required:
      - kind
      - host
      - port
      - secure
      - user
      - pass
      properties:
        kind:
          type: string
          enum:
          - smtp
        host:
          type: string
        port:
          type: integer
        secure:
          type: boolean
        user:
          type: string
        pass:
          type: string
    ConnectByoMailboxGmailInput:
      type: object
      required:
      - kind
      - clientId
      - clientSecret
      - refreshToken
      properties:
        kind:
          type: string
          enum:
          - gmail_api
        clientId:
          type: string
        clientSecret:
          type: string
        refreshToken:
          type: string
    PollDnsResult:
      type: object
      required:
      - domainId
      - byoStatus
      - verified
      - checksSoFar
      properties:
        domainId:
          type: string
        byoStatus:
          type: string
          enum:
          - pending_kyc
          - pending_consent
          - pending_dns
          - active
          - rejected
          - abandoned
        verified:
          type: boolean
        checksSoFar:
          type: integer
    ConnectByoMailboxInput:
      type: object
      required:
      - email
      - transport
      properties:
        email:
          type: string
          format: email
        quoteOnly:
          type: boolean
          default: false
          description: Quote-before-add — true previews the new count + projected monthly without connecting.
        transport:
          description: 'The mailbox connection the caller already holds — declares an EXISTING credential the caller supplies, not an OAuth flow this API initiates. This describes the mailbox being connected; it is not a claim about this platform''s own outbound send transport.

            '
          oneOf:
          - $ref: '#/components/schemas/ConnectByoMailboxSmtpInput'
          - $ref: '#/components/schemas/ConnectByoMailboxGmailInput'
          - $ref: '#/components/schemas/ConnectByoMailboxGraphInput'
          discriminator:
            propertyName: kind
    RequestManagedByoMailboxesInput:
      type: object
      required:
      - count
      properties:
        count:
          type: integer
          minimum: 1
          maximum: 5
          description: At most 5; on a live account, a domain with no managed mailboxes needs 3-5.
        personaSlug:
          type: string
          minLength: 1
          maxLength: 50
          description: Optional; defaults to a slug of the domain.
        quoteOnly:
          type: boolean
          default: false
          description: Quote-before-add — true previews the new count + projected monthly without setup.
    MailboxBilling:
      type: object
      description: 'Billing projection returned on every mailbox add/remove (no silent capacity addition). `provisionedAfter` is the live mailbox count AFTER the call — reality, not the ask (a capacity-limited partial or a quoteOnly preview both report the true resulting count).

        '
      required:
      - provisionedAfter
      - projectedMonthlyCents
      - formula
      properties:
        provisionedAfter:
          type: integer
          description: Live set-up mailbox count after this operation.
        projectedMonthlyCents:
          type: integer
          description: 'Projected monthly: $49 a month covers the first 3 mailboxes, then $5 a month for each extra mailbox (3-mailbox minimum) — folding any checkout discount.'
        formula:
          type: string
        domainEnding:
          type: object
          description: 'Only on a quoteOnly preview of an order over 10 mailboxes in the account''s first billing month that buys new domains, when the platform''s .co switch is on: they will end in .co unless the real call sends `dotComDomains: true`.

            '
          required:
          - ending
          - newDomains
          - feeCentsEach
          - text
          properties:
            ending:
              type: string
              enum:
              - co
            newDomains:
              type: integer
              description: New domains this order buys.
            feeCentsEach:
              type: integer
              description: The one-time fee per .com domain bought, in cents, added to the next bill.
            text:
              type: string
              description: The same, in one sentence to show the account owner.
        prepay:
          type: object
          description: 'Only on a quoteOnly preview of an order making more than 4 new domains in your first billing month, when the platform''s prepaid-month switch is on: the real call must send `prepaySecondMonth: true` (else 400 `prepay_required`, nothing bought); month 2 is then charged right after the mailboxes are set up, at most `cents`.

            '
          required:
          - months
          - cents
          - text
          properties:
            months:
              type: integer
              enum:
              - 2
              description: The month paid up front is the second one.
            cents:
              type: integer
              description: Month 2 at this order's mailbox count.
            text:
              type: string
              description: The same, in one sentence to show the account owner.
    ConnectByoMailboxGraphInput:
      type: object
      required:
      - kind
      - mode
      - tenantId
      - clientId
      - clientSecret
      properties:
        kind:
          type: string
          enum:
          - ms_graph
        mode:
          type: string
          enum:
          - delegated
          - app_only
        tenantId:
          type: string
        clientId:
          type: string
        clientSecret:
          type: string
        refreshToken:
          type: string
          description: Optional for app_only mode.
    ManagedMailboxesResult:
      type: object
      required:
      - mailboxEmails
      - billing
      properties:
        mailboxEmails:
          type: array
          items:
            type: string
        billing:
          $ref: '#/components/schemas/MailboxBilling'
    AcknowledgeByoConsentInput:
      type: object
      required:
      - acknowledged
      properties:
        acknowledged:
          type: boolean
          enum:
          - true
          description: 'Must be the literal true — a separate, unbundled risk acknowledgment.

            '
  responses:
    CapacityPending:
      description: 'Setup is paused while Coldrig support checks recent purchases on this account. Not a failure, and nothing was charged for this step; sending, existing mailboxes and the plan are not affected. `reason` names why. Once support finishes, repeating the same request (same idempotency key) completes it.

        '
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
              code:
                type: string
                enum:
                - capacity_pending
              reason:
                type: string
                enum:
                - purchase_hold
            required:
            - error
            - code
            - reason
    NotFound:
      description: Resource not found, or not owned by the authenticated account.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
    VendorError:
      description: 'A real vendor call failed (domain registrar or mailbox provider) — materially different from a bug in this service. `step` names the vendor operation that failed when derivable; `retryable` is the adapter''s own grade, so a caller can back off instead of guessing.


        THE GRADE IS TWO INDEPENDENT QUESTIONS. `retryable` says whether an immediate re-attempt can succeed on its own. `operatorActionable` says whether Coldrig''s team can clear the refusal — funding a provider account, rotating a credential, un-suspending a workspace — after which your SAME request, with the same idempotency key, completes. When it is true the `code` is `vendor_operator_blocked`: do not change your inputs and do not give up, because nothing about the request is wrong. When both are false the refusal is yours to fix or to escalate.

        '
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
              code:
                type: string
                enum:
                - vendor_error
                - vendor_operator_blocked
              step:
                type:
                - string
                - 'null'
                description: The vendor operation that failed, when derivable from the underlying error message.
              retryable:
                type: boolean
              operatorActionable:
                type: boolean
                description: 'Present and true only on `vendor_operator_blocked`: someone at Coldrig can clear this, and the identical retry then completes. Absent means false.

                  '
            required:
            - error
            - code
            - retryable
    Unauthorized:
      description: Missing, invalid, or inactive bearer token.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
    NotActivated:
      description: 'A required vendor integration is not yet enabled for this account. Nothing was charged. This condition has no automatic notification to Coldrig''s team behind it, so the response says so and points at contact_operator rather than implying a human is already on it.

        '
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
              code:
                type: string
                enum:
                - not_activated
              step:
                type:
                - string
                - 'null'
            required:
            - error
            - code
    ValidationError:
      description: Request body failed schema validation.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
  parameters:
    ByoDomainId:
      name: id
      in: path
      required: true
      description: 'The MCP tools `get_byo_domains` and `configure_byo_domain` take this same identifier as an `id` argument (there is no URL path in MCP tool calls).

        '
      schema:
        type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Token returned by POST /signup. One token = one separate account. An app connected with "Sign in with Coldrig" (OAuth) holds its own short-lived token for the same account: it is accepted on the hosted MCP endpoint (/mcp) only, and on no REST route.

        '
    dashboardSessionCookie:
      type: apiKey
      in: cookie
      name: cs_dashboard_session
      description: 'httpOnly session cookie minted by POST /dashboard/session (30-day TTL). Alternative to bearerAuth for /dashboard/* routes only, used by the optional human dashboard SPA. A cookie-authed mutating request (any method other than GET/HEAD) must also send the `X-Coldstart-Client: dashboard` header (global CSRF guard) — bearer-authed requests are exempt.

        '
x-refined-from:
- coldrig-dev-openapi.yaml
- coldrig-dev-openapi.yml