Built-in tool
Track Website Traffic
Track a domain’s estimated organic and paid Google traffic and ranking-keyword counts over time.
Endpoint
Parameters
| Name | Type | Required | Note |
|---|---|---|---|
| domainstring · required | string | required | Domain to analyze, e.g. "example.com". Example: |
| date_tostring · optional | string | optional | Optional end date (YYYY-MM-DD); defaults to today. |
| date_fromstring · optional | string | optional | Optional start date (YYYY-MM-DD); defaults to the provider’s recent-history window. |
| 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": {
"date": {
"type": [
"string",
"null"
]
},
"paid_traffic": {
"type": [
"number",
"null"
],
"description": "Estimated monthly PAID (ads) search traffic, as calculated by the data provider across all of the target’s paid keywords. Modelled from ad placement rather than an organic click-through curve, so the organic caveat on organic_traffic does not apply to it — and Ranked Keywords, which covers organic positions only, is not a substitute for it."
},
"paid_keywords": {
"type": [
"number",
"null"
]
},
"organic_traffic": {
"type": [
"number",
"null"
],
"description": "Estimated monthly ORGANIC search traffic, as calculated by the data provider across all of the target’s keywords. The provider’s organic click-through model flattens for positions past roughly 28, so traffic earned from deep-ranking keywords is overstated. For per-keyword figures on our own position model, use Ranked Keywords."
},
"is_partial_month": {
"type": [
"boolean",
"null"
],
"description": "True for the month still in progress, whose keyword counts are incomplete and will keep rising. Exclude it from trend comparisons. Decided in UTC at the moment the row was fetched, matching the year/month the provider reports — so around a month boundary it can disagree with a local calendar for a few hours, and a stored or re-read result keeps the flag it was fetched with."
},
"organic_keywords": {
"type": [
"number",
"null"
]
},
"paid_traffic_cost": {
"type": [
"number",
"null"
]
},
"organic_traffic_cost": {
"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
}