Built-in tool
Compare Domain Keywords
Find Google keywords shared by two domains, or compare their overlapping/non-overlapping search footprints.
Endpoint
Parameters
| Name | Type | Required | Note |
|---|---|---|---|
| domain1string · required | string | required | First domain, normally your site. |
| domain2string · required | string | required | Second domain, normally a competitor. |
| limitnumber · optional | number | optional | Maximum records to return (1-1000). Defaults to 100. Default: |
| shared_onlyboolean · optional | boolean | optional | Only keywords both domains rank for. Defaults to true. Default: |
| language_namestring · optional | string | optional | Language for search metrics. Defaults to English. One of: Default: |
| location_namestring · optional | string | optional | Country for search metrics. 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": {
"cpc": {
"type": [
"number",
"null"
]
},
"keyword": {
"type": [
"string",
"null"
]
},
"competition": {
"type": [
"number",
"null"
]
},
"target1_url": {
"type": [
"string",
"null"
]
},
"target2_url": {
"type": [
"string",
"null"
]
},
"target1_rank": {
"type": [
"number",
"null"
],
"description": "Organic position for this domain (1 = top organic result). Counts organic results only — ads and other SERP blocks are excluded, so this can be a few places higher than the absolute position shown in a browser."
},
"target2_rank": {
"type": [
"number",
"null"
],
"description": "Organic position for this domain (1 = top organic result). Counts organic results only — ads and other SERP blocks are excluded, so this can be a few places higher than the absolute position shown in a browser."
},
"search_intent": {
"type": [
"string",
"null"
]
},
"search_volume": {
"type": [
"number",
"null"
]
},
"target1_traffic": {
"type": [
"number",
"null"
],
"description": "Estimated monthly organic traffic for this domain, modelled from its own rank × the keyword’s search volume. Null when there is nothing to model from — the domain does not rank for the keyword, or the keyword has no volume data."
},
"target2_traffic": {
"type": [
"number",
"null"
],
"description": "Estimated monthly organic traffic for this domain, modelled from its own rank × the keyword’s search volume. Null when there is nothing to model from — the domain does not rank for the keyword, or the keyword has no volume data."
},
"competition_level": {
"type": [
"string",
"null"
]
},
"keyword_difficulty": {
"type": [
"number",
"null"
]
}
},
"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
}