Done For You

Search and check domains, then order ready-to-send domains and mailboxes and track the order.

Check one exact domain

get https://api.emailchaser.com/r/dfy/domains/check
Works with a read-only key

Checks whether one specific domain can be registered, rather than searching the names the registrar suggests. Use this to buy a domain the customer chose. Only .com and .org are supported.

A domain that simply cannot be bought - taken, malformed, an extension we do not register - answers 200 with available false and a reason. A non-2xx means the check itself could not be made, which is not the same as the domain being taken.

  • domain string required in query

    The full domain to check, extension included

Fields in the 200 response
  • available boolean
    Example: true
  • domain string
    Example: acme-outreach.com
  • price number
    Example: 13.99
  • reason string

    Reason says why the domain cannot be bought, in words that can be shown to a person. Empty when available is true.

    Example: That domain is already registered.
  • tld string
    Example: com
  • unconfirmed boolean

    Unconfirmed is true when we could not get an answer at all rather than the answer "no". Do not report these as taken; offer a retry.

    Example: false

Request

curl -X GET "https://api.emailchaser.com/r/dfy/domains/check?domain=value" \
  -H "Authorization: Bearer $EMAILCHASER_API_KEY"

Response

{
  "available": true,
  "domain": "acme-outreach.com",
  "price": 13.99,
  "reason": "That domain is already registered.",
  "tld": "com",
  "unconfirmed": false
}

Check a list of exact domains

post https://api.emailchaser.com/r/dfy/domains/check
Works with a read-only key

Checks up to 100 exact domains in one call, for a caller who already has the list. One answer per unique domain, in the order given, each following the single check's rules. A registrar failure on one name marks it unconfirmed rather than failing the list; the call fails only when nothing could be checked.

  • domains array of string required
    Example: ["acme-outreach.com","acme-outreach.org"]
Fields in the 200 response
  • domains array of CheckDfyDomainResponse
    6 fields inside domains
    • available boolean
      Example: true
    • domain string
      Example: acme-outreach.com
    • price number
      Example: 13.99
    • reason string

      Reason says why the domain cannot be bought, in words that can be shown to a person. Empty when available is true.

      Example: That domain is already registered.
    • tld string
      Example: com
    • unconfirmed boolean

      Unconfirmed is true when we could not get an answer at all rather than the answer "no". Do not report these as taken; offer a retry.

      Example: false

Request

curl -X POST "https://api.emailchaser.com/r/dfy/domains/check" \
  -H "Authorization: Bearer $EMAILCHASER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "domains": [
    "acme-outreach.com",
    "acme-outreach.org"
  ]
}'

Response

{
  "domains": [
    {
      "available": true,
      "domain": "acme-outreach.com",
      "price": 13.99,
      "reason": "That domain is already registered.",
      "tld": "com",
      "unconfirmed": false
    }
  ]
}

Get the launch intro offer

get https://api.emailchaser.com/r/dfy/intro-offer
Works with a read-only key

Returns the one-time launch offer for the caller's workspace: the first .com domain and the FIRST MONTH of up to maxMailboxes mailboxes at intro prices, with the per-mailbox setup fee waived, on the workspace's FIRST done-for-you order. From the second month the mailboxes bill the standard monthly price.

Read this before quoting a price. The backend decides and applies the offer when the order is placed, so an order never needs to ask for it and can never be sent one - it is applied automatically when the order has the right shape (exactly one available .com domain and one to maxMailboxes mailboxes, all on it) and the workspace is still eligible. Any other order is billed entirely at standard prices.

When available is false the price fields are zero. Never show list prices next to an unavailable offer.

