Unique Signals
Documentation

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

  1. Create an account and upgrade to Pro to enable API and MCP access.
  2. Mint an API key in Settings → API keys. Keys are shown only once.
  3. Make your first request:
    curl "https://app.uniquesignals.ai/v1/businesses?country=US&region=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.

50 requests / month

Pro

Full REST API + MCP server access. Required for any /v1/* call and for connecting Claude Desktop, Claude Code, or any other MCP client.

500 requests / month

Quota-free calls

  • whoami— check plan, limit, and usage.
  • discover_status and discover_cancel — poll or cancel an in-flight discover job.
  • Fetching a signed results_url returned by search_businesses, find_nearby_businesses, batch_business_emails, or discover_start. The originating tool bills once; later reads of the URL are free until expires_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 signed results_url has expired. Call the originating tool again to mint a fresh URL.
  • 429 Too Many Requests— monthly quota exhausted. The window resets 30 days after your period_start (visible in whoami).
  • 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

Parameter
Type
Description
search
string
Free text search on name
category
string
Category (plumbing, restaurant, real_estate_agent)
isic_code
string
ISIC code or prefix (4322, 68)
country
string
2-letter country code (US, DE, GB)
region
string
Reliable for US 2-letter state codes (FL, TX, CA). For non-US, use lat/lng + radius_km instead.
locality
string
City name
postcode
string
Postal code
has_website
boolean
Filter by website presence
has_phone
boolean
Filter by phone presence
has_email
boolean
Filter by email presence
lat
number
Center latitude
lng
number
Center longitude
radius_km
number
Radius in km
min_confidence
number
Minimum confidence 0-1
limit
integer
Results per page (default 100, max 500)
cursor
string
Pagination cursor

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

Parameter
Type
Description
lat
number
Latitude (required)
lng
number
Longitude (required)
radius_km
number
Radius in km (default 5, max 100)
category
string
Category filter
isic_code
string
ISIC code filter
limit
integer
Max results (default 100, max 500)

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

Parameter
Type
Description
search
string
Search by email address
business_id
string
Filter by business
limit
integer
Max results

Example

curl "https://app.uniquesignals.ai/v1/emails" \
  -H "Authorization: Bearer YOUR_API_KEY"

GET /v1/categories

List available business categories.

Parameters

Parameter
Type
Description
search
string
Filter categories by name

Example

curl "https://app.uniquesignals.ai/v1/categories" \
  -H "Authorization: Bearer YOUR_API_KEY"

GET /v1/isic-categories

List ISIC industry classification codes.

Parameters

Parameter
Type
Description
search
string
Filter by keyword
parent_code
string
List children of a code

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&region=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&region=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

  1. Open Settings → Connectors → Add custom connector.
  2. Name: Unique Signals
  3. Remote MCP server URL: https://app.uniquesignals.ai/mcp
  4. 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.
  5. Unblock the domain— in Claude Desktop, go to Settings → Capabilities and add app.uniquesignals.ai to 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.

  • whoami quota-free
  • search_businesses
  • find_nearby_businesses
  • count_businesses
  • get_business
  • get_business_emails
  • list_categories
  • list_isic_categories
  • batch_business_emails
  • discover_start
  • discover_status quota-free
  • discover_cancel quota-free