SEO Domain Endpoints
All four operations are part of All tools. A start
needs the relevant scope and enough credits, and the tool must be available in
/v1/health. Free credits also follow the
free limits. Accepted starts return 202 Accepted.
All four endpoints are preview, with paid and bounded free access:
- Domain overview: authority, backlink summary, estimated organic traffic and keyword count.
- Backlinks: single backlinks, or one row per linking domain.
- Keywords a domain ranks for: up to 1,000 Google keywords with position, ranking URL, volume, CPC, difficulty and estimated traffic.
- Search traffic of a domain: current estimated Google traffic and up to 24 months of monthly history.
POST/v1/seo/domains/overview
Returns a bounded domain intelligence snapshot: authority, referring-domain and backlink summaries, estimated organic traffic and ranking keyword count, top anchors, top pages, competitor hints, freshness, availability, and confidence.
Required Access
- Access: Paid plans that include this family, or free credits (guest trial or verified account) within the free limits.
- Operation family: SEO
- Scope:
api:seo:read - Credits: 35 credits reserved on acceptance
- Idempotency:
Idempotency-Keyheader required
Request
curl -X POST https://www.chab.ai/v1/seo/domains/overview \
-H "Authorization: Bearer CHAB_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: domain-overview-001" \
-d '{"domain":"example.com","include_subdomains":false,"location":{"country":"US"},"language":"en-US"}'
{
"domain": "example.com",
"include_subdomains": false,
"location": {
"country": "US"
},
"language": "en-US"
}
Fields:
domain: required hostname or HTTPS URL. Chab normalizes any accepted host to the registrable domain, such asexample.co.uk. HTTPS URL paths becomepath_scopewhenpath_scopeis omitted.include_subdomains: optional boolean, defaultfalse.path_scope: optional path beginning with/or a same-domain HTTPS URL. The normalized prefix is capped at 512 characters.location.country: optional ISO 3166-1 alpha-2 country code. It picks the Google market for the organic traffic and keyword count, the US when omitted. Backlink coverage is global.language: optional BCP 47 language tag. It picks the market language for the organic traffic and keyword count, the country's main language when omitted. It does not narrow backlink coverage.callback_url,callback_secret,callback_events, andcallback_notify_on_expiration: optional one-off operation callback fields.
Unknown fields are rejected. filters, sort, limit, output_format, and
artifact/output-mode fields are not accepted on this endpoint.
Async Response
{
"operation": {
"id": "op_01JZ7H0A1B2C3D4E5F6G7H8J9K",
"status": "queued",
"operation_key": "seo.domains.overview",
"family": "seo",
"status_url": "/v1/operations/op_01JZ7H0A1B2C3D4E5F6G7H8J9K",
"result_url": "/v1/operations/op_01JZ7H0A1B2C3D4E5F6G7H8J9K/result",
"estimated_credits": 35,
"result_available": false,
"warnings": []
},
"meta": {
"request_id": "req_123",
"credits": {
"estimated": 35,
"reserved": 35,
"currency": "credit"
}
}
}
Succeeded Status
GET /v1/operations/{id} returns the operation status. Domain operations are
asynchronous Chab operations; there is no public provider task handle.
Result
GET /v1/operations/{id}/result returns a compact inline result:
{
"data": {
"result": {
"domain": "example.com",
"include_subdomains": false,
"path_scope": null,
"location": {
"country": "US"
},
"language": "en-US",
"fetched_at": "2026-06-29T12:00:05+00:00",
"authority": {
"score": 73
},
"visibility": {
"organic_keywords": 4210,
"organic_traffic": 18450,
"indexed_pages": null
},
"referring_domains": {
"total": 38,
"main_domains": 31,
"follow": 26,
"nofollow": 12
},
"backlinks": {
"total": 120,
"follow": 84,
"nofollow": 36,
"broken": 3,
"spam_score": 2,
"first_seen": "2025-01-01T00:00:00+00:00",
"last_seen": "2026-06-20T00:00:00+00:00"
},
"top_anchors": [],
"top_pages": [],
"competitors": [],
"availability": {
"authority.score": "available",
"visibility.organic_keywords": "available",
"visibility.organic_traffic": "available",
"visibility.indexed_pages": "unavailable"
},
"confidence": {
"score": 1,
"availability": "available",
"source": "chab"
},
"complete": true
},
"artifacts": [],
"warnings": [],
"result_expires_at": "2026-07-02T12:00:05+00:00"
},
"meta": {
"request_id": "req_123"
}
}
Top anchors, top pages, and competitor hints are each capped at 10 rows.
visibility.organic_traffic is the estimated monthly organic Google visits and
visibility.organic_keywords the number of keywords the domain ranks for, in
the requested market. indexed_pages is not part of this dataset and stays
null. A metric that could not be read is null with unavailable
availability; missing metrics are never converted to numeric zero.
POST/v1/seo/domains/backlinks
Returns backlink rows and referring-domain aggregates for a normalized domain.
Small result sets stay inline. Larger result sets are exported as protected
JSONL operation artifacts. With group: "referring_domains" it returns one row
per linking domain instead, every row inline up to limit.
Required Access
- Access: Paid plans that include this family, or free credits (guest trial or verified account) within the free limits.
- Operation family: SEO
- Scope:
api:seo:read - Credits: 40 credits reserved on acceptance, for either group
- Idempotency:
Idempotency-Keyheader required
Request
curl -X POST https://www.chab.ai/v1/seo/domains/backlinks \
-H "Authorization: Bearer CHAB_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: domain-backlinks-001" \
-d '{"domain":"example.com","include_subdomains":false,"limit":100,"filters":{"status":"live","link_attribute":"all"},"sort":"authority_desc"}'
{
"domain": "example.com",
"include_subdomains": false,
"limit": 100,
"filters": {
"status": "live",
"link_attribute": "all"
},
"sort": "authority_desc"
}
Fields:
domain,include_subdomains,path_scope,location.country,language, and callback fields match the overview endpoint.group: optionalbacklinksorreferring_domains; defaults tobacklinks. See Referring domains.limit: optional integer from 1 to 1000; defaults to 100.filters.status: optionallive,lost, orall; defaults tolive.filters.link_attribute: optionalfollow,nofollow, orall; defaults toall.filters.target_path_prefix: optional path beginning with/. Whenpath_scopeis set, this prefix must be equal to or insidepath_scope.sort: optionalauthority_desc,first_seen_desc,last_seen_desc, orsource_url_asc; defaults toauthority_desc. Withgroup: "referring_domains"the orders areauthority_desc,backlinks_desc, andfirst_seen_desc.output_format: optional Scale-onlycsvorjson. It replaces the automatic backlinks JSONL artifact with one complete protected export. CSV is UTF-8 RFC 4180 with CRLF rows and spreadsheet-formula protection. JSON is one schema-versioned object rather than JSONL. The fixed operation price is unchanged; artifact download egress is still metered.
Unknown fields and unsupported output-mode fields such as artifact_format
are rejected.
Result
The result contains a summary, at most 25 inline backlink sample rows, optional
inline referring-domain rows, and an exports array when artifacts were
created.
{
"data": {
"result": {
"domain": "example.com",
"include_subdomains": false,
"path_scope": null,
"location": null,
"language": null,
"fetched_at": "2026-06-29T12:00:05+00:00",
"filters": {
"status": "live",
"link_attribute": "all",
"target_path_prefix": null
},
"sort": "authority_desc",
"summary": {
"backlinks_total": 120,
"referring_domains_total": 38,
"live": 120,
"lost": null,
"follow": null,
"nofollow": null
},
"sample": [
{
"source_url": "https://referrer.example/article",
"source_domain": "referrer.example",
"target_url": "https://example.com/docs",
"target_path": "/docs",
"anchor": "Example docs",
"link_type": "follow",
"rel": [],
"first_seen": "2025-01-01T00:00:00+00:00",
"last_seen": "2026-06-20T00:00:00+00:00",
"status": "live",
"redirect": false,
"authority": {
"score": 64
},
"language": null,
"location": null,
"availability": {
"source_url": "available",
"source_domain": "available",
"target_url": "available",
"target_path": "available",
"anchor": "available",
"link_type": "available",
"rel": "available",
"first_seen": "available",
"last_seen": "available",
"authority.score": "available"
},
"confidence": {
"score": 1,
"availability": "available",
"source": "chab"
},
"warnings": []
}
],
"exports": [
{
"role": "backlinks_export",
"filename": "seo-domains-backlinks-op_01JZ7H0A1B2C3D4E5F6G7H8J9K.jsonl",
"row_count": 120
},
{
"role": "referring_domains_export",
"filename": "seo-domains-referring-domains-op_01JZ7H0A1B2C3D4E5F6G7H8J9K.jsonl",
"row_count": 38
}
],
"availability": {
"summary.backlinks_total": "available",
"summary.referring_domains_total": "available"
},
"complete": true
},
"artifacts": [
{
"id": "art_01JZ7H0A1B2C3D4E5F6G7H8J9K",
"type": "jsonl",
"role": "backlinks_export",
"mime_type": "application/jsonl",
"byte_size": 2048,
"checksum": "sha256:abc123",
"filename": "seo-domains-backlinks-op_01JZ7H0A1B2C3D4E5F6G7H8J9K.jsonl",
"metadata_url": "/v1/operations/op_01JZ7H0A1B2C3D4E5F6G7H8J9K/artifacts/art_01JZ7H0A1B2C3D4E5F6G7H8J9K",
"download_url": "/v1/operations/op_01JZ7H0A1B2C3D4E5F6G7H8J9K/artifacts/art_01JZ7H0A1B2C3D4E5F6G7H8J9K/download",
"expires_at": "2026-07-02T12:00:05+00:00"
},
{
"id": "art_01JZ7H0A1B2C3D4E5F6G7H8J9M",
"type": "jsonl",
"role": "referring_domains_export",
"mime_type": "application/jsonl",
"byte_size": 1024,
"checksum": "sha256:def456",
"filename": "seo-domains-referring-domains-op_01JZ7H0A1B2C3D4E5F6G7H8J9K.jsonl",
"metadata_url": "/v1/operations/op_01JZ7H0A1B2C3D4E5F6G7H8J9K/artifacts/art_01JZ7H0A1B2C3D4E5F6G7H8J9M",
"download_url": "/v1/operations/op_01JZ7H0A1B2C3D4E5F6G7H8J9K/artifacts/art_01JZ7H0A1B2C3D4E5F6G7H8J9M/download",
"expires_at": "2026-07-02T12:00:05+00:00"
}
],
"warnings": [],
"result_expires_at": "2026-07-02T12:00:05+00:00"
},
"meta": {
"request_id": "req_123"
}
}
JSONL exports contain one normalized row per line. Download artifact URLs are
ownership-checked, expire with the operation result retention window, and are
retained for about 72 hours by default. Chab-streamed artifact downloads may
create a separate egress charge in addition to the fixed operation price.
Backlink and referring-domain rows include per-field availability maps and
field_unavailable warnings for missing row-level data such as URLs, target
paths, anchors, link type, rel attributes, observed timestamps, counts, and
authority.
The summary split counts (live, lost, follow, and nofollow) are
populated only when filters.status or filters.link_attribute selects that
single slice; when either is all, the corresponding counts are null because
the split is not computed. backlinks_total and referring_domains_total always
reflect the full matched set.
If the operation fetches fewer rows than the reported total, complete is
false and the response includes a result_truncated warning. Export
row_count values report the rows exported by Chab; totals remain in
summary.
Referring domains
Send group: "referring_domains" for one row per linking domain, for example
the top 100 domains that link to a site:
curl -X POST https://www.chab.ai/v1/seo/domains/backlinks \
-H "Authorization: Bearer CHAB_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: domain-referring-domains-001" \
-d '{"domain":"example.com","group":"referring_domains","limit":100,"sort":"authority_desc"}'
filters.status, filters.link_attribute and filters.target_path_prefix
choose which links count. Every row up to limit comes back inline in
referring_domains, with its backlink count, referring pages, follow and
nofollow page counts, first-seen date, authority score (0 to 100) and spam
score (0 to 100).
authority.score is the linking site's own strength (its domain rank scaled
to 0 to 100), so github.com scores high whatever page it links from. With
sort: "authority_desc", the default, Chab takes the 1,000 linking domains
with the most linking pages, ranks them by their own authority and returns
the strongest limit. The other orders return the first limit domains by
backlinks or first-seen date, each with its own authority. If the authority
check is unavailable, the rows keep the linking-pages order, authority.score
is null, and a provider_degraded warning says so. On Scale,
output_format adds a complete CSV or JSON file with role
referring_domains_bulk_export.
{
"domain": "example.com",
"include_subdomains": false,
"path_scope": null,
"location": null,
"language": null,
"fetched_at": "2026-11-12T12:00:05+00:00",
"group": "referring_domains",
"filters": {
"status": "live",
"link_attribute": "all",
"target_path_prefix": null
},
"sort": "authority_desc",
"summary": {
"referring_domains_total": 38,
"returned": 1
},
"referring_domains": [
{
"domain": "referrer.example",
"backlinks": 12,
"referring_pages": 9,
"dofollow": 10,
"nofollow": 2,
"first_seen": "2025-01-01T00:00:00+00:00",
"last_seen": null,
"authority": {
"score": 64
},
"spam_score": 3,
"availability": {
"domain": "available",
"backlinks": "available",
"last_seen": "unavailable"
},
"warnings": []
}
],
"exports": [],
"complete": false
}
POST/v1/seo/domains/keywords
Lists the Google keywords a domain ranks for in organic results: the position, the page that ranks, monthly search volume, cost per click, keyword difficulty and estimated monthly visits from each keyword, plus totals for the whole domain.
Required Access
- Access: Paid plans that include this family, or free credits (guest trial or verified account) within the free limits.
- Operation family: SEO
- Scope:
api:seo:read - Credits: 4 per request plus 4 per started 100 keywords: 8 credits for the default 100 keywords, 44 credits for 1,000
- Idempotency:
Idempotency-Keyheader required
Request
curl -X POST https://www.chab.ai/v1/seo/domains/keywords \
-H "Authorization: Bearer CHAB_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: domain-keywords-001" \
-d '{"domain":"example.com","location":{"country":"US"},"language":"en","limit":100,"order":"traffic_desc"}'
Fields:
domain: required hostname or HTTPS URL, normalized to the registrable domain. Rankings include its subdomains. An HTTPS URL path becomespath_scope.path_scope: optional path such as/blog. Only keywords whose ranking URL starts with this path are listed.location.country: optional ISO 3166-1 alpha-2 country code for the Google market. Omit it for every country combined. See Ranking markets.language: optional language of the market, such asenorde. Omit it for every language in the market. It needslocation.country.limit: optional integer from 1 to 1000; defaults to 100.order: optionaltraffic_desc(most estimated visits first, the default),volume_desc(most searched first) orposition_asc(best position first).- Callback fields match the overview endpoint.
Result
{
"domain": "example.com",
"path_scope": null,
"location": {
"country": "US"
},
"language": "en",
"fetched_at": "2026-11-12T12:00:05+00:00",
"order": "traffic_desc",
"currency": "USD",
"totals": {
"ranked_keywords": 4210,
"returned": 2,
"estimated_traffic": 18450,
"top_3": 96,
"top_10": 412,
"returned_estimated_traffic": 3790,
"returned_search_volume": 14000
},
"keywords": [
{
"keyword": "example api",
"position": 1,
"url": "https://example.com/api",
"search_volume": 8100,
"cpc": 4.12,
"keyword_difficulty": 38,
"estimated_traffic": 2560.5,
"search_intent": "navigational",
"country": "US",
"language": "en"
},
{
"keyword": "example pricing",
"position": 2,
"url": "https://example.com/pricing",
"search_volume": 5900,
"cpc": 6.3,
"keyword_difficulty": 41,
"estimated_traffic": 1229.6,
"search_intent": "commercial",
"country": "US",
"language": "en"
}
],
"complete": false
}
totals.ranked_keywords, estimated_traffic, top_3 and top_10 describe
every keyword the domain ranks for in the market; the returned_ totals add up
the listed rows. Each row names its market in country and language; without
location the same keyword can appear once per market. cpc is in currency. keyword_difficulty runs from 0 to
100. Any value the data does not have is null. When the domain ranks for more
keywords than limit, complete is false with a result_truncated warning.
POST/v1/seo/domains/traffic
Estimates the monthly organic Google visits of a domain, the number of keywords it ranks for and how many rank in the top 3 and top 10, plus one row per month for up to 24 months, ready to chart.
Required Access
- Access: Paid plans that include this family, or free credits (guest trial or verified account) within the free limits.
- Operation family: SEO
- Scope:
api:seo:read - Credits: 55 credits reserved on acceptance, for 1 to 24 months
- Idempotency:
Idempotency-Keyheader required
Request
curl -X POST https://www.chab.ai/v1/seo/domains/traffic \
-H "Authorization: Bearer CHAB_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: domain-traffic-001" \
-d '{"domain":"example.com","location":{"country":"US"},"months":12}'
Fields:
domain: required hostname or HTTPS URL without a path, normalized to the registrable domain. Traffic includes its subdomains.location.country: optional Google market,USwhen omitted. See Ranking markets.language: optional language of the market; the country's main language when omitted. The result echoes the market used.months: optional integer from 1 to 24; defaults to 12.- Callback fields match the overview endpoint.
Result
{
"domain": "example.com",
"location": {
"country": "US"
},
"language": null,
"fetched_at": "2026-11-12T12:00:05+00:00",
"currency": "USD",
"current": {
"organic_traffic": 18450,
"organic_keywords": 4210,
"top_3": 96,
"top_10": 412,
"organic_traffic_value": 33210.4,
"paid_traffic": 0,
"paid_keywords": 0
},
"history": [
{
"month": "2026-09",
"organic_traffic": 17320,
"organic_keywords": 4050,
"top_3": 81,
"top_10": 405,
"organic_traffic_value": 31176,
"paid_traffic": 0,
"paid_keywords": 0
},
{
"month": "2026-10",
"organic_traffic": 18450,
"organic_keywords": 4210,
"top_3": 84,
"top_10": 421,
"organic_traffic_value": 33210,
"paid_traffic": 0,
"paid_keywords": 0
}
],
"availability": {
"current": "available",
"history": "available"
},
"complete": true
}
organic_traffic is the estimated monthly visits from organic Google results
and organic_traffic_value what those visits would cost as ads, in
currency. top_10 includes top_3. history is oldest month first and
ends with the latest monthly snapshot, which can be the running month.
When fewer months exist than requested, complete is false with a
field_unavailable warning. A domain without rankings in the market returns
null metrics with current marked unavailable.
Ranking markets
Ranked keywords, traffic and the overview's organic visibility come from
Google ranking data, which covers these countries and languages (the first one
is the default): AE ar, en; AR es; AT de; AU en; BE nl, fr, de; BR pt; CA en,
fr; CH de, fr, it; CL es; CO es; DE de; DK da; ES es; FI fi; FR fr; GB en; HK
zh-TW, en; ID id, en; IE en; IN en, hi; IT it; JP ja; KR ko; MX es; MY en, ms;
NL nl; NO nb; NZ en; PH en, tl; PL pl; PT pt; SE sv; SG en, zh-CN; TH th; TR
tr; US en, es; ZA en. Regional tags such as de-DE or en-GB are accepted and
reduced to the market language. Another country or language is rejected with
validation_failed and the list of options, before any credits are reserved.
Errors
Common errors include validation_failed, api_scope_missing,
paid_plan_required, operation_family_not_included, insufficient_credits,
provider_unavailable, provider_temporarily_rate_limited, rate_limited,
and the shared idempotency errors.
Credit Notes
Domain overview costs 35 credits. Domain backlinks costs 40 credits for the documented request caps, with either group. Ranked keywords cost 4 credits per request plus 4 per started 100 keywords (8 for 100, 44 for 1,000). Search traffic costs 55 credits for 1 to 24 months. Artifact download egress is metered separately when Chab streams bytes.