Last updated: October 2026
Search the UpSnatch domain catalog from your own scripts, or let Claude, ChatGPT, Cursor, Windsurf, Claude Code, Gemini CLI, Codex CLI, VS Code, and other AI agents search it for you.
The UpSnatch API gives you the same catalog as Classic Search in the app: expired, dropped, pending-delete, auction, and marketplace domains with SEO metrics such as Majestic Trust Flow and Citation Flow, backlinks, referring domains, Ahrefs DR, age, and price.
REST API at https://api.upsnatch.com for scripts, spreadsheets, and CRMs. Auth is an API key.
MCP at https://api.upsnatch.com/mcp for AI agents. Claude and ChatGPT sign in with OAuth; Cursor, Windsurf, Claude Code, Gemini CLI, Codex CLI, and VS Code use an API key.
REST and MCP share the same rate limits and row quota. API access is included in all paid plans. Explorer comes with 1,000 result rows per week so you can try it in your own tools; Pro and Agency have daily allowances for real workloads.
What the API covers today
Keyword and metric search (Classic Search) and single-domain lookups. Magic Search, Local Search, and Projects are not available through the API yet.
HTTP endpoints for your own code. Base URL: https://api.upsnatch.com. Every request uses a Bearer API key from Settings, API access.
Open Settings, API access in the app and generate a key. It starts with ups_live_ and is shown only once.
Send it as a Bearer token:
curl -X POST "https://api.upsnatch.com/v1/search/classic?page=1&page_size=25" \
-H "Authorization: Bearer $UPSNATCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"keyword": "coffee", "tlds": ["com"], "minTrustFlow": 10}'The response contains one page of domains plus pagination fields:
{
"results": [
{
"domain": "coffeeandbooks.com",
"tld": "com",
"type": "MARKETPLACE",
"available": true,
"provider": "nameshift",
"price": 14995,
"currency": "USD",
"trustFlow": 16,
"citationFlow": 11,
"tfCfRatio": 1.45,
"backlinks": 46,
"referringDomains": 29,
"ahrefsDr": 4,
"score": 75,
"spamRisk": "low",
"purchaseUrl": "https://app.upsnatch.com/go/coffeeandbooks.com"
}
],
"page": 1,
"page_size": 25,
"returned": 25,
"total": 98,
"has_more": true
}Every REST request needs your key in the Authorization header: Authorization: Bearer ups_live_…. Each account has one key. Generating a new key replaces the old one immediately.
Keep your key secret
Call the API from your own server, scripts, or local tools only. Never put the key in browser JavaScript, mobile apps, or public repositories: anyone who can read it can use your quota. If a key leaks, generate a new one in Settings and the old key stops working right away.
The key follows your subscription. If a payment fails or the subscription ends, requests return 403 subscription_inactive, and the same key works again as soon as the subscription is active.
POST /v1/search/classic?page=1&page_size=25
Send filters as a JSON body. At least one selective filter is required: a keyword of 2 or more characters, tlds, listingTypes, a price range, or a min… metric above 0. Unknown fields are rejected, so a typo never silently widens your search.
| Field | Meaning |
|---|---|
keyword | Word or phrase the name must contain. Plurals are matched too. Up to 100 characters. |
listingTypes | Any of AUCTION, DROPPED, MARKETPLACE, PENDING_DELETE. |
tlds | Extensions without the dot, for example ["com", "nl"]. Up to 50. |
marketTlds | Only names whose label is also registered as a site on these extensions. |
minTrustFlow, minCitationFlow | Minimum Majestic Trust Flow and Citation Flow (0 to 100). |
minTfCfRatio | Minimum Trust Flow divided by Citation Flow, for example 0.5. |
minBacklinks, minRefDomains | Minimum backlinks and referring domains. |
minAhrefsDr | Minimum Ahrefs Domain Rating (0 to 100). |
minIndexed, minPageviews | Minimum indexed URLs and pageviews. |
minValuation | Minimum estimated value in USD. |
priceFrom, priceTo | Price range in USD. |
minBids | Minimum number of auction bids. |
availability | today or thisweek: auctions ending in that window. |
minAge | Minimum domain age in years. |
minLength, maxLength | Length of the name without the extension. |
minSegments | Minimum number of words in the name. |
language | Language of the name, for example en, nl, de. |
excludeAdult | Hide adult names. Defaults to true. |
excludeHyphens | Hide names with hyphens. |
numbersMode | ANY, NO_DIGITS, or DIGITS_ONLY. |
page starts at 1. page_size defaults to 25 and goes up to 50 on Pro and 100 on Agency. Keep requesting the next page while has_more is true. page × page_size may not exceed 2,000 on Pro or 5,000 on Agency; narrow your filters to reach results beyond that.
GET /v1/domains/{domain}
curl "https://api.upsnatch.com/v1/domains/coffeeandbooks.com" \
-H "Authorization: Bearer $UPSNATCH_API_KEY"Returns the same fields as a search result, or 404 not_found when the domain is not in the catalog. Unlike search, a lookup can also return listings that were sold or auctions that ended; check available. Internationalized names can be sent in Unicode or punycode.
Fields without data are null.
| Field | Meaning |
|---|---|
domain, tld | The name and its extension. |
type | AUCTION, DROPPED, MARKETPLACE, or PENDING_DELETE. |
available | Whether the listing can still be bought: marketplace listing not sold, auction not ended, dropped domain not registered again. |
provider | Auction or marketplace platform, for example godaddy. null for dropped domains. |
price, currency | Current price or bid, always in USD. |
numberOfBids, auctionEndTime | Auction bid count and end time (ISO 8601). null for other types. |
trustFlow, citationFlow, tfCfRatio | Majestic metrics and their ratio. |
backlinks, referringDomains, ahrefsDr | Link metrics. UpSnatch's own enrichment is used first, the platform's data otherwise. |
domainAge, indexedURLs, domainLength | Age in years, indexed URLs, and length of the name. |
score | UpSnatch quality score from 0 to 100. Spam is not part of the score; check spamRisk alongside it. |
spamRisk | low, medium, high, or unknown when there is not enough link data. |
availabilityStatus, availabilityCheckedAt | Last registration check for dropped domains. |
purchaseUrl | Link to buy or bid on the domain. Use this link rather than building marketplace URLs yourself. null when the domain is no longer available. |
See Metrics and quality signals for how to read these numbers.
REST calls and MCP tool calls count against the same limits.
| Limit | Explorer | Pro | Agency |
|---|---|---|---|
| Requests per minute | 30 | 30 | 90 |
| Requests per hour | 200 | 600 | 2,000 |
| Result rows | 1,000 per week | 20,000 per day | 50,000 per day |
| Requests at the same time | 1 | 1 | 2 |
| Maximum page size | 50 | 50 | 100 |
| Maximum depth (page × page_size) | 1,000 | 2,000 | 5,000 |
Every search counts as one request plus the number of rows it returns. A domain lookup counts as one request and no rows. Responses include X-RateLimit-Limit, X-RateLimit-Remaining, X-RowQuota-Limit, and X-RowQuota-Remaining headers so you can pace your script. Daily allowances reset at 00:00 UTC; the Explorer weekly allowance resets on Monday at 00:00 UTC.
Use the API for your own research and tooling. Bulk-copying or redistributing the catalog to rebuild a competing dataset is not allowed under our Terms of Use; we may revoke keys when we detect abuse.
Errors are JSON with an error code and a readable message.
| Status and code | What to do |
|---|---|
400 validation_error | Fix the request. details lists each field with an issue such as unknown_field or out_of_range. |
401 unauthorized | The key is missing, wrong, or was replaced by a newer one. |
403 forbidden | Your plan does not include API access. |
403 subscription_inactive | The subscription ended or a payment failed. The key works again once the subscription is active. |
404 not_found | The domain is not in the catalog, or the path does not exist. |
429 rate_limited | Wait retry_after_seconds (also in the Retry-After header). class says which limit you hit: rate, row_quota, or concurrent. |
503 service_busy | Search capacity is briefly exhausted. Retry after a few seconds. |
502 search_failed | Temporary problem on our side. Retry later. |
Validation errors are checked before any quota is used, except when no selective filter was given.
The full machine-readable description is at api.upsnatch.com/openapi.yaml (OpenAPI 3.0). Import it into Postman, Insomnia, or a code generator to get a typed client.
The MCP server lets an AI agent search UpSnatch for you. Ask it things like "find .com auctions ending this week about coffee with Trust Flow above 15" and it picks the filters itself from the tool schema.
URL: https://api.upsnatch.com/mcp (Streamable HTTP)
Tools: search_classic and get_domain. Both are read-only and map to the REST endpoints above.
How you connect depends on the product:
Claude connector (claude.ai / Claude desktop): sign in with UpSnatch (OAuth). No API key.
ChatGPT plugin: add a custom MCP server, then sign in with UpSnatch (OAuth). No API key.
Developer tools (API key): Cursor, Windsurf, Claude Code, Gemini CLI, Codex CLI, and VS Code. Claude Code is Anthropic's CLI, not the Claude chat connector above.
Other tools and IDEs: any MCP client that can call a remote HTTP server with a Bearer header.
Agents and quota
Agents tend to search again and again. Every tool call uses the same quota as a REST call, so ask for small pages and specific filters, for example "10 results" rather than "everything".
Add UpSnatch as a custom connector in Claude (web or desktop). You sign in with your UpSnatch account via the browser; Claude never sees an API key.
In Claude, open Settings, then Connectors (wording can vary slightly between web and desktop).
Add a custom connector. Use this MCP URL:
https://api.upsnatch.com/mcpComplete the UpSnatch sign-in and click Allow access on the consent screen. Your plan must include API access (Explorer or higher).
Back in Claude, confirm the connector shows tools such as Search expired domains and Get domain details.
In a chat, ask something concrete, for example: search expired domains with coffee, .com only, with some backlinks. Approve the tool call when Claude asks.
Claude Free allows one custom connector at a time. Disconnect another connector first if you need the slot. For Anthropic's terminal CLI, see Claude Code under developer tools instead.
In ChatGPT you add a custom MCP server; ChatGPT saves it as a plugin. Auth is OAuth (sign in with UpSnatch). Availability depends on your OpenAI plan: Business and Enterprise have full custom MCP; some Pro accounts can connect read-only MCP servers. Use ChatGPT on the web.
Open Plugins (or Apps), then Add custom MCP server.
Name it UpSnatch. Under Connection, choose Server URL and enter:
https://api.upsnatch.com/mcpSet Authentication to OAuth. Leave Dynamic Client Registration (DCR) as discovered; ChatGPT should find https://auth.upsnatch.com automatically.
Accept the risk warning, choose Create as a plugin, then complete UpSnatch sign-in and Allow access.
Install or enable the plugin. In a new chat, type @UpSnatch (or select the plugin) and try: search expired domains with coffee and some backlinks only .com and .net.
If you do not see Add custom MCP server, your ChatGPT plan or workspace role does not allow custom MCP plugins yet.
These tools send your UpSnatch API key as Authorization: Bearer ups_live_…. Create a key under Settings, API access. Prefer an environment variable called UPSNATCH_API_KEY over pasting the key into a shared config file.
Covered here: Cursor, Windsurf, Claude Code, Gemini CLI, Codex CLI, and VS Code.
Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:
{
"mcpServers": {
"upsnatch": {
"url": "https://api.upsnatch.com/mcp",
"headers": {
"Authorization": "Bearer ${env:UPSNATCH_API_KEY}"
}
}
}
}Windsurf Cascade reads ~/.codeium/windsurf/mcp_config.json (open it from Cascade → MCP). Use serverUrl, not url:
{
"mcpServers": {
"upsnatch": {
"serverUrl": "https://api.upsnatch.com/mcp",
"headers": {
"Authorization": "Bearer ${env:UPSNATCH_API_KEY}"
}
}
}
}Anthropic's CLI (not the Claude chat connector). Add the server with your API key:
claude mcp add --transport http upsnatch https://api.upsnatch.com/mcp \
--header "Authorization: Bearer $UPSNATCH_API_KEY"Google's Gemini CLI. Prefer httpUrl for Streamable HTTP (plain url is for SSE). Either add via CLI:
gemini mcp add --transport http upsnatch https://api.upsnatch.com/mcp \
--header "Authorization: Bearer $UPSNATCH_API_KEY"Or put this under mcpServers in ~/.gemini/settings.json:
{
"mcpServers": {
"upsnatch": {
"httpUrl": "https://api.upsnatch.com/mcp",
"headers": {
"Authorization": "Bearer $UPSNATCH_API_KEY"
}
}
}
}OpenAI's Codex CLI (terminal coding agent; for ChatGPT chat see ChatGPT plugin). Add a remote server, then put the raw key (without Bearer) in the env var:
codex mcp add upsnatch \
--url https://api.upsnatch.com/mcp \
--bearer-token-env-var UPSNATCH_API_KEY
export UPSNATCH_API_KEY='ups_live_…'Or in ~/.codex/config.toml:
[mcp_servers.upsnatch]
url = "https://api.upsnatch.com/mcp"
bearer_token_env_var = "UPSNATCH_API_KEY"Add this to .vscode/mcp.json. VS Code asks for the key once and stores it securely:
{
"inputs": [
{
"type": "promptString",
"id": "upsnatch-key",
"description": "UpSnatch API key",
"password": true
}
],
"servers": {
"upsnatch": {
"type": "http",
"url": "https://api.upsnatch.com/mcp",
"headers": {
"Authorization": "Bearer ${input:upsnatch-key}"
}
}
}
}UpSnatch MCP is a standard Streamable HTTP server. It works with any client that can call https://api.upsnatch.com/mcp over HTTPS and authenticate with either:
Authorization: Bearer ups_live_… (API key), or
OAuth, when the client supports an MCP connector / sign-in flow
That includes Cline, Roo Code, Continue, Goose, Warp, JetBrains AI, LibreChat, and other MCP hosts, not only the apps with copy-paste configs above. They all get the same search_classic and get_domain tools.
If the product offers an OAuth or "sign in with UpSnatch" connector flow, prefer that over pasting an API key. Otherwise create a key under Settings, API access and follow the client's docs for remote MCP + custom headers. Watch the URL field name: some clients use url, Windsurf uses serverUrl, and Gemini CLI uses httpUrl.