Authentication
Send your API key as a Bearer token. Create and manage keys in your account settings — the full key is shown only once at creation, so store it securely.
Authorization: Bearer dpk_live_<selector>_<secret>
Keys look like dpk_<env>_<selector>_<secret>, where env is live or test.
A logged-in browser session can call the same endpoints; session-authenticated writes additionally require an X-CSRF-Token header. Bearer-token requests do not.
Scopes & rate limits
Every key carries a set of scopes. A call must be made with a key that holds the endpoint's scope. Rate limits are applied per scope, per key.
| Scope | Grants | Rate limit | Tier |
|---|---|---|---|
domain.check |
Check a single .pay domain — availability + pricing | 50/sec | Public |
catalog.search |
AI keyword search against the curated catalog | 30/min | Public |
orders.read |
List + read the account's own orders | 60/min | Public |
orders.write |
Create a pre-order against a saved payment method | 10/min | Public |
payment_methods.read |
List saved cards (Stripe payment methods) | 20/min | Public |
payment_methods.write |
Add (SetupIntent) + remove saved cards | 20/min | Public |
account.read |
Read account profile: email, role, vip_tier, granted scopes | 60/min | Public |
webhooks.read |
List configured webhook endpoints | 20/min | Public |
webhooks.write |
Create + delete webhook endpoints | 10/min | Public |
zone_file.download |
Download the full daily .pay DNS zone-file snapshot | 24/day | Restricted |
premium.list |
Paginated registry premium catalogue (incl. reserved/blocked) | 60/min | Restricted |
registered.list |
Paginated registered .pay names (from the DNS zone file) + AI brand context | 60/min | Restricted |
Restricted scopes are double-gated: a key may list the scope, but calls only succeed once an admin has granted it to your account. Apply from your account settings.
Supported domain zones
One account and one API key work across every zone below — the base URL you call selects the zone.
.pay |
https://domain.pay/api/v1 |
.latino |
https://domain.latino/api/v1 |
.dot |
https://domain.dot/api/v1 |
Quickstart
Two quick calls to get started:
# Check a name
curl -s https://domain.latino/api/v1/check-domain \
-H "Authorization: Bearer dpk_live_…" \
-H "Content-Type: application/json" \
-d '{"domain":"acme.latino"}'
# Who am I + what can I do
curl -s https://domain.latino/api/v1/account \
-H "Authorization: Bearer dpk_live_…"
Endpoints
All endpoints are live. Request and response schemas, parameters and status codes are fully described in the OpenAPI document.
Account
| GET | /account |
account.read |
Your profile + the scopes effective for this key. |
Domains
| POST | /check-domain |
domain.check |
Availability + pricing for one name in a supported zone. Fast DB-only lookup (no live registry call) — POST /orders re-verifies live. |
Catalog
| POST | /catalog/search |
catalog.search |
Keyword search over the curated catalogue. |
Orders
| GET | /orders |
orders.read |
List your orders, newest first. |
| GET | /orders/{id} |
orders.read |
One order + its customer message thread. |
| POST | /orders |
orders.write |
Create a pre-order + charge a saved card (send an Idempotency-Key). |
Payment methods
| GET | /account/payment-methods |
payment_methods.read |
List saved cards. |
| POST | /account/payment-methods |
payment_methods.write |
Start a Stripe SetupIntent to add a card. |
| DELETE | /account/payment-methods/{id} |
payment_methods.write |
Remove a saved card. |
Webhooks
| GET | /webhooks |
webhooks.read |
List webhook endpoints. |
| POST | /webhooks |
webhooks.write |
Register an endpoint (signing secret shown once). |
| DELETE | /webhooks/{id} |
webhooks.write |
Delete an endpoint. |
Restricted
| GET | /zone-file |
zone_file.download |
Daily DNS zone-file snapshot for the zone of the host you call. |
| GET | /premium |
premium.list |
Registry premium catalogue. |
| GET | /registered |
registered.list |
Registered names in the called zone + AI brand context. |
For the complete request/response contract, import the OpenAPI spec: Download OpenAPI (JSON).
Webhooks
Register an HTTPS endpoint and we push signed events as they happen. The signing secret is shown once at creation.
| Event | Description |
|---|---|
order.created | A new order (pre-order) was created on the account |
order.status_changed | An order changed payment status |
payment.succeeded | A payment for an order succeeded |
payment.failed | A payment for an order failed or was canceled |
payment.refunded | A charge for an order was refunded |
appraisal.completed | A domain appraisal for an order finished |
We POST the event envelope as JSON:
{
"id": "evt_…",
"event": "payment.succeeded",
"created": "2026-05-28T12:00:00+00:00",
"data": { "order": { … } }
}
Verify every delivery by recomputing the HMAC-SHA256 over the raw request body with your signing secret and comparing in constant time:
X-Domain-Pay-Signature: sha256=<HMAC_SHA256(raw_body, signing_secret)>
Non-2xx responses (or timeouts) are retried with exponential backoff (1 min to 24 h) up to 6 attempts. After 5 consecutive dead deliveries the endpoint is auto-disabled and the owner is alerted.
Errors
All errors share one shape. The request_id is echoed on every error — quote it in support requests.
{ "error": "scope_required", "message": "…", "request_id": "req_ab12…", "scope": "orders.read" }
| HTTP | error | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed or missing parameters. |
| 401 | unauthorized / invalid_key | No or invalid credential. |
| 402 | card_declined / authentication_required | Payment failed or needs SCA. |
| 403 | scope_required | The key lacks the endpoint's scope. |
| 403 | access_not_granted | Restricted scope not yet approved for this account. |
| 403 | csrf_required | Session write without a valid X-CSRF-Token. |
| 404 | not_found | No such endpoint or resource. |
| 405 | method_not_allowed | Wrong HTTP verb. |
| 409 | request_in_progress | An idempotency key's first request is still in flight. |
| 422 | idempotency_key_reused | Same idempotency key, different parameters. |
| 422 | contact_incomplete | GA zones: add a registrant contact under /account/contacts first. |
| 423 | account_locked | Account is locked — contact support. |
| 429 | rate_limited | Slow down; see the Retry-After header. |
| 500 | server_error | Our fault. |
Restricted access
The zone-file, premium and registered endpoints need an approved grant in addition to the scope:
- Create (or already have) an API key listing the restricted scope.
- In your account settings, open Restricted API access, pick the scope, and explain how you'll use the data.
- Our team reviews and emails you a decision.
- Once approved, any key on your account that lists that scope can use it immediately. No paid tier — approval is per account.