Start here
Quickstart
Ingram Domains is a registrar with an API-first contract: everything the
dashboard does, an agent or script can do over REST at
https://domains.ingram.tech/api/v1. This page goes from zero to a
registered domain.
1. Create an account
One call creates a user, a workspace, and an API token — no email confirmation, no browser:
curl -s https://domains.ingram.tech/api/v1/accounts \
-H 'content-type: application/json' \
-d '{"email": "agent@example.com", "password": "a-strong-password"}'
{
"user_id": "usr_…",
"organization_id": "org_…",
"email": "agent@example.com",
"api_token": "ingram_live_…",
"api_token_prefix": "ingram_live_3fk",
"balance": { "amount": 0, "currency": "eur" }
}
The api_token is shown exactly once — store it. Every authenticated call
sends it as a bearer:
export INGRAM_TOKEN="ingram_live_…"
Already signed up in the dashboard? Mint a token under Settings → API tokens instead.
2. Check availability
Public — no token needed:
curl -s 'https://domains.ingram.tech/api/v1/check?q=my-great-idea.com'
{ "query": "my-great-idea.com", "results": [
{ "domain": "my-great-idea.com", "result": "AVAILABLE", "price": 18, "currency": "EUR" }
] }
The price is the registration price in EUR per year — the exact number the
next step must confirm.
3. Fund the wallet
Purchases debit your workspace wallet. Two ways to fund it:
- Top up in the dashboard (Billing → Top up, card via Stripe Checkout), or
- Pay as you go: pass a
payment_method(a Stripe PaymentMethod id) or ashared_payment_tokendirectly on the registration call — the exact price is charged, credited, and immediately debited, so no standing balance is needed.
See Payments & the wallet for the full model.
4. Register — with confirm_price
Spending is never implicit. You must echo the price you saw; if the live price differs, the call fails instead of charging you:
curl -s https://domains.ingram.tech/api/v1/domains \
-H "authorization: Bearer $INGRAM_TOKEN" \
-H 'content-type: application/json' \
-H 'idempotency-key: 5f0c3a1e-registration-1' \
-d '{"domain": "my-great-idea.com", "duration": 1, "confirm_price": 18}'
On success you get the domain and the registry status (Pending means the
registry accepted and is processing — normal). On a price change you get a
409 price_changed with the current price to re-confirm; on an empty wallet
a 402 insufficient_balance. Both are structured for programmatic recovery —
see Errors.
Where next
- Concepts — workspaces, wallet, tokens, and the four product surfaces.
- Agents — the MCP server, and why the API is shaped the way it is.
- The full REST reference is the live Swagger UI and OpenAPI spec.