Last updated: September 2026
Search the UpSnatch domain catalog from your own scripts, or let Claude, Cursor, 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.
MCP server at https://api.upsnatch.com/mcp for AI agents such as Claude Code, Cursor, and VS Code.
Both use the same API key and share the same limits. 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.
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 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 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.
URL: https://api.upsnatch.com/mcp (Streamable HTTP)
Auth: Authorization: Bearer header with your API key
Tools: search_classic (the search endpoint above) and get_domain (single lookup). Both are read-only.
Store the key in an environment variable called UPSNATCH_API_KEY instead of pasting it into a config file you might share.
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}"
}
}
}
}claude mcp add --transport http upsnatch https://api.upsnatch.com/mcp \
--header "Authorization: Bearer $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}"
}
}
}
}Any MCP client that supports Streamable HTTP with a custom header works. Clients that only connect through an OAuth sign-in, such as ChatGPT connectors, are not supported yet.
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".
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.