Fields in the 200 response
  • available boolean

    Available is false once the offer has been redeemed by this workspace, its owner, the owner's email, this card or this Stripe customer, once the workspace has any non-failed done-for-you order, for a sub-workspace, for a workspace that never verified a card on a trial or has negotiated prices, and when its Stripe subscription already carries a discount on these charges, is not monthly, or already bills mailboxes.

    Example: true
  • domainPriceCents integer

    DomainPriceCents is the one-time price of the first .com domain.

    Example: 1000
  • dueNowCents integer

    DueNowCents is what one domain plus the full complement of offer mailboxes is charged when the order is placed: the domain and one whole month of each mailbox. A customer who chooses fewer than MaxMailboxes pays for the ones they chose.

    Example: 2200
  • mailboxMonthlyPriceCents integer

    MailboxMonthlyPriceCents is what each offer mailbox costs for its FIRST MONTH. From the second month it bills the standard monthly price.

    Example: 400
  • maxMailboxes integer

    MaxMailboxes is the most mailboxes the offer covers. An order with more, or with mailboxes on another domain, is billed at standard prices.

    Example: 3
  • setupWaived boolean

    SetupWaived reports that the per-mailbox setup fee is not charged on the offer mailboxes.

    Example: true

Request

curl -X GET "https://api.emailchaser.com/r/dfy/intro-offer" \
  -H "Authorization: Bearer $EMAILCHASER_API_KEY"

Response

{
  "available": true,
  "domainPriceCents": 1000,
  "dueNowCents": 2200,
  "mailboxMonthlyPriceCents": 400,
  "maxMailboxes": 3,
  "setupWaived": true
}

List done-for-you orders

get https://api.emailchaser.com/r/dfy/orders
Works with a read-only key

Lists the workspace's done-for-you orders, newest first. Each order carries the same fields as GET /dfy/orders/{id}: status, cost breakdown and the caller-supplied order shape; internal billing and provider sub-records are never exposed.

  • limit integer in query

    Page size (default 50, max 200)

  • page integer in query

    Page number, 1-based (default 1)

Fields in the 200 response
  • orders array of DfyOrderResponse
    11 fields inside orders
    • completedAt string

      CompletedAt is when the order completed (RFC3339), or null.

      Example: 2026-07-01T10:35:00Z
    • cost_breakdown object
    • createdAt string
      Example: 2026-07-01T10:30:00Z
    • domains object
    • externalOrderId string
      Example: cmr_order_456
    • failureReason string
    • forwardingDomain object
    • id integer
      Example: 9
    • mailboxes object
    • processedAt string

      ProcessedAt is when the order started processing (RFC3339), or null.

      Example: 2026-07-01T10:30:00Z
    • status string

      Status is one of: created, pending_approval, processing, completed, failed, partially_completed, canceled.

      Example: created
  • total integer
    Example: 3

Request

curl -X GET "https://api.emailchaser.com/r/dfy/orders" \
  -H "Authorization: Bearer $EMAILCHASER_API_KEY"

Response

{
  "orders": [
    {
      "completedAt": "2026-07-01T10:35:00Z",
      "cost_breakdown": null,
      "createdAt": "2026-07-01T10:30:00Z",
      "domains": null,
      "externalOrderId": "cmr_order_456",
      "failureReason": "string",
      "forwardingDomain": null,
      "id": 9,
      "mailboxes": null,
      "processedAt": "2026-07-01T10:30:00Z",
      "status": "created"
    }
  ],
  "total": 3
}

Create a done-for-you order

post https://api.emailchaser.com/r/dfy/orders

Orders domains and pre-warmed mailboxes for the caller's workspace. The order is accepted and provisioned asynchronously; poll GET /dfy/orders/{id} for progress.

This call buys domains and charges the card, and it can take longer than the connection is held open — a timeout or a 502 does NOT mean the order failed. Send an Idempotency-Key header and repeat the identical request to find out: a repeat of a key that already placed an order returns that order instead of buying anything again. Reuse the key to retry safely; use a NEW key only when you intend a genuinely different order.

