Integrate SignalSumo's SEO data directly into your own tools, dashboards, and workflows.
API access is available on the Pro and Agency plans. Manage your keys and see your current plan at signalsumo.com/api-keys.
- Quickstart
- Overview
- Authentication
- Plans & Billing
- Locations & Languages
- Error Codes
- Endpoints
- Changelog
Three steps to your first response.
1. Create an API key. On a Pro or Agency plan, generate a key at signalsumo.com/api-keys and copy it — it's shown only once.
2. Verify the connection:
curl -H "Authorization: Bearer ss_live_your_key_here" \
"https://signalsumo.com/api/v1/usage"A 200 response with your plan and remaining calls means you're connected.
3. Make your first data call:
curl -X POST \
-H "Authorization: Bearer ss_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"keyword":"seo audit tool","limit":5}' \
"https://signalsumo.com/api/v1/keyword-research"That's it — every endpoint uses the same Authorization: Bearer header and returns the same JSON envelope. Runnable scripts for each endpoint live in examples/curl.
All endpoints are served under:
https://signalsumo.com/api/v1/
Requests and responses use JSON. Every successful response follows the same envelope:
{
"success": true,
"data": { ... },
"meta": { "timestamp": "2026-06-26T10:00:00+00:00" }
}Errors follow the same shape with success: false and an error object instead of data.
Pass your API key in the Authorization header on every request:
Authorization: Bearer ss_live_your_key_here
Alternatively, you may pass it as a query parameter (not recommended for production):
GET /api/v1/usage?api_key=ss_live_your_key_here
Generating a key — Create and manage your API keys at signalsumo.com/api-keys. Each key is shown only once at creation time (format:
ss_live_followed by 40 hex characters) — store it securely. Afterward, only a masked prefix is ever displayed again.
The API also sends permissive CORS headers, so it can be called from browser-based tools. Keep secret keys server-side in production.
API access is available on the Pro and Agency plans. Two independent meters govern usage — a call is only served when both allow it.
Every request (including cache hits and errors that reach an endpoint) counts as one API call.
| Plan | Monthly API calls | Resets |
|---|---|---|
| Pro | 20 | 1st of each month |
| Agency | 100 | 1st of each month |
Exceeding this returns HTTP 429 (RATE_LIMITED) with a resets_at field in meta. Check your live limit and usage any time via GET /usage. This is a monthly call-count ceiling, not a per-second/per-minute rate limiter.
Beyond the call meter, the data endpoints each draw from their own monthly feature quota (the same allowance your logged-in dashboard uses). Behavior when that quota is exhausted:
| Endpoint | When feature quota is exhausted |
|---|---|
/keyword-research |
Returns 429 QUOTA_EXCEEDED. Never spends credits — safe to loop. |
/backlinks |
Falls back to 1 credit per request. A deep query (page > 1 or limit > 100) always costs 1 credit. No credits → 402 PAYMENT_REQUIRED. |
/site-audit |
Returns 429 QUOTA_EXCEEDED when the monthly crawl count or the rolling page budget is used up. |
Cache hits cost no feature quota. Results are cached and shared with your dashboard, so a domain or keyword looked up recently returns instantly, marked "cached": true in meta, drawing no feature quota or credits (it still counts as one API call).
/keyword-research accepts a location_code and language_code to localize results. Both are optional — the defaults are the United States (2840) and English (en).
A numeric market code. Common values:
| Code | Market | Code | Market |
|---|---|---|---|
| 2840 | United States | 2276 | Germany |
| 2826 | United Kingdom | 2250 | France |
| 2124 | Canada | 2724 | Spain |
| 2036 | Australia | 2380 | Italy |
| 2356 | India | 2528 | Netherlands |
| 2392 | Japan | 2076 | Brazil |
Over 90 markets are supported. An unrecognized code falls back to the United States.
A two-letter language code. Supported values:
| Code | Language | Code | Language |
|---|---|---|---|
| en | English | pt | Portuguese |
| es | Spanish | nl | Dutch |
| fr | French | ru | Russian |
| de | German | ja | Japanese |
| it | Italian | zh | Chinese |
⚠️ Only the languages listed above are supported. Any otherlanguage_codefalls back to English rather than returning an error — so double-check the code if results look unexpectedly English.
| HTTP | code | Meaning |
|---|---|---|
| 400 | BAD_REQUEST |
Malformed request syntax |
| 401 | UNAUTHORIZED |
Missing or invalid API key |
| 402 | PAYMENT_REQUIRED |
Feature quota exhausted and no credits remaining (backlinks) |
| 403 | FORBIDDEN |
API access not available on your plan (Pro or Agency required) |
| 404 | NOT_FOUND |
Endpoint or resource not found |
| 422 | VALIDATION_ERROR |
Required parameter missing or invalid value |
| 429 | RATE_LIMITED / QUOTA_EXCEEDED |
Monthly call limit or feature quota hit — see resets_at in meta |
| 502 | UPSTREAM_ERROR |
No data returned by the upstream data provider |
| 500 | SERVER_ERROR |
Internal error — safe to retry |
Returns your API quota usage for the current calendar month.
Example Request
curl -H "Authorization: Bearer ss_live_xxxx" \
"https://signalsumo.com/api/v1/usage"Example Response
{
"success": true,
"data": {
"plan": "agency",
"api_calls_used": 42,
"api_calls_limit": 100,
"unlimited": false,
"resets_at": "2026-08-01"
},
"meta": {
"timestamp": "2026-06-26T10:00:00+00:00",
"key_name": "Production App"
}
}Returns a domain's backlink profile: a summary overview, distribution insights, and an enriched list of individual backlinks. Results are cached and shared with your dashboard (Pro: 2 days, Agency: 7 days); a cache hit is marked "cached": true and costs no feature quota.
The same data powers the Backlink Checker in the app — the cache is shared, so a domain you have already looked at there returns instantly here.
💰 A standard request draws your monthly backlink-search quota (then 1 credit if that's exhausted). A deep request —
page > 1orlimit > 100— always costs 1 credit. See Plans & Billing.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
domain |
string | Yes | Root domain, e.g. example.com (a full URL is also accepted and normalized) |
page |
integer | No | Page number, default 1 |
limit |
integer | No | Results per page, 1–200, default 100 |
Example Request
curl -H "Authorization: Bearer ss_live_xxxx" \
"https://signalsumo.com/api/v1/backlinks?domain=example.com&limit=2"Example Response
{
"success": true,
"data": {
"domain": "example.com",
"total_backlinks": 48210,
"referring_domains": 1824,
"page": 1,
"limit": 2,
"overview": {
"domain_rank": 71,
"total_backlinks": 48210,
"referring_domains": 1824,
"referring_domains_nofollow": 640,
"referring_main_domains": 1610,
"referring_pages": 39044,
"referring_ips": 1502,
"referring_subnets": 1210,
"dofollow_backlinks": 1184,
"broken_backlinks": 220,
"broken_pages": 96,
"spam_score": 8,
"first_seen": "2018-05-11 09:20:00",
"lost_date": null
},
"insights": {
"referring_links_types": { "anchor": 30140, "image": 9800 },
"referring_links_attributes": { "noopener": 12000, "nofollow": 8400 },
"referring_links_platform_types": { "blogs": 900, "cms": 640, "news": 210 },
"referring_links_tld": { "com": 1200, "org": 180 },
"referring_links_countries": { "US": 800, "GB": 210 },
"referring_subnets": 1210,
"referring_main_domains": 1610
},
"backlinks": [
{
"domain_from": "blog.example-news.com",
"url_from": "https://blog.example-news.com/best-seo-tools",
"url_to": "https://example.com/",
"anchor": "SignalSumo",
"dofollow": 1,
"spam_score": 4,
"first_seen": "2021-03-10 12:00:00",
"last_seen": "2026-06-20 04:00:00",
"semantic_location": "article",
"platform_type": "blogs",
"country": "US",
"is_broken": 0,
"domain_from_rank": 62,
"page_from_rank": 41,
"is_lost": 0,
"lost_date": null,
"is_new": 0,
"item_type": "anchor",
"page_from_title": "The Best SEO Tools in 2026",
"page_from_status_code": 200,
"url_to_status_code": 200,
"domain_from_ip": "192.0.2.10",
"tld_from": "com",
"links_count": 2,
"is_indirect_link": 0,
"url_from_https": 1,
"attributes": ["noopener"],
"text_pre": "we recommend",
"text_post": "for site audits",
"kw_top3": 4,
"kw_top10": 12,
"kw_top100": 88
}
]
},
"meta": { "timestamp": "2026-06-26T10:00:00+00:00", "cached": false }
}Backlink Fields
| Field | Description |
|---|---|
domain_from / url_from |
The linking site and the exact page the link is on |
url_to |
The page on your domain being linked to |
anchor |
Anchor text of the link |
dofollow |
1 = dofollow, 0 = nofollow |
spam_score |
Spam score of the linking page (0–100) |
domain_from_rank / page_from_rank |
Authority of the linking domain / page, normalized 0–100 |
is_new / is_lost / is_broken |
Link lifecycle flags (1/0) |
first_seen / last_seen / lost_date |
When the link was first seen, last seen, and (if applicable) lost |
platform_type / country / tld_from |
Linking site's platform, country, and TLD |
item_type |
Link form: anchor, image, redirect, … |
page_from_status_code / url_to_status_code |
HTTP status of the linking page / the linked page |
attributes |
Link rel attributes, e.g. ["noopener","nofollow"] |
kw_top3 / kw_top10 / kw_top100 |
Keywords the linking page ranks for in the top 3 / 10 / 100 |
Returns a full metric set for a seed keyword — search volume, CPC, competition, difficulty, search intent, a 12-month volume trend, SERP features and more — plus a ranked list of related keywords carrying the same fields. Synchronous — responds immediately.
These are the same metrics the Keyword Research Tool shows, and once you have picked keywords worth pursuing the Rank Tracker monitors their positions daily.
🛡️ This endpoint draws your monthly keyword-search quota and never spends credits: once the quota is used up it returns
429 QUOTA_EXCEEDED, so it's safe to call in a loop. Recent lookups are served from cache (marked"cached": true) at no quota cost.
Request Body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
keyword |
string | Yes | Seed keyword, max 200 chars |
location_code |
integer | No | Market code, default 2840 (US) — see Locations & Languages |
language_code |
string | No | Two-letter language code, default en |
limit |
integer | No | Max related keywords returned, 1–100, default 10 |
Example Request
curl -X POST \
-H "Authorization: Bearer ss_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"keyword":"seo audit tool","limit":5}' \
"https://signalsumo.com/api/v1/keyword-research"Example Response
{
"success": true,
"data": {
"keyword": "seo audit tool",
"location_code": 2840,
"language_code": "en",
"total_count": 80,
"overview": {
"search_volume": 2900,
"cpc": 19.07,
"competition": 0.11,
"competition_level": "LOW",
"difficulty": 77,
"intent": ["Commercial"],
"trend": [ { "y": 2026, "m": 5, "v": 2400 }, { "y": 2026, "m": 6, "v": 1600 } ],
"serp_features": ["organic"],
"growth": { "m": -33, "q": -16, "y": -64 },
"bid_low": 4.72,
"bid_high": 19.10,
"avg_backlinks": 5087,
"avg_ref_domains": 970,
"comp_domain_rank": 486,
"se_results": 41000000
},
"related_keywords": [
{
"keyword": "free seo audit tool",
"search_volume": 1900,
"cpc": 3.10,
"competition": 0.68,
"competition_level": "MEDIUM",
"difficulty": 54,
"intent": ["Commercial", "Transactional"],
"trend": [ { "y": 2026, "m": 6, "v": 1900 } ],
"serp_features": ["organic", "people_also_ask"],
"growth": { "m": 4, "q": -2, "y": 11 },
"bid_low": 1.20,
"bid_high": 4.90,
"avg_backlinks": 210,
"avg_ref_domains": 88,
"comp_domain_rank": 402,
"se_results": 12000000,
"related": ["website audit tool", "seo checker free"],
"match_bucket": "similar"
}
]
},
"meta": { "timestamp": "2026-06-26T10:00:00+00:00" }
}Keyword Fields
The overview (seed keyword) and every related_keywords row share these fields. Any field may be null when the data is unavailable.
| Field | Description |
|---|---|
search_volume |
Average monthly searches |
cpc |
Average cost-per-click (USD) |
competition |
Paid competition, 0–1 |
competition_level |
LOW / MEDIUM / HIGH |
difficulty |
Organic ranking difficulty, 0–100 (null if not yet computed) |
intent |
Search intent, e.g. ["Commercial"] |
trend |
12-month volume history — { y, m, v } per month |
growth |
Volume change %: m monthly, q quarterly, y yearly |
serp_features |
SERP feature types present, e.g. ["organic","people_also_ask"] |
bid_low / bid_high |
Top-of-page bid range (USD) |
avg_backlinks / avg_ref_domains |
Average backlinks / referring domains of the pages ranking now |
comp_domain_rank |
Average authority (0–1000) of the pages ranking now |
se_results |
Total competing results for the keyword |
related |
Up to 8 related sub-keywords (related rows only) |
match_bucket |
Relation to the seed: similar, related, or question |
Runs the same crawl as the Website Audit Tool — broken links, redirect chains, missing titles and canonical problems, page by page.
⏱ Site audits are asynchronous. This endpoint returns a
job_idimmediately. PollGET /api/v1/jobs/{job_id}for results. Typical crawl time: 1–5 minutes.
Request Body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
url |
string | Yes | Full URL to crawl, e.g. https://example.com |
max_pages |
integer | No | Max pages to crawl (default 100). Capped by your plan's per-crawl limit and your remaining monthly page budget. |
depth |
integer | No | Crawl depth, 1–5, default 3 |
Example Request
curl -X POST \
-H "Authorization: Bearer ss_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","max_pages":50}' \
"https://signalsumo.com/api/v1/site-audit"Response (202 Accepted)
{
"success": true,
"job_id": "a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5",
"status": "queued",
"poll": "https://signalsumo.com/api/v1/jobs/a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5",
"meta": { "timestamp": "2026-06-26T10:00:00+00:00" }
}Poll the status of an async job. Poll every 10–15 seconds until status is complete or failed.
Status Values
| Status | Meaning |
|---|---|
queued |
Job accepted, not yet started |
running |
Crawl in progress — check progress (0–100) |
complete |
Done — data field contains results |
failed |
Crawl failed — error field has the reason |
Example Request
curl -H "Authorization: Bearer ss_live_xxxx" \
"https://signalsumo.com/api/v1/jobs/a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5"Response — Running
{
"success": true,
"data": {
"job_id": "a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5",
"endpoint": "site-audit",
"status": "running",
"progress": 42,
"created_at": "2026-06-26 10:00:00",
"updated_at": "2026-06-26 10:01:30",
"completed_at": null
},
"meta": { "timestamp": "2026-06-26T10:01:30+00:00" }
}Response — Complete
{
"success": true,
"data": {
"job_id": "a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5",
"endpoint": "site-audit",
"status": "complete",
"progress": 100,
"created_at": "2026-06-26 10:00:00",
"updated_at": "2026-06-26 10:03:18",
"completed_at": "2026-06-26 10:03:18",
"data": {
"audit_id": "AUDIT-A1B2C3-4567",
"domain": "https://example.com",
"pages_crawled": 47,
"total_score": 78,
"geo_score": 71,
"issues": { "critical": 3, "warning": 12, "total": 15 },
"report_url": "https://signalsumo.com/report?id=AUDIT-A1B2C3-4567"
}
},
"meta": { "timestamp": "2026-06-26T10:03:18+00:00" }
}See CHANGELOG.md.
Questions? Email hello@signalsumo.com, or open an issue in this repository.
Manage your API keys: signalsumo.com/api-keys · Compare plans: signalsumo.com/pricing