Unique Signals API
Search and enrich the global business index over HTTPS, or connect any MCP-capable client (Claude Desktop, Claude Code, ChatGPT custom connectors) and let an LLM use the tools on your behalf.
Quickstart
- Create an account and upgrade to Pro to enable API and MCP access.
- Mint an API key in Settings → API keys. Keys are shown only once.
- Make your first request:
curl "https://app.uniquesignals.ai/v1/businesses?country=US®ion=FL&limit=5" \ -H "Authorization: Bearer YOUR_API_KEY"
Authentication
All API requests require a Bearer token. Pass your API key in the Authorization header:
curl "https://app.uniquesignals.ai/v1/businesses?region=FL&limit=5" \ -H "Authorization: Bearer YOUR_API_KEY"
Create, regenerate, and revoke keys in Settings → API keys. Keys are shown only once at creation; store them securely.
Rate limits
Each plan includes a monthly request quota on a rolling 30-day window. Every REST call and every MCP tool call counts as one request, except for the quota-free ones listed below.
Free
Dashboard chat-based search only. The REST API and the MCP server are not available on the Free plan.
Pro
Full REST API + MCP server access. Required for any /v1/* call and for connecting Claude Desktop, Claude Code, or any other MCP client.
Quota-free calls
whoami— check plan, limit, and usage.discover_statusanddiscover_cancel— poll or cancel an in-flight discover job.- Fetching a signed
results_urlreturned bysearch_businesses,find_nearby_businesses,batch_business_emails, ordiscover_start. The originating tool bills once; later reads of the URL are free untilexpires_at.
Timeouts
Individual calls are capped at a 90-second upstream timeout; slower queries return a 504 instead of hanging.
Errors
401 Unauthorized— missing, invalid, or expired bearer token.403 Forbidden— you are on the Free plan and the endpoint requires Pro.404 Not Found— the resource (business, discover job) does not exist or has expired.410 Gone— a signedresults_urlhas expired. Call the originating tool again to mint a fresh URL.429 Too Many Requests— monthly quota exhausted. The window resets 30 days after yourperiod_start(visible inwhoami).504 Gateway Timeout— the upstream took longer than 90s. Narrow the filters (add country/region) and retry.
Endpoints
GET /v1/businesses
Search businesses with filters.
Parameters
Example
curl "https://app.uniquesignals.ai/v1/businesses" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/businesses/count
Count businesses matching filters (same params as search, no limit/cursor).
Example
curl "https://app.uniquesignals.ai/v1/businesses/count" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/businesses/nearby
Find businesses near coordinates.
Parameters
Example
curl "https://app.uniquesignals.ai/v1/businesses/nearby" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/businesses/{id}
Get full business details including linked emails, site metadata, and keywords.
Example
curl "https://app.uniquesignals.ai/v1/businesses/BUSINESS_UUID" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/businesses/{id}/emails
Get all enriched email addresses for a business.
Example
curl "https://app.uniquesignals.ai/v1/businesses/BUSINESS_UUID/emails" \ -H "Authorization: Bearer YOUR_API_KEY"
POST /v1/businesses/batch/emails
Get emails for multiple businesses at once.
Request body
{"business_ids": ["uuid1", "uuid2", ...]}Example
curl "https://app.uniquesignals.ai/v1/businesses/batch/emails" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/businesses/cell/{h3_index}
Find businesses in a specific H3 cell.
Example
curl "https://app.uniquesignals.ai/v1/businesses/cell/H3_INDEX" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/emails
Search emails across all businesses.
Parameters
Example
curl "https://app.uniquesignals.ai/v1/emails" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/categories
List available business categories.
Parameters
Example
curl "https://app.uniquesignals.ai/v1/categories" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/isic-categories
List ISIC industry classification codes.
Parameters
Example
curl "https://app.uniquesignals.ai/v1/isic-categories" \ -H "Authorization: Bearer YOUR_API_KEY"
POST /v1/discover
Start an async discovery job that combines indexed records with freshly fetched data. Counts +1 against quota. Returns a job_id and a signed results_url to poll (polling is quota-free).
Request body
{"query": "specialty coffee shops", "city": "Warsaw", "country": "PL", "widen": false, "freshness_days": 30}Example
curl "https://app.uniquesignals.ai/v1/discover" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /v1/discover/{job_id}
Poll a discover job. Quota-free. Returns status (queued, running_index_lookup, running_web_fetch, completed, failed, cancelled), progress_pct, and once completed, a results array. Prefer fetching the signed results_url returned by /v1/discover instead — it serves the same payload without an API key.
Example
curl "https://app.uniquesignals.ai/v1/discover/JOB_UUID" \ -H "Authorization: Bearer YOUR_API_KEY"
DELETE /v1/discover/{job_id}
Cancel an in-flight discover job. Quota-free.
Example
curl "https://app.uniquesignals.ai/v1/discover/JOB_UUID" \ -H "Authorization: Bearer YOUR_API_KEY"
Python
Using httpx or requests.
import httpx
API_KEY = "us_..."
BASE = "https://app.uniquesignals.ai"
resp = httpx.get(
f"{BASE}/v1/businesses",
params={
"country": "US",
"region": "FL",
"category": "plumbing",
"has_email": True,
"limit": 100,
},
headers={"Authorization": f"Bearer {API_KEY}"},
)
for biz in resp.json()["items"]:
print(f'{biz["name"]} | {biz.get("locality")} | {biz.get("emails")}')JavaScript
Works in Node, browsers, and edge runtimes.
const API_KEY = "us_...";
const BASE = "https://app.uniquesignals.ai";
const resp = await fetch(
`${BASE}/v1/businesses?country=US®ion=FL&category=plumbing&has_email=true&limit=100`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
const { items } = await resp.json();
items.forEach((biz) => console.log(biz.name, biz.emails));cURL
curl "https://app.uniquesignals.ai/v1/businesses?country=US®ion=FL&limit=5" \ -H "Authorization: Bearer YOUR_API_KEY"
MCP server
Use Unique Signals as a tool in Claude Desktop, Claude Code, or any MCP-compatible client. The server lives at https://app.uniquesignals.ai/mcp and supports OAuth 2.1 + Dynamic Client Registration, so most clients connect with just the URL.
Claude Desktop
- Open Settings → Connectors → Add custom connector.
- Name: Unique Signals
- Remote MCP server URL:
https://app.uniquesignals.ai/mcp - Click Add. A browser tab opens at
https://app.uniquesignals.ai/authorize— sign in if needed, then click Authorize. The tab redirects back and the connector turns on. No keys to paste. - Unblock the domain— in Claude Desktop, go to Settings → Capabilities and add
app.uniquesignals.aito the network allowlist. Claude can then fetch the full dataset and work with it for you (filter, export to a spreadsheet, etc.).
Claude Code
claude mcp add uniquesignals --transport http https://app.uniquesignals.ai/mcp -h "Authorization: Bearer us_YOUR_KEY"
Claude Code does not support OAuth connectors yet, so paste an API key from Settings → API keys.
Any MCP client
https://app.uniquesignals.ai/mcp
Streamable HTTP transport. The server advertises OAuth 2.1 + Dynamic Client Registration via the standard discovery endpoints (/.well-known/oauth-protected-resource, /.well-known/oauth-authorization-server), so any spec-compliant client can connect with just the URL. Clients that don’t support OAuth can pass an API key as a Bearer token in the Authorization header.
Fallback: manual config file
If the “Add custom connector” UI isn’t available in your Claude Desktop version, paste this into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on your OS. Requires Node.js for the mcp-remote bridge.
{
"mcpServers": {
"uniquesignals": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://app.uniquesignals.ai/mcp",
"--header",
"Authorization: Bearer us_YOUR_KEY"
]
}
}
}Available tools
Tools marked quota-free do not count against your monthly request limit.
whoamiquota-freesearch_businessesfind_nearby_businessescount_businessesget_businessget_business_emailslist_categorieslist_isic_categoriesbatch_business_emailsdiscover_startdiscover_statusquota-freediscover_cancelquota-free