Search availability, list your registered domains, and reassign domains between clients.
List TLD prices
Returns pricing for every zone you can sell across your connected registrar accounts. Each row includes the price and zone metadata — classification, tier, abuse posture, and verification requirements.
Modes
mode=best(default) — one row per TLD with the cheapest register-1Y price across your providers.mode=all— one row per (TLD × provider account), for comparing prices across accounts.
Filtering
tlds— comma-separated list, max 50. Example:tlds=com,net,io.registrars— comma-separated provider types. Example:registrars=SPACESHIP,DYNADOT.
Zone metadata fields
Every price row includes these classification fields from the TLD registry:
tldType — zone classification:
| Value | Meaning | Examples |
|---|---|---|
generic | Classic gTLDs | .com, .net, .org, .info |
new_generic | New gTLDs | .app, .dev, .xyz, .club, .shop |
country | Country-code TLD | .de, .cn, .uk, .jp, .ru |
country_second | Second-level under ccTLD | .co.uk, .com.au, .com.br, .ac.nz |
regional | Multi-country regional | .eu, .asia, .africa |
sponsored | Restricted-purpose gTLD | .edu, .gov, .museum, .aero |
idn | Internationalized domain | .닷넷, .公司, .中国, .рф |
tldTier — zone level:
| Value | Meaning | Examples |
|---|---|---|
1 | Top-level (directly under root) | .com, .de, .xyz |
2 | Second-level (under a ccTLD) | .co.uk, .com.au, .com.br |
abuseResistant — true if the zone is known for tolerating abuse (slow or no takedowns). abuseNote gives a human-readable reason.
Disclaimer: abuse tolerance data is approximate and may be outdated. Registries change their enforcement posture over time — a TLD marked tolerant today may tighten enforcement tomorrow (and vice versa). This field is based on community reports and public research, not official registry statements. Do not treat it as legal advice or a guarantee. Always verify the current abuse policy of a specific registry before relying on it for operational decisions.
Categories:
| Category | Examples | Notes |
|---|---|---|
| Island ccTLDs | .to, .cc, .ws, .pw, .cx, .nu | Tiny registries, minimal enforcement |
| African ccTLDs | .cf, .ga, .gq, .ml, .cd, .so | No abuse infrastructure |
| Offshore/privacy | .is, .li, .im, .gg, .je, .bz | Slow abuse response |
| Post-Soviet | .su, .ru | Don't cooperate with Western takedowns |
Note on cheap new gTLDs (.xyz, .top, .icu, .cyou, .cfd, .lol, etc.): these are not abuse-resistant — the opposite. They are heavily abused due to low prices, but Spamhaus and other blocklists detect them immediately on first complaint. Domains on these zones get blocked faster than on any other TLD. They are not flagged as
abuseResistantin this API.
Sources used for abuse tolerance classification:
| Source | What it covers |
|---|---|
| Spamhaus — The World's Most Abused TLDs | Quarterly ranking of TLDs by phishing/spam volume |
| ICANN DAAR | Monthly reports on security threats per TLD |
| Interisle Consulting — Phishing Landscape | Annual analysis of phishing domains by TLD |
| DomainTools | Research on abuse rates across new and legacy TLDs |
| Netcraft — Cybercrime Survey | Hosting/domain infrastructure used in phishing and fraud |
| APWG — Phishing Activity Trends | Anti-Phishing Working Group quarterly statistics |
| NamePros / DomainGang | Anecdotal reports from domain reseller communities |
verificationType — what kind of registration verification the registry requires:
| Value | Meaning | Affected zones |
|---|---|---|
standard | Normal WHOIS contact data is enough | ~1250 zones (vast majority) |
cnnic | CNNIC .CN Audit — Chinese ID or business license | .cn, .com.cn, .net.cn, regional .cn zones |
cnnic_idn | CNNIC IDN Audit — Chinese entity verification | .公司, .网络, .中国, .商城, .在线, etc. |
eu_presence | EU/EEA citizenship or business establishment | .eu |
local_presence | Local address, ID, or entity required | .au, .de, .fr, .it, .es, .us, .ca, .jp, .kr, .br, .ru, etc. |
restricted | Access limited to specific entity types | .bank, .insurance (financial), .edu (school), .gov/.mil (government) |
verificationStandard is a shortcut boolean: true when verificationType === "standard", false otherwise. Use it to quickly filter zones your clients can register without extra paperwork.
Examples
Code
query Parameters
modeAggregation mode. best returns one cheapest row per TLD; all returns one row per (TLD × your provider account).
tldsComma-separated list of TLDs to filter to (max 50). Example: tlds=com,net,io. Omit for the full catalog.
registrarsComma-separated list of registrar types to restrict the query to.
typeFilter by zone type. Only return zones matching this classification.
tierFilter by zone tier. 1 = top-level (.com, .de), 2 = second-level (.co.uk, .com.au).
abuseFilter by abuse tolerance. true = only abuse-resistant zones, false = only non-tolerant zones.
verificationFilter by verification type. standard = zones where normal WHOIS contacts are enough. Other values return only zones requiring that specific verification process.
List TLD prices › Responses
List of TLD prices with zone metadata.
successList your domains
Returns a paginated list of domains owned by clients under your account.
query Parameters
limitItems per page (1–100)
offsetSkip N items
qSearch by domain name
clientIdFilter by client ID — only return domains owned by this client
verificationFilter by WHOIS verification state.
required— verification is required by registry but not yet verifiedverified— verification is required and the contact passed itunverified— verification is required and contact has not yet completed itnot_required— registry doesn't require verification for this TLD
List your domains › Responses
List of domains
successSearch domain availability
Check availability and pricing for up to 35 domains at once against a specific registrar.
Registrar-specific limits
- Spaceship applies its own rolling cap of 30 search requests per 30 seconds per reseller account, and it's enforced server-side by Spaceship — not by Most. The limit is scoped to search/availability only; registrations, NS updates and other write operations are not counted. If you need high search throughput on Spaceship you have to split load across multiple accounts. See the registrar peculiarities page for the full list of Spaceship quirks.
Search domain availability › Request Body
domainsList of fully-qualified domain names to check
registrarRegistrar to check against
Search domain availability › Responses
Availability and pricing results
successReassign domain to another client
Transfer ownership of a domain to a different client. The domain's contacts (registrant/admin/tech/billing) are automatically remapped to the target client's contacts by type.
The target client must have at least a REGISTRANT contact before a domain can be assigned. Missing admin/tech/billing contacts fall back to the registrant.
path Parameters
idDomain ID (not the domain name)
Reassign domain to another client › Responses
Domain reassigned
successBulk renew domains
Get EPP/transfer code for one domain
Fetch the EPP (auth-info) / transfer code for a single domain synchronously — no task is created.
Registrars differ in how they expose the code:
- API-source registrars (e.g. Dynadot, GName, Spaceship) return the code in the
authInfofield of the response. For GName, Most internally creates atranoutrecord and immediately reads the code off it — the API-level call requires a non-emptysm(reason) field which Most defaults to"Customer requested transfer-out". - Email-source registrars (e.g. Webnic) only send the code to the registrant's email on file. In that case
authInfoisnullandrecipientis the email address that received it.
Use the source field to branch your UI:
source | Meaning |
|---|---|
api | The code is in authInfo; surface it to the user. |
email | An email was sent; show recipient and instruct the user to check their inbox. |
sent | The registrar triggered an email but the recipient is unknown (rare). |
Side effects (best-effort, non-blocking)
A successful fetch also performs two preparation steps so the code is immediately usable for a transfer-out. Failures of either step are logged but do not fail the request — the auth code is still returned.
-
Contact sync. The registrar-side WHOIS is brought in line with the local
Contactrows referenced by the domain (registrant / admin / tech / billing). Missing remote contacts are created via the registrar'screateContactendpoint; the four roles are then pushed with one bulk replace call. If the WHOIS is already aligned, no replace is issued. This matters because the gaining registrar uses the registrant email for transfer confirmation — a stale email silently sinks the transfer. -
Transfer-lock clear. For Dynadot and Webnic the registry lock is dropped so the auth code can be handed off immediately. For NICENIC and GName (no programmatic unlock) the lock is left unchanged.
ICANN 60-day transfer lock
Independent of all of the above, ICANN policy forbids transferring a domain out within the first 60 days of registration. Registrars enforce this on their side — GName specifically returns a clean Sorry, The domain registration time is YYYY-MM-DD ..., less than 60 days, it can not be transferred to another registrar message. Most surfaces the registrar's reason verbatim.
For bulk operations across multiple domains, use POST /domains/auth-info instead, which queues an async task and applies the same side effects per item.
path Parameters
idDomain ID (not the domain name)
Get EPP/transfer code for one domain › Responses
Auth-info fetched
successBulk fetch EPP/auth codes
Fetch EPP (auth-info) codes for up to 25 domains at once. Creates an async task — track progress and read the codes via GET /tasks/{id}.
Each item's auth code lands in the task's result[i].data once complete:
Code
For email-source registrars (Webnic) authInfo is null and recipient is the email address the code was sent to.
Side effects per item (best-effort, non-blocking)
For each domain in the batch the worker performs two preparation steps so the returned code is immediately usable for a transfer-out. Failures of either step are logged but do not mark the item as failed.
-
Contact sync. The registrar-side WHOIS is brought in line with the local
Contactrows for that domain (registrant / admin / tech / billing). Missing remote contacts are created on the fly; the four roles are then pushed with one bulk replace call. Already-aligned WHOIS triggers no replace. -
Transfer-lock clear. Dropped automatically for Dynadot and Webnic; left unchanged for NICENIC and GName (no programmatic toggle exposed by their APIs).
For a single domain you can use the synchronous GET /domains/{id}/auth-info instead, which skips the task system and applies the same side effects.
Bulk fetch EPP/auth codes › Responses
Task accepted. Poll GET /tasks/{id} until done: true to read each domain's auth code from result[].data.
successMigrate domains into Most
Import up to 25 domains that already exist on your registrar account into Most's management. The API kicks off one async migration per item and returns the migration ids immediately — poll GET /domains/migrations/{id} for each one to follow the pipeline.
Optional registrarId (auto-detect)
Each item must carry clientId and domainName; registrarId is optional. When omitted, Most fans out a getDomainInfo call to every connected, active provider account in parallel and uses the first one that confirms it owns the domain. The response's autoDetected: true flag marks items resolved that way, and the chosen registrarId is echoed back.
If the scan finds nothing (the domain isn't on any of your connected accounts), the item goes into failures[] with an explanation rather than spawning a doomed migration. Real per-provider scan errors (rate-limit hits, network issues) are listed under failures[].scanErrors for debugging — surfacing them helps tell "not found anywhere" apart from "GName was throttled mid-scan".
If you already know the registrarId, pass it explicitly: it skips the lookup (and dodges per-registrar rate limits — see Registrar peculiarities).
Migration ≠ transfer-in
This endpoint does not trigger an ICANN registry transfer-in. The domain stays at its current registrar; what changes is who manages it inside Most:
- the four ICANN WHOIS contacts on the domain get rebound to the local
Contactrows of the targetClient; - (Webnic only) the domain is relocated under our managed registrant tenant so future API operations route through the connected credentials;
- the local
ClientDomainrow is created inMIGRATIONstate and flips toACTIVEonce the pipeline finishes.
Use this when:
- you already own the domain at a registrar Most supports, and you want Most to take over its WHOIS / NS / renewal lifecycle;
- you registered the domain outside Most (panel UI, CLI, partner) and need to reflect that in our DB.
Do not use this for fresh registrations (use POST /domains/orders instead) or for moving a domain between registrars (no API endpoint yet — open a ticket if needed).
Pipeline steps
The worker walks each migration through these steps, exposed verbatim in the step field of GET /domains/migrations/{id}:
step | What's happening |
|---|---|
QUEUED | Migration row created, waiting for the worker to pick it up. |
ENSURING_PROFILE | Worker is creating/ensuring the four WHOIS contacts (registrant / admin / tech / billing) on the registrar account — one createContact call per role unless the binding already exists from an earlier migration. |
FETCHING_DOMAIN | Pulling the domain's current state from the registrar (getDomainInfo) to determine which contacts and tenant it currently lives under. |
REPLACING_CONTACTS | Rebinding the domain's four ICANN roles to our newly-created contact IDs. Skipped if all four roles already match. Per-registrar shapes: Webnic uses a bulk endpoint; Dynadot, Spaceship, NICENIC, GName loop a per-domain call. |
RELOCATING_REGISTRANT | (Webnic only) Moves the domain into the registrant-tenant we created for this Client. No-op on registrars without the tenant concept. |
FINALIZING | Re-reads the domain's authoritative state and writes it into the local ClientDomain row — expiry, registered-at, nameservers, contact bindings. |
DONE | Pipeline finished; the ClientDomain.status is now ACTIVE. |
Failures at any step move the migration into FAILED with a human-readable errorMessage and leave the partial state for inspection. Use POST /domains/migrations/{id}/retry to resume — the worker continues from the last completed step, not from scratch.
Per-registrar caveats
- Webnic — fully supported including registrant-tenant relocation (uniqueness rule: one tenant per Client × Provider, auto-created during
ENSURING_PROFILEwith the Client's login as the registrant username hint). - Dynadot / Spaceship / NICENIC — no tenant concept; the migration stops after
REPLACING_CONTACTS. WHOIS is rebound but the registrar's internal owner record (where applicable) isn't. - GName — single template per domain (one WHOIS shared across all four roles); the worker creates a fresh template from the Client's REGISTRANT contact and rebinds the domain via
/api/domain/contact(async, ~30–120 s to actually apply registry-side; the worker polls).
Migrate domains into Most › Responses
Migrations queued. Poll each migrationId via GET /domains/migrations/{id}.
successFind which connected provider owns a domain
Scan every active provider account the caller has connected and return the one that already owns the supplied domain. Useful as a separate diagnostic step ahead of POST /domains/migrate when you want to inspect the result before kicking off async work — migrate does the same lookup internally when registrarId is omitted.
Per-provider behaviour
The scan calls each adapter's getDomainInfo in parallel (concurrency 4 by default so the stricter registrars don't choke). Clean "domain not in this account" responses are treated as expected and silently dropped. Anything else (rate-limit hit, auth error, network blip) shows up in the errors[] field so callers can tell a true miss apart from a partial scan.
Watch the per-registrar quirks from Registrar peculiarities — in particular GName's /api/domain/info shares the same 1 RPS throttle as /api/domain/check, so don't fire this in a tight loop across many domains at once.
Find which connected provider owns a domain › Request Body
domainNameFully-qualified domain name to look up.
Find which connected provider owns a domain › Responses
Scan result. provider is null if no connected account claimed ownership.
successGet migration status
Returns the live state of one migration. The step field tells you exactly where the worker currently is in the pipeline (see POST /domains/migrate for the full step ladder).
Poll this endpoint until status reaches a terminal state (COMPLETED or FAILED). Typical end-to-end runtime is 5–30 seconds on Dynadot / Spaceship / NICENIC, 30 s – 2 min on Webnic (the bulk-replace endpoint is queue-backed registry-side), 1–5 min on GName (their contact rebind is async by spec).
If status === "FAILED", errorMessage carries the failure reason verbatim from the registrar. Use POST /domains/migrations/{id}/retry once the cause is fixed.
path Parameters
idMigration ID returned by POST /domains/migrate.
Get migration status › Responses
Migration snapshot.
successRetry a failed migration
Re-queues a FAILED migration without recreating the row. The worker resumes from the last successful step instead of restarting from QUEUED, so contact creation that already succeeded isn't repeated.
The call fails with 409 CONFLICT if the migration is already RUNNING or COMPLETED. Successful retry flips the underlying ClientDomain back into MIGRATION state, resets errorMessage, and publishes the worker trigger.
path Parameters
idMigration ID.
Retry a failed migration › Responses
Re-queued. Poll GET /domains/migrations/{id} to watch the new run.