Without a key the order is still checked against the workspace's live orders, and one that would buy a domain or a mailbox address already bought is refused with 409 and the id of the order that has it.

  • Idempotency-Key string in header

    Repeat this key to retry the same order safely (max 255 characters)

  • domains array of DfyDomainInput
    1 field inside domains
    • domainName string required
      Example: acme-mail.com
  • forwardingDomain string

    ForwardingDomain is where the purchased domains redirect visitors.

    Example: acme.com
  • mailboxes array of DfyMailboxInput
    5 fields inside mailboxes
    • domainName string required
      Example: acme-mail.com
    • firstName string required
      Example: John
    • lastName string required
      Example: Doe
    • profilePicture string
    • username string required
      Example: john
Fields in the 202 response
  • 11 fields inside order
    • completedAt string

      CompletedAt is when the order completed (RFC3339), or null.

      Example: 2026-07-01T10:35:00Z
    • cost_breakdown object
    • createdAt string
      Example: 2026-07-01T10:30:00Z
    • domains object
    • externalOrderId string
      Example: cmr_order_456
    • failureReason string
    • forwardingDomain object
    • id integer
      Example: 9
    • mailboxes object
    • processedAt string

      ProcessedAt is when the order started processing (RFC3339), or null.

      Example: 2026-07-01T10:30:00Z
    • status string

      Status is one of: created, pending_approval, processing, completed, failed, partially_completed, canceled.

      Example: created

Request

curl -X POST "https://api.emailchaser.com/r/dfy/orders" \
  -H "Authorization: Bearer $EMAILCHASER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "domains": [
    {
      "domainName": "acme-mail.com"
    }
  ],
  "forwardingDomain": "acme.com",
  "mailboxes": [
    {
      "domainName": "acme-mail.com",
      "firstName": "John",
      "lastName": "Doe",
      "profilePicture": "string",
      "username": "john"
    }
  ]
}'

Response

{
  "order": {
    "completedAt": "2026-07-01T10:35:00Z",
    "cost_breakdown": null,
    "createdAt": "2026-07-01T10:30:00Z",
    "domains": null,
    "externalOrderId": "cmr_order_456",
    "failureReason": "string",
    "forwardingDomain": null,
    "id": 9,
    "mailboxes": null,
    "processedAt": "2026-07-01T10:30:00Z",
    "status": "created"
  }
}

Get a done-for-you order

get https://api.emailchaser.com/r/dfy/orders/{id}
Works with a read-only key

Returns one order. Orders belonging to other workspaces are reported as not found.

  • id integer required in path

    Order ID

Fields in the 200 response
  • 11 fields inside order
    • completedAt string

      CompletedAt is when the order completed (RFC3339), or null.

      Example: 2026-07-01T10:35:00Z
    • cost_breakdown object
    • createdAt string
      Example: 2026-07-01T10:30:00Z
    • domains object
    • externalOrderId string
      Example: cmr_order_456
    • failureReason string
    • forwardingDomain object
    • id integer
      Example: 9
    • mailboxes object
    • processedAt string

      ProcessedAt is when the order started processing (RFC3339), or null.

      Example: 2026-07-01T10:30:00Z
    • status string

      Status is one of: created, pending_approval, processing, completed, failed, partially_completed, canceled.

      Example: created

Request

curl -X GET "https://api.emailchaser.com/r/dfy/orders/123" \
  -H "Authorization: Bearer $EMAILCHASER_API_KEY"

Response

{
  "order": {
    "completedAt": "2026-07-01T10:35:00Z",
    "cost_breakdown": null,
    "createdAt": "2026-07-01T10:30:00Z",
    "domains": null,
    "externalOrderId": "cmr_order_456",
    "failureReason": "string",
    "forwardingDomain": null,
    "id": 9,
    "mailboxes": null,
    "processedAt": "2026-07-01T10:30:00Z",
    "status": "created"
  }
}

Generated from the Emailchaser API's own OpenAPI definition, so it always matches the running API.