Built-in tool
Find SEO Competitors
Competitor domains that rank for the same keywords as a target domain, ranked by keyword overlap.
Endpoint
Parameters
| Name | Type | Required | Note |
|---|---|---|---|
| targetstring · required | string | required | Domain to find competitors for, e.g. "example.com" (no protocol). Example: |
| limitnumber · optional | number | optional | Maximum number of competitors to return (1-1000). Defaults to 50. Default: |
| language_namestring · optional | string | optional | Language for results. Defaults to English. One of: Default: |
| location_namestring · optional | string | optional | Country for results. Defaults to United States. One of: Default: |
Response schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"elements"
],
"properties": {
"elements": {
"type": "array",
"items": {
"type": "object",
"properties": {
"domain": {
"type": [
"string",
"null"
]
},
"organic_etv": {
"type": [
"number",
"null"
],
"description": "The competitor's estimated monthly organic traffic across its whole domain. Null when the provider returns no whole-domain metrics for that competitor. This is the provider’s own aggregate over every keyword the domain ranks for, so it uses their CTR curve — which flattens past ~position 28 and therefore overstates traffic from deep-ranking keywords. Use Ranked Keywords for per-keyword figures modelled on our own curve."
},
"avg_position": {
"type": [
"number",
"null"
]
},
"intersections": {
"type": [
"number",
"null"
],
"description": "Keywords this competitor shares with the target."
},
"shared_keywords_etv": {
"type": [
"number",
"null"
],
"description": "The competitor's estimated traffic from the keywords it shares with the target."
},
"organic_keywords_count": {
"type": [
"number",
"null"
],
"description": "Total keywords the competitor ranks for across its whole domain — not just the shared ones. Null when the provider returns no whole-domain metrics for that competitor."
}
},
"additionalProperties": true
}
},
"returned": {
"type": "number",
"description": "How many rows this run returned, after any Limit was applied."
},
"truncated": {
"type": "boolean"
},
"suggestion": {
"type": "string"
},
"totalCount": {
"type": "number",
"description": "How many records the provider says MATCH in total, independent of Limit — routinely in the millions (spotify.com has 2,583,327 ranking pages). It is a match count, NOT how many this endpoint will serve: Limit caps what one call returns, so do not compare it against the row count to judge completeness and do not paginate towards it. Absent when the provider sent no count."
},
"totalElements": {
"type": "number",
"description": "DEPRECATED — despite the name this is the count RETURNED by this run, not a grand total, so it equals your Limit on a limited run. Kept at that value deliberately: ENG-17058 asked for depth 5 to report 5, and it is a live number in existing flows. Use `returned` for this number or `totalCount` for how many records match."
}
},
"additionalProperties": true
}