{"info":{"title":"Mangools API","version":"3.0.0","description":"Exact search volumes, related keyword suggestions, SEO difficulty score and other metrics from all Mangools tools.\n\n## Rate limits & quotas\n\nTwo independent limits apply:\n\n1. **Burst limit (`reqs-per-short-period`)** — at most 3 requests per sliding window, counted per account (or per device when unauthenticated) and per resource pool (e.g. `serps`, `related-keywords`). For API-key clients (REST, curl, SDKs, automation tools) the window is 30 seconds; requests through the hosted MCP server get a 1-second window. A request over the limit is refused with HTTP 429 and `type: \"RateLimit\"`; the answer carries `retry_after` in the body and a `Retry-After` header, both the length of the burst window in seconds (30 or 1), so after waiting that long all slots are free again. Refused requests are not counted, and identical requests repeated within 24 hours, except keyword imports, are served from cache and skip both the burst limit and the quota. Send requests one at a time, not in parallel, and leave at least 11 seconds between requests to the same pool: the window check is inclusive on its boundary, so a request exactly 30 seconds after the first one of three is still refused. On a 429 `RateLimit`, wait `retry_after` seconds and send the same request again.\n2. **Quota pools** — each paid operation draws from a named pool returned under `resources` in `GET /kwfinder/limits`. Daily pools (e.g. `serps`, `related-keywords`, `sch-url-metrics`, `kw-url-metrics`, `lm-url-metrics`, `sp-overview`, `trends`, `lm-suggest`) run in 24-hour periods: the first counted request starts a period, and when it ends the whole pool is available again; monthly pools (e.g. `links`) reset at the end of the calendar month. Identical requests within 24 hours are served from cache and do not consume quota. Each paid operation declares its pool in an `x-quota-pool` extension. Each pool's `reset` value is the number of seconds remaining until reset (relative, not a unix timestamp).\n\nFor API-key clients, the keyword-import endpoint also allows only one import per 30 seconds per account; a faster import answers 429 with `type: \"RateLimit\"` and `retry_after` set to the seconds left. A spent quota answers 429 with `type: \"CreditLimit\"`, which never carries `retry_after`.\n\n### Gateway rate limit\n\nEvery endpoint sits behind a public gateway that limits the request rate per client IP. A request over that rate is answered by the gateway itself with HTTP 429 and an HTML error page, not the JSON error object documented on the operations below.","termsOfService":"https://mangools.com/conditions","contact":{"email":"info@mangools.com","url":"https://mangools.com/api"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}},"servers":[{"url":"https://api.mangools.com/v3","description":"The production API server"}],"tags":[{"name":"kwfinder","description":"All kwfinder endpoints.","externalDocs":{"description":"Try tool","url":"https://mangools.com/kwfinder"}},{"name":"serpchecker","description":"All serpchecker endpoints.","externalDocs":{"description":"Try tool","url":"https://mangools.com/serpchecker"}},{"name":"linkminer","description":"All linkminer endpoints.","externalDocs":{"description":"Try tool","url":"https://mangools.com/linkminer"}},{"name":"serpwatcher","description":"All serpwatcher endpoints.","externalDocs":{"description":"Try tool","url":"https://mangools.com/serpwatcher"}},{"name":"siteprofiler","description":"All siteprofiler endpoints.","externalDocs":{"description":"Try tool","url":"https://mangools.com/siteprofiler"}},{"name":"aisearchwatcher","description":"All AI Search Watcher endpoints.","externalDocs":{"description":"Try tool","url":"https://mangools.com/ai-search-watcher"}},{"name":"mangools","description":"Shared Mangools endpoints used across tools (e.g. locations)."},{"name":"paid","description":"Endpoints whose successful calls count toward your paid lookup quota (related keywords, SERP lookups, backlink rows, etc.)."},{"name":"free","description":"Endpoints that do not count toward your paid lookup quota (reading saved data, account limits, locations, etc.)."}],"openapi":"3.0.3","paths":{"/kwfinder/related-keywords":{"get":{"x-quota-pool":"related-keywords","tags":["kwfinder","paid"],"operationId":"get-kwfinder-related-keywords","summary":"Get related keywords list","description":"Get a list of relevant keywords based on your seed keyword. You only need to send your seed keyword. Location and language are optional.\n\nThe seed keyword comes first; the other keywords are not sorted by any metric.\n\n### Limits\n\nEach request is counted towards your **Keyword lookups** limit. Lookup is not counted if you make the identical request within 24 hours.\n\n### Locations\n\nYou can specify a location_id to get localized search volumes or use `0` for global search volumes.\n\nTo get a list of supported locations, please refer to [this article](https://developers.google.com/google-ads/api/data/geotargets).\n\n### Languages\n\nTo get a list of supported languages, please refer to [this article](https://developers.google.com/google-ads/api/data/codes-formats#languages).\n\n### Number of results\n\nEach request returns at most the related-keywords-rows value of your plan (see GET /kwfinder/limits), and never more than 10,000 keywords. Based on a seed keyword, location and language the number of returned keywords may vary.\n\n### Keyword metrics\n\nThe result is a list of keywords with metrics such as:\n   * CPC\n   * PPC\n   * Cached keyword difficulty, if exists.\n   * Average search volume\n   * Search volume history\n\n\n### Search volumes\n\nEach keyword in a list has an average [search volume](https://mangools.com/kwfinder/features/search-volume/) based on the last 12 months and search volume history. Search volume history length may vary - it may include data since 2015.\n","parameters":[{"name":"kw","in":"query","description":"keyword","required":true,"schema":{"type":"string"}},{"name":"location_id","description":"ID of location, default 0","in":"query","required":false,"schema":{"type":"integer"}},{"name":"language_id","description":"Language ID, default 0","in":"query","required":false,"schema":{"type":"integer"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"keywords":{"type":"array","items":{"$ref":"#/components/schemas/ImportedKeywords"}},"language":{"$ref":"#/components/schemas/Language"},"location":{"$ref":"#/components/schemas/LocationRef"},"countKeywordsBeforeLimit":{"type":"integer"},"_id":{"type":"string"},"source":{"type":"string","nullable":true,"description":"Where the suggestions came from. Null for a plain related-keyword lookup.","example":null}}}}},"description":"Returns related keywords"},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/competitor-keywords":{"get":{"x-quota-pool":"related-keywords","tags":["kwfinder","paid"],"operationId":"get-kwfinder-competitor-keywords","summary":"Get list of keywords for domain or URL","description":"Use to get keywords that specific URL or domain is ranking for.\n\nBy default the keywords are ordered by the domain's ranking position, from the worst position to the best.\n\n### Limits\n\nEach request is counted towards your **Keyword lookups** limit. Lookup is not counted if you make the identical request within 24 hours.\n\n### Locations\n\nUse **location_id** to specify country.\n\nEach request returns at most the competitor-keywords-rows value of your plan (see GET /kwfinder/limits), and never more than 1,000 keywords.\n\n### Supported locations\n\n0 (Anywhere) and the countries below are supported. A city or region ID is looked up as its country, and any other location answers HTTP 204 with an empty body.\n\n2012 (Algeria), 2024 (Angola), 2032 (Argentina), 2051 (Armenia), 2036 (Australia), 2040 (Austria), 2031 (Azerbaijan), 2048 (Bahrain), 2050 (Bangladesh), 2056 (Belgium), 2068 (Bolivia), 2076 (Brazil), 2100 (Bulgaria), 2854 (Burkina Faso), 2116 (Cambodia), 2120 (Cameroon), 2124 (Canada), 2152 (Chile), 2170 (Colombia), 2188 (Costa Rica), 2384 (Cote d'Ivoire), 2191 (Croatia), 2196 (Cyprus), 2203 (Czechia), 2208 (Denmark), 2218 (Ecuador), 2818 (Egypt), 2222 (El Salvador), 2233 (Estonia), 2246 (Finland), 2250 (France), 2276 (Germany), 2288 (Ghana), 2300 (Greece), 2320 (Guatemala), 2344 (Hong Kong), 2348 (Hungary), 2356 (India), 2360 (Indonesia), 2372 (Ireland), 2376 (Israel), 2380 (Italy), 2392 (Japan), 2400 (Jordan), 2398 (Kazakhstan), 2404 (Kenya), 2428 (Latvia), 2440 (Lithuania), 2458 (Malaysia), 2470 (Malta), 2484 (Mexico), 2504 (Morocco), 2104 (Myanmar), 2528 (Netherlands), 2554 (New Zealand), 2558 (Nicaragua), 2566 (Nigeria), 2807 (North Macedonia), 2578 (Norway), 2586 (Pakistan), 2591 (Panama), 2600 (Paraguay), 2604 (Peru), 2608 (Philippines), 2616 (Poland), 2620 (Portugal), 2642 (Romania), 2682 (Saudi Arabia), 2686 (Senegal), 2688 (Serbia), 2702 (Singapore), 2703 (Slovakia), 2705 (Slovenia), 2710 (South Africa), 2410 (South Korea), 2724 (Spain), 2144 (Sri Lanka), 2752 (Sweden), 2756 (Switzerland), 2158 (Taiwan), 2764 (Thailand), 2788 (Tunisia), 2792 (Turkey), 2804 (Ukraine), 2784 (United Arab Emirates), 2826 (United Kingdom), 2840 (United States), 2858 (Uruguay), 2862 (Venezuela), 2704 (Vietnam).","parameters":[{"name":"location_id","in":"query","description":"ID of location, default 0 (Anywhere).","required":true,"schema":{"type":"integer"}},{"name":"url","in":"query","description":"Target URL / domain / subdomain","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns competitor-keywords for the url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KwfinderCompetitors"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"x-quota-pool":"related-keywords","tags":["kwfinder","paid"],"operationId":"post-kwfinder-competitor-keywords","summary":"Get list of keywords for domain or URL (POST variant)","description":"Same as GET /kwfinder/competitor-keywords; the parameters go in the query string.\nUse to get keywords that specific URL or domain is ranking for.\n\n### Limits\n\nEach request is counted towards your **Keyword lookups** limit. Lookup is not counted if you make the identical request within 24 hours.\n","parameters":[{"name":"url","in":"query","description":"Target URL / domain / subdomain","required":true,"schema":{"type":"string"}},{"name":"location_id","in":"query","description":"ID of location, default 0 (Anywhere).","required":true,"schema":{"type":"integer"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns competitor-keywords for the url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KwfinderCompetitors"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/competitor-domain":{"get":{"tags":["kwfinder","free"],"operationId":"get-kwfinder-competitor-domain","summary":"Get list of competitor domains","description":"Returns a list of domains that compete with the specified URL/domain for organic keywords.\n\n### Limits\n\nRequires a GET or POST /kwfinder/competitor-keywords lookup for the same url and location_id within the last 24 hours; otherwise it answers HTTP 422 with the message No result. It does not count towards any pool.\n","parameters":[{"name":"url","in":"query","description":"Target URL / domain / subdomain","required":true,"schema":{"type":"string","example":"mangools.com"}},{"name":"location_id","in":"query","description":"ID of location","required":true,"schema":{"type":"integer","example":2840}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns list of competitor domains","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"example":["example.org","example.net"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"}}}},"/kwfinder/suggested-keywords":{"get":{"x-quota-pool":"related-keywords","tags":["kwfinder","paid"],"operationId":"get-kwfinder-suggested-keywords","summary":"Get suggested keywords for URL","description":"Returns suggested keywords based on the URL's ranking keywords.\nUsed primarily when creating new SERPWatcher trackings.\n\n### Limits\n\nEach request is counted towards your **Keyword lookups** limit. Lookup is not counted if you make the identical request within 24 hours.\n","parameters":[{"name":"url","in":"query","description":"Target URL / domain / subdomain","required":true,"schema":{"type":"string","example":"mangools.com"}},{"name":"location_id","in":"query","description":"ID of location","required":true,"schema":{"type":"integer","example":2840}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns suggested keywords","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KwfinderSuggestedKeywords"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/keyword-imports":{"post":{"x-quota-pool":"related-keywords","tags":["kwfinder","paid"],"operationId":"post-kwfinder-keyword-imports","summary":"Get details for a set of keywords","description":"This is one of the most powerful endpoints in our API. You can import up to the related-keywords-rows value of your plan (see GET /kwfinder/limits; at least 200 keywords) in one request; a larger set answers HTTP 400.\n\nWith this endpoint, you will get the following details for each keyword:\n\n- Cached Keyword SEO difficulty (rank)\n- CPC, PPC\n- Search volume history\n- Average search volume (last 12 months - as `sv` attribute)\n- Organic SERP results and CTRs\n\n### Limits\n\nEach request counts as one lookup towards your **Keyword lookups** limit, also when it repeats an earlier import.\n\n### Locations\n\nYou can specify a location_id to get localized search volumes and SERPs.\n\nTo get a list of supported locations, please refer to [this article](https://developers.google.com/google-ads/api/data/geotargets).\n\n### How to send keywords\nTo get data about set of keywords send them in the request body. Don't forget to include location and language ids. See the following example of request body:\n\n    {\n       \"keywords\": [\n          \"seo agency\",\n          \"seo\",\n          \"seo specialist\"\n       ],\n       \"location_id\": 21167,\n       \"language_id\": 1000\n     }\n","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string"},"example":["seo agency","seo","seo specialist"]},"location_id":{"type":"integer","example":21167},"language_id":{"type":"integer","example":1000}},"required":["keywords","location_id","language_id"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"properties":{"language":{"$ref":"#/components/schemas/Language"},"location":{"$ref":"#/components/schemas/LocationShort"},"keywords":{"type":"array","items":{"$ref":"#/components/schemas/ImportedKeywords"}},"countKeywordsBeforeLimit":{"type":"integer","example":500}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"description":"Either the plan limit for keyword imports is exhausted, or too many imports were started in a short period. In the second case `retry_after` carries the number of seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"RateLimit","message":"Too many import requests, please slow down. retry_after is in seconds.","retry_after":30}}}}}}}},"/kwfinder/serps":{"get":{"x-quota-pool":"serps","tags":["kwfinder","paid"],"operationId":"get-kwfinder-serps","summary":"Get keyword details","description":"This endpoint returns details for a specified keyword.\n\nWith this endpoint you will get:\n\n- Keyword SEO difficulty\n- Organic SERP results with essential metrics\n- Number of results in SERP\n- Click-through rates for each organic position\n\n### Limits\n\nEach request is counted towards your **SERP lookups** limit. Lookup is not counted if you make the identical request within 24 hours.\n","parameters":[{"name":"location_id","in":"query","description":"ID of location. 0 or no value means 2840 (United States).","required":false,"schema":{"type":"integer","example":0}},{"name":"language_id","in":"query","description":"Language ID","required":false,"schema":{"type":"integer","example":0}},{"name":"platform_id","in":"query","description":"Platform: 1 desktop (default), 2 mobile.","required":false,"schema":{"type":"integer","enum":[1,2],"default":1}},{"name":"page","in":"query","description":"page, default 0","required":false,"schema":{"type":"integer","example":0}},{"name":"kw","description":"keyword","in":"query","required":true,"schema":{"type":"string","example":"example"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns SERP results for a given keyword, location, platform etc.","content":{"application/json":{"schema":{"type":"object","properties":{"rkID":{"type":"string","description":"ID of the related-keywords lookup this SERP belongs to."},"serp":{"$ref":"#/components/schemas/Serp"},"kwOpps":{"type":"object","description":"Keyword opportunities found in the organic results.","properties":{"isOutdatedPage":{"type":"boolean","description":"Whether one of the top five organic results was published more than six months ago."},"missingWordsInTitle":{"type":"array","description":"Words of the keyword that are missing from the titles of the top five organic results.","items":{"type":"string"}}}},"searchIntent":{"type":"object","description":"Search intent of the keyword, keyed by keyword ID.","additionalProperties":{"type":"array","nullable":true,"description":"Intent labels of the keyword, or null when none could be determined.","items":{"type":"string"}}},"contentTypes":{"type":"array","description":"Content types found in the organic results.","items":{"type":"string"}},"serpFeatures":{"type":"array","description":"SERP features present on the results page.","items":{"type":"string"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/keywords":{"post":{"tags":["kwfinder","free"],"operationId":"post-kwfinder-keywords","summary":"Get keywords by ID as JSON, or as CSV with the .csv suffix","description":"`fields` can be used to filter columns you wish to include in the export.\n possible values include:\n   * kw: Keyword\n   * sv: Avg. Search Volume\n   * lid: Location\n   * cpc: Cost per click\n   * ppc: PPC competition (0-100)\n   * seo: Keyword difficulty\n   * msv: Monthly Search Volume\n\n### Prerequisites\nThe `keyword_ids` are Mangools-specific identifiers returned by keyword-producing endpoints — call one of `/kwfinder/keyword-imports`, `/kwfinder/related-keywords`, `/kwfinder/competitor-keywords`, `/kwfinder/suggested-keywords`, or `/kwfinder/serps` first and reuse the `_id` values (or `mId` for SERP items). IDs that do not correspond to known keywords are silently dropped from the response.\n\n\nThe response is a JSON array of keyword objects. Posting to `/kwfinder/keywords.csv` instead returns the same data as a `text/csv` attachment.\n\nAt most 10,000 keyword IDs per request.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"keyword_ids":{"type":"array","items":{"type":"string"},"example":["916647301d98e2ec41df257cbdf97ac0","916647301d98e2ec41df257cbdf97ac0"]},"fields":{"type":"string","description":"Comma-separated CSV columns, for example kw,sv,lid. Ignored for JSON.","example":"kw,sv,lid"}},"required":["keyword_ids"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"The requested keywords with their metrics.","content":{"application/json":{"schema":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Keyword"},{"type":"object","properties":{"language":{"$ref":"#/components/schemas/Language"},"location":{"$ref":"#/components/schemas/LocationShort"}}}]}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/kwfinder/requests":{"get":{"tags":["kwfinder","free"],"operationId":"get-kwfinder-requests","summary":"Get history of lookups","description":"Get your last 100 KWFinder lookups, oldest first. Each entry has a type t: 0 related keywords (with kw, language, rank, rank_ts and location), 1 competitor keywords (with url and location), 2 keyword gap.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns an array of KwfinderRequest objects","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KWfinderRequest"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/kwfinder/trends":{"get":{"x-quota-pool":"trends","tags":["kwfinder","paid"],"operationId":"get-kwfinder-trends","summary":"Get trends","description":"**Deprecated — no fresh data since January 2025.** Previously returned monthly search volume trends for a given keyword sourced from Google Trends. Every request returns an empty `data` array. New integrations should rely on the search volume history returned by `/kwfinder/keyword-imports`. A request counts towards your trends pool unless the same request was made in the last 24 hours.","deprecated":true,"parameters":[{"name":"kw","in":"query","description":"keyword","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns search volume trends for given keyword","content":{"application/json":{"schema":{"properties":{"created_at":{"type":"integer","example":1592698144},"data":{"type":"array","items":{"type":"object","properties":{"t":{"type":"integer","description":"point in time","example":1072915200},"v":{"type":"integer","description":"search volume","example":7}}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/kd/url-metrics":{"get":{"x-quota-pool":"kw-url-metrics","tags":["kwfinder","paid"],"operationId":"get-kwfinder-kd-url-metrics","summary":"Get url-metrics for url","description":"Get keyword difficulty (KD) URL metrics for a specific URL — the URL authority score used as an input signal when calculating KWFinder's keyword difficulty.\n\n### Limits\n\nCounts toward the daily kw-url-metrics pool in GET /kwfinder/limits. Identical requests within 24 hours are reused from cache.","parameters":[{"name":"url","description":"Target URL","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KdUrlMetrics"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/kd/requests":{"get":{"tags":["kwfinder","free"],"operationId":"get-kwfinder-kd-requests","summary":"Get KD lookup history","description":"Get the history of your recent keyword difficulty URL lookups performed through `/kwfinder/kd/url-metrics`. Each entry includes the URL and the URL authority score that was returned at the time — useful for rebuilding a \"recent URL metrics\" panel in a client.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns KD lookup history","content":{"application/json":{"schema":{"type":"array","description":"Your last 100 URL lookups, oldest first.","items":{"type":"object","properties":{"_id":{"type":"string","description":"md5 hash of the looked-up URL."},"t":{"type":"integer","description":"Entry type, always 0."},"url":{"type":"string","description":"The looked-up URL."},"lps":{"type":"number","description":"URL authority score returned by the lookup."},"created":{"type":"integer","description":"Unix timestamp (seconds) of the lookup."}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/kwfinder/gap-analysis":{"post":{"x-quota-pool":"related-keywords","tags":["kwfinder","paid"],"operationId":"post-kwfinder-gap-analysis","summary":"Keyword Gap Analysis","description":"Find keywords that your competitors rank for but your domain doesn't — the classic SEO content-gap analysis. Compare your domain against up to 5 competitors.\n\nRequest body:\n\n* `domain` — your domain to analyze\n* `competitors` — array of 1–5 competitor domains\n* `location_id` — location for the analysis\n* `page` — optional page number (Premium, Agency, Custom and API Pro plans; other plans always get page 1)\n\nThe response holds one result per competitor: the keywords that competitor ranks for and your domain does not, ordered by the competitor's position, best first. Each keyword includes search volume, keyword difficulty, CPC and the competitor's position.\n\n### Limits\n\nEach competitor counts as one lookup towards your **Keyword lookups** limit, unless the same domain, competitor, location and page were requested in the last 24 hours.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain","competitors","location_id"],"properties":{"domain":{"type":"string","description":"Your domain to analyze","example":"mangools.com"},"competitors":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":5,"description":"List of competitor domains (1-5)","example":["example.org","example.net"]},"location_id":{"type":"integer","description":"Location ID for the analysis","example":2840},"page":{"type":"integer","minimum":1,"default":1,"description":"Page number (Premium, Agency, Custom and API Pro plans, or a lookup paid by a keyword credit; other plans always get page 1)"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Keyword gap analysis results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KwfinderGapAnalysis"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/kwfinder/limits":{"get":{"tags":["kwfinder","free"],"operationId":"get-kwfinder-limits","summary":"Get current and free limits","description":"Get your current API usage and remaining limits across every Mangools resource — Keyword lookups, SERP lookups, Backlink rows, Tracked keywords, and more. Useful for quota checks before sending expensive requests, or for surfacing usage information in a client dashboard.\n\nAuthentication is optional on this operation: a request without `X-Access-Token`, or with a token that matches no account, returns HTTP 200 with nothing remaining in any pool rather than HTTP 401. Do not use this operation to validate an API key — use one that requires authentication, such as `GET /kwfinder/requests`.","security":[{"ApiKeyAuth":[]},{}],"responses":{"200":{"description":"Returns limits on different mangools resources","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Limit"}}}},"429":{"$ref":"#/components/responses/GatewayRateLimited"}}}},"/kwfinder/lists":{"get":{"tags":["kwfinder","free"],"operationId":"get-kwfinder-lists","summary":"Get all lists","description":"Get all keyword lists saved on your account. Each list returns its id, name and the ids of the keywords it contains. Use `GET /kwfinder/lists/{list_id}` to load the full keyword data for a specific list.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns an array of Kwfinder list objects","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KwfinderList"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["kwfinder","free"],"operationId":"post-kwfinder-lists","summary":"Add new list","description":"Create a new keyword list on your account.\n\nRequired fields:\n\n* `name` — list name\n* `keyword_ids` — array of keyword IDs to populate the list (may be empty to create an empty list)\n\nKeyword IDs typically come from previous KWFinder lookups such as `/kwfinder/related-keywords` or `/kwfinder/keyword-imports`. An account can hold up to 10,000 lists; creating more answers HTTP 422.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"keyword_ids":{"type":"array","items":{"type":"string"}},"name":{"type":"string"}},"required":["keyword_ids","name"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"The list was created. Returns the stored list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KwfinderList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/kwfinder/lists/{list_id}":{"get":{"tags":["kwfinder","free"],"operationId":"get-kwfinder-lists-by-list-id","summary":"Get items in List, filter by list ID","description":"Get a single keyword list together with the full keyword data (search volume, CPC, PPC, keyword difficulty, location) for every keyword in it. Suffix the URL with `.csv` to download the list as a CSV export instead of JSON.","parameters":[{"name":"list_id","in":"path","description":"ID of the list","required":true,"schema":{"type":"string"}},{"name":"fields","description":"Comma-separated column list for the CSV form of this response (`?ext=csv` or `Accept: text/csv`): kw, sv, lid, cpc, ppc, seo, msv. It has no effect on the JSON response, which always returns every field.","in":"query","required":false,"schema":{"type":"string"},"example":"kw,sv,cpc,seo"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns object consisting of keyword array and list object data.","content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Keyword"},{"type":"object","properties":{"location":{"$ref":"#/components/schemas/LocationShort"}}}]}},"list":{"type":"object","properties":{"_id":{"type":"string","description":"Unique list identifier. Use this value as the `list_id` path parameter for `GET /kwfinder/lists/{list_id}`, `PATCH /kwfinder/lists/{list_id}` and the keyword sub-resources.","example":"6a29390c4c966b1271aef0d2"},"name":{"type":"string","description":"name","example":"My Awesome Keyword List"},"user_id":{"type":"string","description":"user_id","example":"005de7e7771450763339653e918778ef"},"creator":{"type":"string","description":"ID of the user who created the list.","example":"005de7e7771450763339653e918778ef"},"created_at":{"type":"integer","description":"created_at timestamp","example":1590868935},"updated_at":{"type":"integer","description":"updated_at timestamp","example":1590868935}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"patch":{"tags":["kwfinder","free"],"operationId":"patch-kwfinder-lists-by-list-id","summary":"Update List name","description":"Rename an existing keyword list.\n\nRequired field:\n\n* `name` — new list name\n\nReturns HTTP 204.","parameters":[{"name":"list_id","description":"ID of the list to rename","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"My Awesome Keyword List"}},"required":["name"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Returns http status code `204` with empty response body"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"delete":{"tags":["kwfinder","free"],"operationId":"delete-kwfinder-lists-by-list-id","summary":"Remove custom list","description":"Delete a keyword list. The list is removed from your account; keyword data referenced by the list is unaffected and remains available in other lookups. Returns HTTP 204.","parameters":[{"name":"list_id","in":"path","description":"list ID","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Returns http status code `204` with empty response body"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/kwfinder/lists/{list_id}/keywords":{"post":{"tags":["kwfinder","free"],"operationId":"post-kwfinder-lists-by-list-id-keywords","summary":"Add new keywords to the list","description":"Add one or more keywords to an existing keyword list.\n\nRequired field:\n\n* `keyword_ids` — non-empty array of keyword IDs\n\nDuplicates are handled silently (an existing keyword is not added twice). A list holds up to 10,000 keywords; adding more answers HTTP 422 with type OutOfLimitException. Returns HTTP 204.","parameters":[{"name":"list_id","in":"path","description":"list ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"keyword_ids":{"type":"array","items":{"type":"string"},"example":["916647301d98e2ec41df257cbdf97ac0","916647301d98e2ec41df257cbdf97ac0"]}},"required":["keyword_ids"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Returns http status `204` with empty response"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"tags":["kwfinder","free"],"operationId":"delete-kwfinder-lists-by-list-id-keywords","summary":"Remove keywords from the list","description":"Remove one or more keywords from a keyword list. Pass `keyword_ids` in the request body. Keywords not currently in the list are ignored silently. Returns HTTP 204.","parameters":[{"name":"list_id","in":"path","description":"list ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"keyword_ids":{"type":"array","items":{"type":"string"},"example":["916647301d98e2ec41df257cbdf97ac0","916647301d98e2ec41df257cbdf97ac0"]}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Returns http status `204` with empty response"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpchecker/serps":{"get":{"x-quota-pool":"serps","tags":["serpchecker","paid"],"operationId":"get-serpchecker-serps","summary":"Get SERP results w. all metrics + snapshot","description":"Use this endpoint to get a detailed SERP with all its features.\n\nWith this endpoint you will get:\n   *  ```items``` - List of organic and paid results for a given keyword along with other SERP features (rich snippets)\n   * URL, title, description and CTR for each organic result\n   * SEO metrics (Moz, Majestic, Facebook) for each organic result (URL)\n   * Link to the actual SERP preview\n   * SERP features impact metric\n   * \"Above the fold\" visibility of a specific item (```screenCoverage``` - % of screen does it take & ```visPart``` - % of visible part)\n   * Total number of results for a specific search query in search\n\n### Locations\n\nSpecify the `location_id` to get localized SERPs. Don't forget that you can localize down to the city level!\n\nTo get a list of supported locations, please refer to [this article](https://developers.google.com/google-ads/api/data/geotargets).\n\n### Enumeration of Rich snippet items in response\n\nHere is the list of all possible rich snippets, or SERP features, we detect. If you are not familiar with them, you can [read more about them](https://mangools.com/blog/google-rich-snippets-guide/) on our blog.\n\n\n    - SPELL_ERROR\n    - SUGGESTION\n    - KNO_GRAPH\n    - KNO_GRAPH_LINK\n    - TOP_CAROUSEL\n    - TOP_STORIES\n    - ADV_TOP\n    - ADV_BOTTOM\n    - NEWS_CAROUSEL\n    - NEWS_PACK\n    - IMG_PACK\n    - VIDEO_PACK\n    - FLIGHTS\n    - VIDEO_PANEL\n    - INSTALL_APP\n    - INSTALL_APP_GRID\n    - LOCAL_PACK\n    - PROGRAM_OVERVIEW\n    - ORGANIC\n    - SIMILAR_QUERIES\n    - SIMILAR_ENTITIES\n    - SIMILAR_ENTITIES2\n    - SIMILAR_QUESTIONS\n    - SPECIFY_QUERY\n    - SIMILAR_PLACES\n    - POPULAR_LIST\n    - QUANTITY_ANSWER\n    - CURRENCY\n    - TIME\n    - FEATURED_SNIPPET\n    - WEATHER\n    - TRANSLATOR\n    - DICTIONARY\n    - TOP_SIGHTS\n    - TRAVEL_BOX\n    - INDEPTH_ARTICLE\n    - SHOP_RESULTS\n    - JOB_POSTING\n    - SPORTS\n","parameters":[{"name":"location_id","description":"Location ID. 0 or no value means 2840 (United States).","in":"query","required":true,"schema":{"type":"integer"}},{"name":"kw","description":"Keyword","in":"query","required":true,"schema":{"type":"string"}},{"name":"platform_id","description":"Platform: 1 = desktop (default), 2 = mobile","in":"query","required":false,"schema":{"type":"integer","enum":[1,2],"default":1}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Serp"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/serpchecker/serps/reset":{"get":{"x-quota-pool":"serps","tags":["serpchecker","paid"],"operationId":"get-serpchecker-serps-reset","summary":"Re-fetch SERP results with all metrics (consumes serp_count SERP credits)","description":"Force a re-parse of the SERP and return updated results with all features. **This operation consumes serp_count SERP credits per call (one per page, default 1)**, even though it is a GET request, and a page that fails to re-parse is still charged. It is NOT a free read — use it only when you intentionally want fresh SERP data. For cached results that do not consume credits, use `GET /serpchecker/serps` instead.\n","parameters":[{"name":"location_id","description":"Location ID. 0 or no value means 2840 (United States).","in":"query","required":true,"schema":{"type":"integer"}},{"name":"kw","description":"Keyword","in":"query","required":true,"schema":{"type":"string"}},{"name":"platform_id","description":"Platform: 1 = desktop (default), 2 = mobile","in":"query","required":false,"schema":{"type":"integer","enum":[1,2],"default":1}},{"name":"serp_count","description":"Number of SERP pages to reparse (1-10). Defaults to 1.","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10,"default":1}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SerpResetResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/serpchecker/url-metrics":{"get":{"x-quota-pool":"sch-url-metrics","tags":["serpchecker","paid"],"operationId":"get-serpchecker-url-metrics","summary":"Get url-metrics for url","description":"Get SEO metrics for a specific URL — MOZ Domain Authority and Page Authority, plus Majestic Citation Flow and Trust Flow. Useful for enriching competitor URLs without running a full SERP lookup.\n\n### Limits\n\nCounts toward the daily sch-url-metrics pool in GET /kwfinder/limits. Identical requests within 24 hours are reused from cache.","parameters":[{"name":"url","description":"Target URL","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SerpcheckerUrlMetrics"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/serpchecker/requests":{"get":{"tags":["serpchecker","free"],"operationId":"get-serpchecker-requests","summary":"Get latest requests","description":"Get the history of your recent SERP lookups performed through `/serpchecker/serps`. Each entry includes the queried keyword and location — useful for rebuilding a \"recent searches\" panel in a client.","parameters":[],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"type":"array","description":"Your last 100 SERP lookups, oldest first.","items":{"type":"object","properties":{"_id":{"type":"string","description":"SERP ID."},"t":{"type":"integer","description":"Entry type, always 0."},"created":{"type":"integer","description":"Unix timestamp (seconds) of the lookup."},"kw":{"type":"string"},"platform_id":{"type":"integer"},"location":{"$ref":"#/components/schemas/LocationShort"},"rank":{"type":"integer","nullable":true},"rank_ts":{"type":"integer","nullable":true}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpchecker/serps/{serp_id}/snapshot":{"get":{"tags":["serpchecker","free"],"operationId":"get-serpchecker-serps-by-serp-id-snapshot","summary":"Get a SERP snapshot image","description":"### Prerequisites\nThis endpoint requires a prior call to `/serpchecker/serps` for the same query. Pass the `serp_snapshot_id` from that response as returned, **not** the bare `_id`: the snapshot is stored under a key of the form `<md5>.<YYYY-MM-DD>[.100][.sch]` (`.100` for a hundred-result SERP, `.sch` for a page SERPChecker or KWFinder stored from 2026-10-02), and that whole key is what this path segment takes. A null `serp_snapshot_id` means no page was stored for that response, so it has no snapshot. A bare `_id` finds the lookup but not the stored page, and the endpoint answers HTTP 404 `SERP snapshot not found`. A query that was never looked up answers HTTP 404 `Serp not found`.","parameters":[{"name":"serp_id","in":"path","description":"The `serp_snapshot_id` returned by `/serpchecker/serps`, passed as returned — the storage key `<md5>.<YYYY-MM-DD>[.100][.sch]`, not the bare serp `_id`. A null `serp_snapshot_id` has no snapshot.","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"The snapshot as a base64-encoded PNG in image.","content":{"application/json":{"schema":{"properties":{"image":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/linkminer/url-metrics":{"get":{"x-quota-pool":"lm-url-metrics","tags":["linkminer","paid"],"operationId":"get-linkminer-url-metrics","summary":"Get url metrics for target URL","description":"Get SEO metrics for a specific URL, domain or subdomain — Citation Flow, Trust Flow, referring domain and backlink counts sourced from Majestic. Useful for quickly evaluating a target's link authority before pulling a full backlink profile.\n\n### Limits\n\nCounts toward the daily lm-url-metrics pool in GET /kwfinder/limits. Identical requests within 24 hours are reused from cache.","parameters":[{"name":"url","description":"Target URL","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkminerUrlMetrics"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/links":{"get":{"x-quota-pool":"links","tags":["linkminer","paid"],"operationId":"get-linkminer-links","summary":"Get backlinks","description":"Use this endpoint to get a list of backlinks for a specific URL, domain or URL path. It returns up to 500 backlinks per page.\n\nTo get more backlinks you need to paginate with `page` parameter.\n\nTip: set `links_per_domain` to `1` to get one backlink per referring domain.\n\n### Limits\n\nEach request is counted towards your **Backlink rows** limit. It is reduced for each returned link.\n","parameters":[{"name":"url","description":"The URL, domain or path that we will return backlinks for.","in":"query","required":true,"schema":{"type":"string"}},{"name":"source","description":"0 - all (default)\n1 - new\n2 - lost\n","in":"query","required":true,"schema":{"type":"integer"}},{"name":"page","description":"Page number, starting at 0. Each page holds up to 500 links.","in":"query","required":true,"schema":{"type":"integer"}},{"name":"links_per_domain","description":"How many backlinks from one referring domain should be returned. 0 for all backlinks from the ref. domain. 1 for one backlink per ref. domain.","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackLinks"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/favorite-links/{link_id}":{"patch":{"tags":["linkminer","free"],"operationId":"patch-linkminer-favorite-links-by-link-id","summary":"Set favorite link","description":"### Prerequisites\nThe `link_id` is the `_id` of a link returned by `/linkminer/links`. Call that endpoint first for the relevant target URL; unknown `link_id` values are silently ignored and the endpoint returns `null`.\n","parameters":[{"name":"link_id","description":"link ID","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"favorite":{"type":"boolean"}},"required":["favorite"]}}}},"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/FavoriteList"}],"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/favorites":{"get":{"tags":["linkminer","free"],"operationId":"get-linkminer-favorites","summary":"See favorite links","description":"Get all favorite-link lists saved on your account, sorted by last update (newest first). Favorite lists are per-target groupings of backlinks you have starred on `/linkminer/links` results. Each list includes its target domain, id and update timestamp.","responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteList"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/favorites/{list_id}":{"get":{"tags":["linkminer","free"],"operationId":"get-linkminer-favorites-by-list-id","summary":"See favorite links","description":"Get a single favorite-link list together with the full data of every backlink it contains. Useful for rendering a saved backlink set in your UI.","parameters":[{"name":"list_id","description":"list ID","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/FavoriteList"}],"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]},"delete":{"tags":["linkminer","free"],"operationId":"delete-linkminer-favorites-by-list-id","summary":"Delete a favorite list","description":"Delete a favorite-link list from your account. Does not affect the underlying backlinks returned by `/linkminer/links`. Returns HTTP 204.","parameters":[{"name":"list_id","description":"list ID","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Favorite list deleted. Returns HTTP 204 with an empty response body."},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/requests":{"get":{"tags":["linkminer","free"],"operationId":"get-linkminer-requests","summary":"Get latest used requests","description":"Get the history of your recent backlink lookups performed through `/linkminer/links`. Each entry includes the target URL, source type (all / new / lost) and the `links_per_domain` parameter that was used — useful for rebuilding a \"recent searches\" panel in a client.","parameters":[],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","description":"ID of the backlink lookup."},"t":{"type":"integer","description":"Entry type, always 0."},"created":{"type":"integer","description":"Unix timestamp (seconds) of the lookup."},"url":{"type":"string","description":"The looked-up URL."},"source":{"type":"integer","description":"Link source: 0 all, 1 new, 2 lost."},"links_per_domain":{"type":"integer","description":"The links_per_domain value that was used."}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/exports":{"get":{"tags":["linkminer","free"],"operationId":"get-linkminer-exports","summary":"Get list of all exports, sorted by created_at","description":"Get all full backlink CSV exports you have created, sorted by creation date (newest first). Each entry describes the target URL, the filters that were applied, the cost and the processing state. Once an export is ready, a `downloadURL` pointing to the generated CSV is included. The download link is returned for 60 days after the export completes.","parameters":[],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"List of BackLinkExport","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BackLinkExport"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"x-quota-pool":"links","tags":["linkminer","paid"],"operationId":"post-linkminer-exports","summary":"Create new exports task","description":"Create a new full-backlink CSV export job for a target URL, domain or subdomain. The export is generated asynchronously — poll `/linkminer/exports` to track state and to obtain the `downloadURL` once the job completes.\n\n### Prerequisites\n\nCall `POST /linkminer/exports/suggest` first for the same URL to determine the available target types and the estimated cost; the export request requires a matching suggestion.\n\n### Limits\n\nThe export cost is subtracted from your **Backlink rows** limit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Target in various formats (example.com, www.example.com, http://example.com). Must match one of the targets returned by POST /linkminer/exports/suggest.","example":"example.com"},"limit":{"type":"integer","description":"Optional cap on the number of backlink rows to export. When omitted the full suggested cost is used; otherwise the smaller of the suggested cost and this limit is charged.","example":10000},"filter":{"type":"object","description":"Optional backlink filter applied to the export (same fields as the LinkMiner backlink filter).","properties":{"targetAnchorText":{"type":"string"},"targetHrefText":{"type":"string"},"linkType":{"type":"string"},"noFollow":{"type":"boolean"},"liveLinks":{"type":"boolean"},"minCitationFlow":{"type":"integer"},"maxCitationFlow":{"type":"integer"},"minTrustFlow":{"type":"integer"},"maxTrustFlow":{"type":"integer"},"minTopRank":{"type":"integer"},"maxTopRank":{"type":"integer"},"minLinkStrength":{"type":"integer"},"maxLinkStrength":{"type":"integer"},"flagTextLink":{"type":"boolean"},"flagImageLink":{"type":"boolean"},"flagFrameLink":{"type":"boolean"},"flagRedirectLink":{"type":"boolean"},"flagMentionLink":{"type":"boolean"},"linksPerDomain":{"type":"integer"}}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"The created export job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackLinkExport"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/siteprofiler/overview":{"get":{"x-quota-pool":"sp-overview","tags":["siteprofiler","paid"],"operationId":"get-siteprofiler-overview","summary":"Get URL metrics overview","description":"With this endpoint you will get the following details for a specific URL or (sub)domain:\n   * Domain Authority (MOZ)\n   * Page Authority (MOZ)\n   * Citation Flow (Majestic)\n   * Trust flow (Majestic)\n   * TopRank rank with history (since 2016 when available)\n   * Referring IPs with history (since 2016 when available)\n   * Facebook shares with history (since 2016 when available)\n","parameters":[{"name":"url","description":"Target URL / domain / subdomain","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SPMetrics"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/siteprofiler/audience":{"get":{"tags":["siteprofiler","free"],"operationId":"get-siteprofiler-audience","summary":"Get audience for siteprofiler","description":"### Prerequisites\nCall `/siteprofiler/overview` for the same URL first (within the last 24 hours). Without a recent overview lookup the endpoint returns HTTP 429 `Not in history`.\n","parameters":[{"name":"url","description":"Target URL / domain / subdomain","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Audience data is not available through the API. The operation always returns HTTP 204 with an empty body."},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/siteprofiler/backlink-profile":{"get":{"tags":["siteprofiler","free"],"operationId":"get-siteprofiler-backlink-profile","summary":"Get backlink-profile for siteprofiler","description":"With this endpoint you will get a backlink profile for a given URL. When a domain is requested, it returns the stats of the whole domain.\n\n### Prerequisites\nCall `/siteprofiler/overview` for the same URL first (within the last 24 hours). Without a recent overview lookup the endpoint returns HTTP 429 `Not in history`.\n","parameters":[{"name":"url","description":"Target URL / domain / subdomain","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SPBacklinkProfile"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/siteprofiler/top-content":{"get":{"tags":["siteprofiler","free"],"operationId":"get-siteprofiler-top-content","summary":"Get top-content for siteprofiler","description":"### Prerequisites\nCall `/siteprofiler/overview` for the same URL first (within the last 24 hours). Without a recent overview lookup the endpoint returns HTTP 429 `Not in history`.\n","parameters":[{"name":"url","description":"Target URL / domain / subdomain","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SPTopContent"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/siteprofiler/competitors":{"get":{"tags":["siteprofiler","free"],"operationId":"get-siteprofiler-competitors","summary":"Get competitors for siteprofiler","description":"### Prerequisites\nCall `/siteprofiler/overview` for the same URL first (within the last 24 hours). Without a recent overview lookup the endpoint returns HTTP 429 `Not in history`.\n","parameters":[{"name":"url","description":"Target URL / domain / subdomain","in":"query","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SPCompetitors"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/siteprofiler/requests":{"get":{"tags":["siteprofiler","free"],"operationId":"get-siteprofiler-requests","summary":"Get recent lookups","description":"Get your 50 most recent SiteProfiler lookups, newest first. Each entry is the analyzed URL or domain as a string, useful for rebuilding a \"recent analyses\" panel in a client.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"example":["example.com"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings":{"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings","summary":"Create tracking","description":"Create a new rank tracking for a single domain on a specific search location and platform. Pass the target `domain`, an initial list of `keywords`, the `location_id` and `platform_id`. Once the tracking is created, its keywords are queued for SERP crawl and default weekly and monthly email reports are automatically generated.\n\n### Platforms\n\nUse `platform_id` to choose the platform: 1 for desktop, 2 for mobile. For multiple platforms in a single call, see `/serpwatcher/multiple-trackings`.\n\n### Duplicates\n\nA tracking with the same domain, location and platform already in use returns HTTP 409.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["domain","location_id","platform_id","keywords"],"properties":{"domain":{"type":"string"},"location_id":{"type":"integer"},"platform_id":{"type":"integer"},"keywords":{"type":"array","items":{"type":"string"}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Created new tracking.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingPost"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"}}},"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-trackings","summary":"Get all trackings","description":"Get all rank tracking campaigns owned by your account, sorted by creation date (newest first). Each tracking includes its location and the current count of tracked keywords. Set `is_with_deleted=true` to also include previously deleted trackings in the response.","parameters":[{"name":"from","in":"query","description":"Filter from date","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"Filter to date","required":false,"schema":{"type":"string"}},{"name":"is_with_deleted","in":"query","description":"Set if return also deleted trackings","required":false,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns all trackings","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Tracking"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings/{tracking_id}":{"delete":{"tags":["serpwatcher","free"],"operationId":"delete-serpwatcher-trackings-by-tracking-id","summary":"Remove tracking","description":"Delete a rank tracking together with all its tracked keywords and email reports. Returns HTTP 204.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Removed tracking"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"patch":{"tags":["serpwatcher","free"],"operationId":"patch-serpwatcher-trackings-by-tracking-id","summary":"Change the domain or the local-SEO configuration of a tracking","description":"Update the target domain of a tracking, or its local-SEO configuration (Google Business Profile `place_id` together with the business name and address).\n\nAt least one changed field is required. Updating to a domain, location and platform combination already used by another active tracking returns HTTP 409.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"New domain name for the tracking.","example":"mangools.com"},"tracking_config":{"type":"object","description":"Local-SEO configuration. Set place_id (with optional name/address/ludocid) to attach a Google Business Profile, or place_id=null to clear it.","properties":{"place_id":{"type":"string","nullable":true,"description":"Google Business Profile place_id, or null to remove the local-SEO configuration."},"ludocid":{"type":"string","nullable":true,"description":"Google Local Unified Data Center ID."},"name":{"type":"string","nullable":true,"description":"Business name."},"address":{"type":"string","nullable":true,"description":"Business address."}}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"The updated tracking together with the change annotation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingUpdateResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/serpwatcher/trackings/{tracking_id}/detail":{"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-trackings-by-tracking-id-detail","summary":"Get tracking detail and its keywords","description":"Get a lightweight snapshot of a tracking together with its tracked keyword list for the requested date range (`from`, `to`). Each keyword includes its id, text, currently ranking URL (as of the latest date), assigned tags and last-check timestamp. Rank history and aggregated statistics are intentionally omitted — use `POST /serpwatcher/trackings/{tracking_id}/stats` for those.\n\nSet `is_with_deleted=true` to include previously deleted keywords.\n\n### Shared access\n\nThe endpoint also accepts a read-only `share_token` query parameter, allowing dashboards to be shared without exposing account credentials.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Has no effect on the response.","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"Filter to date","required":false,"schema":{"type":"string"}},{"name":"is_with_deleted","in":"query","description":"Ability to return deleted kws","required":false,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTrackingDetailRes"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/trackings/{tracking_id}/stats":{"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings-by-tracking-id-stats","summary":"Get detail of tracking","description":"Get aggregated rank tracking statistics and per-keyword rank data for a tracking over the requested date range (`from`, `to`).\n\nFor each keyword the response contains:\n\n* current rank, best rank and average rank\n* rank change and estimated visits deltas\n* rank history sampled across the range\n* presence and position in Map Pack and Featured Snippet\n* detected SERP features\n* last-check and last-crawl timestamps\n\nOptionally pass `kwIds` in the request body to limit the response to a specific subset of tracked keywords. The response also includes annotations overlapping the date range.\n\n### Shared access\n\nSupports a read-only `share_token` for sharing a dashboard without account credentials.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Filter from date","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"Filter to date","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kwIds":{"type":"array","items":{"type":"string"},"description":"Restrict the statistics to these tracked keyword IDs. Omit to cover every keyword in the tracking."}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTrackingStatsRes"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/multiple-trackings":{"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-multiple-trackings","summary":"Create trackings","description":"Create multiple rank trackings at once for the same domain and keyword set. Pass `location_ids[]` and `platform_ids[]` — the endpoint creates a tracking for every (location × platform) combination that does not yet exist for the domain. Each new tracking receives the full keyword list and default weekly and monthly email reports.\n\nCombinations already covered by an active tracking are skipped silently. If every combination already exists, the endpoint returns HTTP 409.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["domain","location_ids","platform_ids","keywords"],"properties":{"domain":{"type":"string"},"location_ids":{"type":"array","items":{"type":"integer"}},"platform_ids":{"type":"array","items":{"type":"integer"}},"keywords":{"type":"array","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string","description":"Keyword to track."}}}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Created new trackings.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrackingPost"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/ValidationFailed"}}}},"/serpwatcher/trackings/{tracking_id}/tracked-keywords":{"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-trackings-by-tracking-id-tracked-keywords","summary":"Get all tracked keywords","description":"Get the full list of tracked keywords for a tracking. Each keyword is enriched with search volume and monthly search volume data.\n\nUse the `fields` query parameter to trim the returned attributes — pass a comma-separated list, e.g. `fields=kw,location_id,platform_id,rank`.","parameters":[{"name":"tracking_id","in":"path","description":"id of tracking","required":true,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Filter of attributes for returned objects. Specify in format (separate\nwith comma):\ntracking_id,keyword_id,kw,location_id,platform_id,rank,sv,active,history\n","required":false,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns all tracked keywords.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrackedKeyword"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings-by-tracking-id-tracked-keywords","summary":"Track another keyword","description":"Add new keywords to an existing tracking.\n\nRequest body:\n\n* `keywords` — array of keyword strings to add\n* `tag_ids` — optional array of tag IDs to assign to every added keyword (tags must already exist on the tracking)\n\nKeywords already tracked on this tracking are not re-added — their tags are simply extended with the provided ones. Only truly new keywords count against your tracked-keyword limit. The response returns both existing and newly added keywords in a single merged list.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["tag_ids","keywords"],"properties":{"keywords":{"type":"array","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string","description":"Keyword to track."}}}},"tag_ids":{"type":"array","items":{"type":"string"}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Result ok.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackedKeywordsAddRes"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"}}},"delete":{"tags":["serpwatcher","free"],"operationId":"delete-serpwatcher-trackings-by-tracking-id-tracked-keywords","summary":"Remove keyword from tracking","description":"Remove one or more tracked keywords from a tracking. Pass the target IDs in the request body as `tracked_keyword_ids` (non-empty array). The tracking's statistics are recomputed.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["tracked_keyword_ids"],"properties":{"tracked_keyword_ids":{"type":"array","items":{"type":"string"},"description":"IDs of tracked keywords to remove (non-empty array).","example":["5f9b1c2e3a4b5c6d7e8f9012"]}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Keywords removed. The body is empty."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/trackings/{tracking_id}/tracked-keywords/{tracked_keyword_id}":{"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-trackings-by-tracking-id-tracked-keywords-by-tracked-keyword-id","summary":"Get tracked keywords in tracking list","description":"Get the full rank detail for a single tracked keyword in a tracking.\n\nThe response includes:\n\n* ranking URLs split across organic, Map Pack and Featured Snippet, each with per-day rank, visual metrics and estimated visits\n* daily rank series across the requested `from`/`to` window, including Map Pack and Featured Snippet ranks\n* current and previous search volume\n* SERP snapshot preview link (when a recent snapshot is available)\n* assigned tags, last-check and created timestamps\n\n### Shared access\n\nSupports a read-only `share_token` query parameter for share-link access.","parameters":[{"name":"tracking_id","in":"path","description":"tracking_id","required":true,"schema":{"type":"string"}},{"name":"tracked_keyword_id","in":"path","description":"tracked_keyword_id","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Filter from date","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"Filter to date","required":false,"schema":{"type":"string"}},{"name":"share_token","in":"query","description":"share_token","required":false,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"The tracked keyword","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackedKeywordDetail"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/trackings/{tracking_id}/reports":{"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-trackings-by-tracking-id-reports","summary":"Get all reports","description":"Get all scheduled email reports configured on a tracking (weekly, monthly, and rank-change alerts), sorted by creation date (newest first). Each report includes its type, name and the list of recipient email addresses.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns all reports.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Report"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings-by-tracking-id-reports","summary":"Create new report","description":"Configure a new scheduled email report or rank-change alert for a tracking.\n\nRequired fields:\n\n* `name` — human-readable report name\n* `type` — report type (weekly, monthly or rank-change alert)\n* `emails` — non-empty array of recipient email addresses\n* `triggers` — optional array of trigger types for rank-change alert reports","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["emails","type","name"],"properties":{"emails":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"type":{"type":"integer","enum":[0,1,2],"description":"Report type: 0 rank-change alert, 1 weekly, 2 monthly."},"triggers":{"type":"array","items":{"type":"integer"}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Created new report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings/{tracking_id}/reports/{report_id}":{"put":{"tags":["serpwatcher","free"],"operationId":"put-serpwatcher-trackings-by-tracking-id-reports-by-report-id","summary":"Update report","description":"Update the configuration of an existing scheduled email report — change its name, type, recipient emails list or triggers. Returns HTTP 204.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}},{"name":"report_id","in":"path","description":"Report ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["emails","type","name"],"properties":{"emails":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"type":{"type":"integer"},"triggers":{"type":"array","items":{"type":"integer"}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Report updated. Returns HTTP 204 with an empty response body."},"401":{"$ref":"#/components/responses/Unauthorized"}}},"delete":{"tags":["serpwatcher","free"],"operationId":"delete-serpwatcher-trackings-by-tracking-id-reports-by-report-id","summary":"Remove report","description":"Remove a scheduled email report from a tracking. Returns HTTP 204.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}},{"name":"report_id","in":"path","description":"Report ID","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Result ok."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/trackings/{tracking_id}/annotations":{"post":{"tags":["serpwatcher","free"],"summary":"Creates new annotation","description":"Create a user annotation pinned to a specific date on the tracking timeline. Annotations are rendered as markers on rank history charts and help explain ranking changes (site launches, marketing campaigns, algorithm updates, etc.).\n\nRequired fields:\n\n* `date` — annotation date in `YYYY-MM-DD` format\n* `text` — annotation text\n* `nonShareable` — optional boolean; when `true` the annotation is hidden from shared dashboard links","operationId":"createTrackingAnnotation","parameters":[{"name":"tracking_id","in":"path","description":"ID of Tracking that the annotation will be created on","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"description":"Annotation date (YYYY-MM-DD)","type":"string"},"text":{"description":"Annotation text","type":"string"}},"required":["date","text"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Annotation created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Annotation"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings/{tracking_id}/annotations/{annotation_id}":{"put":{"tags":["serpwatcher","free"],"operationId":"put-serpwatcher-trackings-by-tracking-id-annotations-by-annotation-id","summary":"Change annotation text","description":"Update an existing user annotation on a tracking — change its text, date (`YYYY-MM-DD`) or `nonShareable` flag. Returns HTTP 204.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}},{"name":"annotation_id","in":"path","description":"annotation ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Annotation updated. Returns HTTP 204 with an empty response body."},"401":{"$ref":"#/components/responses/Unauthorized"}}},"delete":{"tags":["serpwatcher","free"],"operationId":"delete-serpwatcher-trackings-by-tracking-id-annotations-by-annotation-id","summary":"Remove annotation","description":"Delete a user annotation from a tracking's timeline. Returns HTTP 204.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}},{"name":"annotation_id","in":"path","description":"annotation ID","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Removed object"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/tags":{"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-tags","summary":"Get all tags","description":"Get all keyword tags owned by your account across every tracking, sorted by creation date (newest first). Tags are color-coded labels used to organize tracked keywords and filter rank tracking statistics. For a list scoped to a single tracking, use `GET /serpwatcher/trackings/{tracking_id}/tags`.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Result ok.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings/{tracking_id}/tags":{"get":{"tags":["serpwatcher","free"],"operationId":"get-serpwatcher-trackings-by-tracking-id-tags","summary":"Get all tags for tracking","description":"Get all tags scoped to a specific tracking, sorted by creation date (newest first). For a cross-tracking list, use `GET /serpwatcher/tags`.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Returns all tags for tracking","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings-by-tracking-id-tags","summary":"Create new tag for tracking","description":"Create a new tag on a tracking.\n\nRequired fields:\n\n* `name` — tag label\n* `color` — tag color\n\nOnce created, tags can be attached to tracked keywords via `POST /serpwatcher/trackings/{tracking_id}/tags/assign`.","parameters":[{"in":"path","name":"tracking_id","description":"Tracking ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["color","name"],"properties":{"name":{"type":"string"},"color":{"type":"string"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Created new tag for tracking successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings/{tracking_id}/tags/{tag_id}":{"put":{"tags":["serpwatcher","free"],"operationId":"put-serpwatcher-trackings-by-tracking-id-tags-by-tag-id","summary":"Updates tag","description":"Update an existing tag — change its `name` and/or `color`. The change is reflected everywhere the tag is rendered (keyword lists, statistics, email reports). Returns HTTP 204.","parameters":[{"in":"path","name":"tracking_id","description":"Tracking ID","required":true,"schema":{"type":"string"}},{"in":"path","name":"tag_id","description":"Tag ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["color","name"],"properties":{"name":{"type":"string"},"color":{"type":"string"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Tag updated. Returns HTTP 204 with an empty response body."},"401":{"$ref":"#/components/responses/Unauthorized"}}},"delete":{"tags":["serpwatcher","free"],"operationId":"delete-serpwatcher-trackings-by-tracking-id-tags-by-tag-id","summary":"Delete tag","description":"Delete a tag from a tracking. Once deleted, the tag is also removed from every tracked keyword that references it. Returns HTTP 204.","parameters":[{"name":"tracking_id","in":"path","description":"Tracking ID","required":true,"schema":{"type":"string"}},{"name":"tag_id","in":"path","description":"Tag ID","required":true,"schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"The tag was deleted. The body is empty."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/serpwatcher/trackings/{tracking_id}/tags/assign":{"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings-by-tracking-id-tags-assign","summary":"Assign tracking with tag","description":"Attach one or more tags to one or more tracked keywords in a single call. Both `keyword_ids` (tracked keyword IDs) and `tag_ids` are required. Existing tag assignments are preserved — the provided tags are merged with the current set so duplicates are avoided. Returns HTTP 204.","parameters":[{"in":"path","name":"tracking_id","description":"Tracking ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["keyword_ids","tag_ids"],"properties":{"keyword_ids":{"type":"array","items":{"type":"string"}},"tag_ids":{"type":"array","items":{"type":"string"}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"Tags assigned. Returns HTTP 204 with an empty response body."},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/serpwatcher/trackings/{tracking_id}/tags/unassign":{"post":{"tags":["serpwatcher","free"],"operationId":"post-serpwatcher-trackings-by-tracking-id-tags-unassign","summary":"Unassign tag from tracking","description":"Detach one or more tags from one or more tracked keywords in a single call. Both `keyword_ids` (tracked keyword IDs) and `tag_ids` are required. Tags not currently assigned are ignored silently.","parameters":[{"in":"path","name":"tracking_id","description":"Tracking ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["keyword_ids","tag_ids"],"properties":{"keyword_ids":{"type":"array","items":{"type":"string"}},"tag_ids":{"type":"array","items":{"type":"string"}}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"204":{"description":"The tags were unassigned. The body is empty."},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/mangools/locations":{"get":{"tags":["kwfinder","serpchecker","serpwatcher","aisearchwatcher","mangools","free"],"operationId":"get-mangools-locations","summary":"Get list of all locations","description":"Search supported geotargeting locations by name. Pass a search `query` (country, region or city name, e.g. `New York`). Returns up to 100 matching active locations ordered by type and name, each with country code, canonical name and location ID.\n\nThis is a shared endpoint — the same `location_id` values are used across KWFinder, SERPChecker, SERPWatcher and AI Search Watcher whenever an endpoint accepts a location parameter.\n\nFor the complete reference of Google geotargeting IDs, see [Google Ads geotargeting](https://developers.google.com/google-ads/api/data/geotargets).","parameters":[{"name":"query","in":"query","description":"Name of location","required":true,"schema":{"type":"string"},"example":"New York"}],"security":[],"responses":{"200":{"description":"Returns an array of Location objects","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Location"}},"examples":{"Locations":{"$ref":"#/components/examples/Locations"}}}}},"429":{"$ref":"#/components/responses/GatewayRateLimited"}}}},"/mangools/locations/{location}":{"get":{"tags":["kwfinder","serpchecker","serpwatcher","aisearchwatcher","mangools","free"],"operationId":"get-mangools-locations-by-location","summary":"Get detail of location","description":"Get a single geotargeting location by its ID. Useful when you already know the `location_id` (e.g. from a previous search or persisted in your data) and need to resolve its canonical name, country code and hierarchy.\n\nThis is a shared endpoint — the same `location_id` values are used across KWFinder, SERPChecker, SERPWatcher and AI Search Watcher. Returns HTTP 404 when the ID is not recognized.","parameters":[{"name":"location","in":"path","description":"Location ID","required":true,"schema":{"type":"integer"},"example":21167}],"security":[],"responses":{"200":{"description":"Returns Location object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Location"},"examples":{"Location":{"$ref":"#/components/examples/Location"}}}}},"404":{"description":"No location matches the supplied ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Location not found"}}}}},"429":{"$ref":"#/components/responses/GatewayRateLimited"}}}},"/aiwatcher/models":{"get":{"tags":["aisearchwatcher","free"],"operationId":"get-aiwatcher-models","summary":"Get available AI models","description":"Get the list of AI models available for brand monitoring (ChatGPT, Gemini, Claude, and others). Each entry gives the numeric `id`, the model path, the display name and flags that tell whether the model can be added to a new monitor. Use the `id` values of models that are not deprecated when configuring a monitor via `POST /aiwatcher/monitor`.","responses":{"200":{"description":"AI models retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"models":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Numeric model identifier"},"model":{"type":"string","description":"Model identifier."},"name":{"type":"string","description":"Model display name"},"active":{"type":"boolean","description":"Whether Mangools currently runs prompts on this model."},"deprecated":{"type":"boolean","description":"Deprecated models keep running on existing monitors but are rejected when a monitor is created."},"supportsCitations":{"type":"boolean","description":"Whether the model's answers include cited sources."},"isSerp":{"type":"boolean","description":"True for Google AI Overviews, which appear on the Google results page; false for chat models."}}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Internal server error"}}}}}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/monitors":{"get":{"tags":["aisearchwatcher","free"],"operationId":"get-aiwatcher-monitors","summary":"Get all AI monitors for user","description":"Get all AI Search Watcher brand monitors owned by your account. Each monitor describes a brand being tracked across AI answer engines — its name, domain, location, language and monitoring state. Use `GET /aiwatcher/monitor/{id}` for the full details and analytics of a specific monitor.","responses":{"200":{"description":"List of monitors retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"monitors":{"type":"array","items":{"$ref":"#/components/schemas/AIMonitorListItem"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"description":"Invalid input parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"ValidationError","message":"Your request is invalid","errors":["Your request is invalid"]}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Internal server error"}}}}}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/monitor":{"post":{"tags":["aisearchwatcher","free"],"operationId":"post-aiwatcher-monitor","summary":"Create AI monitoring for a brand","description":"Create a new AI Search Watcher brand monitor — a tracked setup that measures how often a brand is mentioned and cited by AI answer engines (ChatGPT, Gemini, Claude, etc.) for a given set of prompts.\n\nRequest body:\n\n* `brand` — brand name to monitor\n* `domain` — brand domain\n* `location_id` — location used when collecting AI responses (see `/mangools/locations`)\n* `platform_id` — search platform (`1` = desktop, `2` = mobile)\n* `models` — array of numeric AI model IDs to run the prompts against, as returned in `id` by `GET /aiwatcher/models`\n* `prompts` — array of prompt strings the monitor will send to each model\n* `language_id` — optional language for localization\n\nReturns the newly created monitor's `_id`. Use `POST /aiwatcher/prompts/generate` first to obtain AI-suggested prompt ideas for a given brand.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["location_id","platform_id","brand","domain","models","prompts"],"properties":{"location_id":{"type":"number","description":"Location the AI answers are collected for (see GET /mangools/locations). 0 (Anywhere) is not supported."},"platform_id":{"type":"number","description":"Platform ID (1=desktop, 2=mobile)"},"brand":{"type":"string","description":"Brand name to monitor"},"domain":{"type":"string","description":"Brand domain"},"models":{"type":"array","items":{"type":"integer"},"description":"IDs of the AI models to monitor, as returned in `id` by `GET /aiwatcher/models`."},"prompts":{"type":"array","items":{"type":"string"},"description":"Array of monitoring prompts"},"language_id":{"type":"number","description":"Language ID for localization (optional). When it is missing, 0 or not a known language, the monitor gets the location's default language from DataForSEO Labs, or English when Labs has none we list."}}}}}},"responses":{"201":{"description":"Monitor created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"Monitor ID"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/monitor/{id}":{"get":{"tags":["aisearchwatcher","free"],"operationId":"get-aiwatcher-monitor-by-id","summary":"Get AI monitoring detail for a brand","description":"Get detailed analytics for a single AI Search Watcher monitor — how often the brand is mentioned across the configured AI models and prompts, citation sources returned by the models, and visibility changes over time.\n\nQuery parameters:\n\n* `models` — comma-separated model IDs to include (pass `0` for an all-models overview)\n* `from`, `to` — date range for the returned metrics (`YYYY-MM-DD`)","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Monitor ID"},{"in":"query","name":"models","schema":{"type":"string"},"description":"Comma-separated model IDs (0 means all models overview)"},{"in":"query","name":"from","schema":{"type":"string","format":"date"},"description":"Start date for data range"},{"in":"query","name":"to","schema":{"type":"string","format":"date"},"description":"End date for data range"}],"responses":{"200":{"description":"Monitor details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIMonitorDashboard"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"description":"Invalid input parameters, or no monitor with this ID (message \"Monitor not found\").","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"ValidationError","message":"Your request is invalid","errors":["Your request is invalid"]}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Internal server error"}}}}}},"security":[{"ApiKeyAuth":[]}]},"delete":{"tags":["aisearchwatcher","free"],"operationId":"delete-aiwatcher-monitor-by-id","summary":"Delete AI monitoring for a brand","description":"Delete an AI Search Watcher brand monitor from your account together with its prompts, reports and tags. The monitor stops collecting responses immediately, and its data is no longer returned by the API. Returns HTTP 200 with an empty object on success.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Monitor ID"}],"responses":{"200":{"description":"The monitor was deleted. The body is an empty JSON object.","content":{"application/json":{"schema":{"type":"object","example":{},"additionalProperties":false}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Monitor not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Monitor not found"}}}}},"422":{"description":"Invalid monitor ID format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"ValidationError","message":"Your request is invalid","errors":["Your request is invalid"]}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Internal server error"}}}}}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/prompts/generate":{"post":{"tags":["aisearchwatcher","free"],"operationId":"post-aiwatcher-prompts-generate","summary":"Generate AI prompts for brand monitoring","description":"Generate suggested monitoring prompts and a brand-perception summary for a given brand — useful during monitor onboarding so users do not have to come up with AI Search Watcher prompts manually.\n\nRequest body:\n\n* `brand` — brand name to analyze\n* `domain` — accepted but not used when generating prompts\n* `location_id` — accepted but not used when generating prompts\n* `platform_id` — accepted but not used when generating prompts\n* `language_id` — optional language for prompt generation\n\nResponse:\n\n* `prompts` — array of suggested prompt strings ready to pass into `POST /aiwatcher/monitor`\n* `maxGeneratePrompts` — maximum number of prompts the current plan allows to generate\n* `perception` — a short textual summary of how AI models currently describe the brand","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["location_id","platform_id","brand","domain"],"properties":{"location_id":{"type":"number","description":"Accepted but not used when generating prompts."},"platform_id":{"type":"number","description":"Accepted but not used when generating prompts. 1 = desktop, 2 = mobile."},"brand":{"type":"string","description":"Brand name to analyze"},"domain":{"type":"string","description":"Accepted but not used when generating prompts."},"language_id":{"type":"number","description":"Language ID for prompt generation (optional)"}}}}}},"responses":{"200":{"description":"Generated prompts and perception","content":{"application/json":{"schema":{"type":"object","properties":{"prompts":{"type":"array","items":{"type":"string"},"description":"Generated monitoring prompts"},"perception":{"type":"string","description":"Brand perception description"},"maxGeneratePrompts":{"type":"integer","description":"Maximum number of prompts the current plan allows to generate."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/prompt/{id}":{"get":{"tags":["aisearchwatcher","free"],"operationId":"get-aiwatcher-prompt-by-id","summary":"Get prompt detail","description":"Get detailed metrics for a single monitoring prompt — how each configured AI model responds to it, brand mention counts, citation URLs extracted from the responses, and visibility changes over time.\n\nQuery parameters:\n\n* `from`, `to` — date range (`YYYY-MM-DD`)\n* `models` — optional comma-separated model IDs\n\nUseful for rendering a prompt-level drilldown inside a monitor dashboard.","parameters":[{"name":"id","in":"path","required":true,"description":"Prompt ID","schema":{"type":"string"}},{"name":"from","in":"query","description":"Start date for metrics (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"to","in":"query","description":"End date for metrics (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"models","in":"query","description":"Comma-separated model IDs, or 0 for all models.","schema":{"type":"string"}}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Prompt detail with metrics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIWatcherPromptDetail"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Prompt not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Prompt not found"}}}}}}}},"/aiwatcher/prompts":{"delete":{"tags":["aisearchwatcher","free"],"operationId":"delete-aiwatcher-prompts","summary":"Delete prompts","description":"Delete one or more monitoring prompts across monitors in a single bulk call.\n\nRequest body:\n\n* `prompt_ids` — non-empty array of prompt IDs to delete\n\nRemaining prompts on the affected monitors continue collecting responses on the next scheduled run. The response returns `deleted_count`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt_ids"],"properties":{"prompt_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Array of prompt IDs to delete"}}}}}},"responses":{"200":{"description":"Prompts deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"deleted_count":{"type":"integer","description":"Number of prompts deleted"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"ValidationError","message":"Your request is invalid","errors":["Your request is invalid"]}}}}}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/monitor/{id}/prompts":{"get":{"tags":["aisearchwatcher","free"],"operationId":"get-aiwatcher-monitor-by-id-prompts","summary":"Get prompt details","description":"Get the list of monitoring prompts attached to a monitor. Each prompt entry includes its id, text, tags, creation and update timestamps, its metrics for the requested date range and its Google AI Overview information.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Prompt details retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIMonitorPromptList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"ApiKeyAuth":[]}]},"post":{"tags":["aisearchwatcher","free"],"operationId":"post-aiwatcher-monitor-by-id-prompts","summary":"Add prompts to a monitor","description":"Add one or more new prompts to an existing monitor.\n\nRequest body:\n\n* `prompts` — non-empty array of prompt strings to add\n\nThe monitor starts collecting responses for the new prompts across its configured AI models on the next scheduled run. The response returns `added_count` and the added prompts.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Monitor ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompts"],"properties":{"prompts":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Array of prompts to add"}}}}}},"responses":{"200":{"description":"Prompts added successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIMonitorPromptsAddRes"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Monitor not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Monitor not found"}}}}}},"security":[{"ApiKeyAuth":[]}]}},"/aiwatcher/monitor/{id}/settings":{"get":{"tags":["aisearchwatcher","free"],"operationId":"get-aiwatcher-monitor-by-id-settings","summary":"Get monitor settings","description":"Get the current configuration of a monitor — brand name, brand variations, domain, location, configured AI models, language, active email reports and notification settings. Useful for populating a settings form in a client.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Monitor ID"}],"responses":{"200":{"description":"Settings retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"location_id":{"type":"number","description":"Location the AI answers are collected for."},"brand":{"type":"string","description":"Brand name"},"domain":{"type":"string","description":"Brand domain"},"models":{"type":"array","items":{"type":"integer"},"description":"IDs of the AI models the monitor runs on, as returned in `id` by `GET /aiwatcher/models`."},"language_id":{"type":"number","description":"Language ID for localization"},"reports_active":{"type":"array","items":{"type":"integer","enum":[3,4]},"description":"Active email reports: 3 weekly, 4 monthly."},"brandVariations":{"type":"array","description":"Brand name variations used for matching.","items":{"type":"string"}},"status_notifications":{"type":"boolean","description":"Whether status notification emails are enabled."},"hasPendingChanges":{"type":"boolean","description":"Whether the monitor has configuration changes that are not yet applied."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Monitor not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Monitor not found"}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Internal server error"}}}}}},"security":[{"ApiKeyAuth":[]}]},"put":{"tags":["aisearchwatcher","free"],"operationId":"put-aiwatcher-monitor-by-id-settings","summary":"Update monitor settings","description":"Update the configuration of an existing monitor: brand name, brand variations, domain, AI model list and email reports. Location, platform and language cannot be changed. Only the fields present in the request body are updated, and any other field is rejected with HTTP 422.","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Monitor ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"brand":{"type":"string","minLength":2,"maxLength":50,"description":"Brand name."},"brandVariations":{"type":"array","maxItems":10,"items":{"type":"string"},"description":"Brand name variations used for matching."},"domain":{"type":"string","description":"Brand domain."},"models":{"type":"array","items":{"type":"integer"},"description":"IDs of the AI models to monitor, as returned in `id` by `GET /aiwatcher/models`."},"reports_active":{"type":"array","items":{"type":"integer","enum":[3,4]},"description":"Email reports to keep active: 3 weekly report, 4 monthly report."},"brand_perception_display":{"type":"boolean","description":"Show the brand perception card in the dashboard."},"score_label_display":{"type":"boolean","description":"Show the score label in the dashboard."},"status_notifications":{"type":"boolean","description":"Send status notification emails."},"performance_cards_display":{"type":"boolean","description":"Show the performance cards in the dashboard."},"performance_summary_display":{"type":"boolean","description":"Show the performance summary in the dashboard."}}}}}},"responses":{"200":{"description":"Settings updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"Monitor ID"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Monitor not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Monitor not found"}}}}},"422":{"description":"Invalid input parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"ValidationError","message":"Your request is invalid","errors":["Your request is invalid"]}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Internal server error"}}}}}},"security":[{"ApiKeyAuth":[]}]}},"/linkminer/exports/suggest":{"post":{"x-quota-pool":"lm-suggest","tags":["linkminer","paid"],"operationId":"post-linkminer-exports-suggest","summary":"Get export suggestions for a URL","description":"Suggest available export targets for a given URL. For the input URL, the endpoint returns a list of related targets (root domain, subdomain, exact URL, and protocol variants) together with the number of backlinks indexed for each target and the estimated export cost (in backlink-row units).\n\nUse the returned suggestions to decide which target variant to export via `POST /linkminer/exports`.\n\n### Limits\n\nA suggestion that is not cached counts towards your lm-suggest pool.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Target in various formats (example.com, www.example.com, http://example.com).","example":"example.com"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Suggested export targets with their suggested type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackLinkExportSuggestionResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/InvalidParameter"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"schemas":{"Error":{"type":"object","description":"Canonical error envelope returned for every non-2xx response. The HTTP body is always an object with a single `error` property. `type` is the error class name, `message` is human-readable. `errors` appears only on validation failures (422). `retry_after` appears on the burst limit (429 RateLimit, the length of the burst window: 30 s for API-key clients, 1 s for the hosted MCP server; after waiting that long all slots are free again), on the keyword-import cooldown (429 RateLimit) and on the 500 returned when SERP data is temporarily unavailable; it is mirrored in a `Retry-After` response header. CreditLimit answers never carry it, and neither do the RateLimit answers a wait does not clear.","required":["error"],"properties":{"error":{"type":"object","required":["type","message"],"properties":{"type":{"type":"string","description":"Error class name. Values include: AuthError (401), ValidationError, InvalidInput and OutOfLimitException (422), MajesticError (423 or 424), FailedDependencyException (424, or 500 with retry_after when SERP data is temporarily unavailable), CreditLimit (429, credits or quota spent), RateLimit (429, too many requests: the keyword-import cooldown, the short-period burst limit or a temporary limit on backlink exports; a few endpoints also answer RateLimit when a precondition is not met, for example SiteProfiler's \"Not in history\", and waiting does not clear it), ParserException (500) and Error (for example 404 Not Found). Unexpected failures can carry other class names; treat any 5xx answer as a server error.","example":"Error"},"message":{"type":"string","description":"Human-readable error message.","example":"Not Found"},"errors":{"type":"array","items":{"type":"string"},"description":"Present only on validation failures (422 ValidationError): one message per failed rule.","example":["\"keyword\" is required"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying, also sent as the `Retry-After` response header. Sent with the burst limit and the keyword-import cooldown (both 429 RateLimit) and with the 500 returned when SERP data is temporarily unavailable. CreditLimit answers never carry it, and neither do the RateLimit answers that a wait does not clear — the precondition ones such as SiteProfiler's \"Not in history\".","example":30},"permanent_credits_used_up":{"type":"boolean","description":"Only on a 429 CreditLimit of an API or MCP request from a Free or Free+ account whose permanent credits for `resource` are used up, so the daily limit applies again. With it come `resource`, `limit` and `reset`.","example":true},"resource":{"type":"string","enum":["related-keywords","serps"],"description":"The daily pool that is spent. Sent with `permanent_credits_used_up`.","example":"related-keywords"},"limit":{"type":"integer","description":"Daily lookups of that pool. Sent with `permanent_credits_used_up`.","example":5},"reset":{"type":"integer","description":"Seconds until the daily pool resets (relative, NOT a unix timestamp). Sent with `permanent_credits_used_up`.","example":35000}}}}},"Keyword":{"type":"object","properties":{"_id":{"type":"string","description":"Keyword ID","example":"005de7e7771450763339653e918778ef"},"cpc":{"nullable":true,"type":"number","format":"double","description":"cost per click in USD","example":0.813559},"kw":{"type":"string","description":"Keyword text","example":"seo solutions"},"lid":{"type":"integer","description":"Location ID","example":0},"msv":{"type":"array","description":"Monthly search volumes, oldest first.","items":{"$ref":"#/components/schemas/MonthlySearchVolume"}},"ppc":{"nullable":true,"type":"number","format":"double","description":"Competition in pay-per-click advertising, from 0 (lowest) to 100 (highest).","example":15},"seo":{"nullable":true,"type":"integer","description":"Keyword difficulty, learn more: http://mngls.cm/kd","example":13},"seo_ts":{"nullable":true,"type":"integer","description":"Unix timestamp (seconds) of the last keyword difficulty calculation.","example":1590868935},"sv":{"nullable":true,"type":"integer","description":"Search volume","example":930},"svn":{"nullable":true,"type":"integer","description":"Normalized search volume","example":930},"svs":{"type":"integer","description":"Search volume source","example":0},"ts":{"type":"integer","description":"timestamp of last change","example":1592997076}}},"Language":{"type":"object","properties":{"code":{"nullable":true,"type":"string","example":"en","description":"Two-letter language code, or null for \"Any Language\" (`_id` 0)."},"label":{"type":"string","example":"English"},"_id":{"type":"integer","example":1000}}},"MonthlySearchVolume":{"type":"array","description":"One monthly search-volume sample as `[year, month, volume]`. The month is zero-based.","items":{"nullable":true,"type":"integer"},"minItems":3,"maxItems":3,"example":[2015,8,590]},"BackLinks":{"type":"object","properties":{"meta":{"type":"object","properties":{"url_type":{"type":"string","description":"Type of url.","example":"URL"},"available_links":{"type":"integer","description":"Total match of backlinks.","example":804}}},"links":{"type":"array","items":{"$ref":"#/components/schemas/BackLink"}}}},"BackLink":{"type":"object","properties":{"source":{"type":"string","description":"Source attribute","example":"https://example.org"},"target":{"type":"string","description":"Target","example":"https://example.com"},"title":{"nullable":true,"type":"string","description":"Crawled title","example":"Linux Systems Analyst"},"url":{"type":"string","example":"https://example.com","description":"Preview URL"},"type":{"type":"string","description":"type","example":"TextLink"},"anchor":{"type":"string","description":"anchor","example":"example.com"},"last_crawl":{"type":"string","example":"2021-04-07"},"first_seen":{"type":"string","example":"2021-04-07"},"last_seen":{"type":"string","example":"2021-04-07"},"source_tf":{"type":"integer","example":14},"source_cf":{"type":"integer","example":14},"target_tf":{"type":"integer","example":14},"target_cf":{"type":"integer","example":14},"redirect":{"type":"boolean","example":false},"frame":{"type":"boolean","example":false},"no_follow":{"type":"boolean","example":false},"image":{"type":"boolean","example":false},"alt":{"type":"boolean","example":false},"deleted":{"type":"boolean","example":false},"reason_lost":{"nullable":true,"type":"string","example":"null"},"category":{"nullable":true,"type":"string","example":"null"},"lang":{"nullable":true,"type":"string","example":"en"},"internal_links":{"nullable":true,"type":"integer","example":11},"external_links":{"nullable":true,"type":"integer","example":35},"fb":{"type":"number","nullable":true,"example":null},"ar":{"type":"number","nullable":true,"example":null},"ls":{"type":"integer","example":35},"_id":{"type":"string","example":"c1030729bd419e238a1e50351361fa56"},"domainId":{"type":"string","example":"example.org"}}},"FavoriteList":{"type":"object","properties":{"_id":{"type":"string","description":"Favorite list ID."},"domain":{"type":"string","description":"Target domain the list belongs to.","example":"example.com"},"user_id":{"type":"string","description":"ID of the user who owns the list."},"link_ids":{"type":"array","description":"IDs of the favorite links. Returned when a link is added to or removed from the list.","items":{"type":"string"}},"links":{"type":"array","description":"Full backlink data of every favorite link. Returned when a single list is read.","items":{"$ref":"#/components/schemas/BackLink"}},"updated_at":{"type":"number","description":"Unix timestamp (milliseconds) of the last update."},"created_at":{"type":"number","description":"Unix timestamp (milliseconds) of the creation."}}},"Location":{"type":"object","properties":{"_id":{"type":"integer","description":"_id attribute","example":1000},"name":{"type":"string","description":"name"},"country_code":{"type":"string","description":"country_code"},"canonical_name":{"type":"string","description":"canonical_name"},"code":{"type":"string","description":"code","example":"us"},"label":{"type":"string","description":"label","example":"New York,United States"},"google_domain":{"type":"string","description":"google_domain"},"type":{"type":"integer","description":"type"},"tld":{"type":"string","description":"Top-level domain associated with the location.","example":"us"},"active":{"type":"boolean","description":"False for locations Google Keyword Planner no longer supports. The search endpoint only returns active ones.","example":true},"created_at":{"type":"integer","description":"Unix timestamp (seconds) when the location was imported.","example":1588773715},"parent_id":{"type":"integer","nullable":true,"description":"ID of the enclosing location, or null for a country.","example":2840},"status":{"type":"string","description":"Google geo-target status.","example":"Active"},"target_type":{"type":"string","description":"Google geo-target granularity, e.g. `Country`, `State`, `City`.","example":"State"}}},"Limit":{"type":"object","properties":{"competitor-keywords-rows":{"type":"integer","example":2000},"related-keywords-rows":{"type":"integer","example":700},"reqs-per-short-period":{"type":"integer","example":3,"description":"Burst (short-period) request limit: the maximum number of requests allowed within a sliding window per resource pool, scoped per user (or per device when unauthenticated). The window is 30 seconds for API-key clients (REST, curl, SDKs, automation tools) and 1 second for the hosted MCP server. Exceeding it returns HTTP 429 RateLimit with `retry_after` and a `Retry-After` header, both the length of the window in seconds (30 or 1). The check is inclusive on the window boundary, so an API-key client should leave at least 11 seconds between requests to the same pool. This is independent of the daily/monthly quota in `resources`."},"api_quota":{"type":"object","description":"The separate daily quota for API and MCP requests. Present only when the account has an active Keyword API plan and no other paid plan (a free Mangools plan does not count), whatever the client; otherwise absent or null, so do not assume it is present. The Mangools apps keep their own limits in `resources`; on API and MCP requests, `resources.serps` and `resources.related-keywords` carry the same numbers as this object.","properties":{"related-keywords":{"type":"object","properties":{"limit":{"type":"integer","example":100,"description":"Daily lookups included in the Keyword API plan"},"remaining":{"type":"integer","example":99,"description":"Remaining lookups"},"reset":{"type":"integer","nullable":true,"example":35000,"description":"Seconds remaining until the quota resets (relative, NOT a unix timestamp). `null` while no period is running."}}},"serps":{"type":"object","properties":{"limit":{"type":"integer","example":100,"description":"Daily lookups included in the Keyword API plan"},"remaining":{"type":"integer","example":100,"description":"Remaining lookups"},"reset":{"type":"integer","nullable":true,"example":null,"description":"Seconds remaining until the quota resets (relative, NOT a unix timestamp). `null` while no period is running."}}}},"nullable":true},"permanent_credits":{"type":"object","description":"Present only for Free and Free+ accounts with a confirmed e-mail, without Full API access and without a Keyword API plan, whatever the client. One-time lookups for API and MCP requests at 1 request = 1 lookup; they never reset. An API or MCP request spends them before the daily limit in `resources`, one lookup per request. Before the first such request both carry the full amount. The successful response that spends the last lookup of a pool carries the header `x-mangools-permanent-credits-used-up` with a JSON object: `resource`, `limit` (the permanent credits), `daily_limit` and `reset` (seconds until the daily pool resets). A keyword lookup paid by a credit gets the Premium result sizes and pagination, and `related-keywords-rows` and `competitor-keywords-rows` in this response show them as long as keyword credits remain. On related keywords, competitor keywords (GET) and keyword gap, a lookup made in the app and repeated over the API or MCP within 24 hours spends a credit.","properties":{"related-keywords":{"type":"object","properties":{"limit":{"type":"integer","example":100,"description":"Keyword lookups granted to the account"},"remaining":{"type":"integer","example":99,"description":"Remaining lookups"}}},"serps":{"type":"object","properties":{"limit":{"type":"integer","example":100,"description":"SERP lookups granted to the account"},"remaining":{"type":"integer","example":100,"description":"Remaining lookups"}}}}},"resources":{"type":"object","properties":{"related-keywords":{"type":"object","properties":{"limit":{"type":"integer","example":500,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":497,"description":"Remaining lookups"},"reset":{"type":"integer","nullable":true,"example":7796,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month. `null` on the Keyword API pools while no period is running."}}},"trends":{"type":"object","properties":{"limit":{"type":"integer","example":500,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":499,"description":"Remaining lookups"},"reset":{"type":"integer","example":8300,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"tracked_keywords":{"type":"object","properties":{"limit":{"type":"integer","example":1651,"description":"Number of keywords your plan lets you track in SERPWatcher."},"remaining":{"type":"integer","example":1651,"description":"Keywords you can still add to trackings."}}},"serps":{"type":"object","properties":{"limit":{"type":"integer","example":500,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":496,"description":"Remaining lookups"},"reset":{"type":"integer","nullable":true,"example":7769,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month. `null` on the Keyword API pools while no period is running."}}},"links":{"type":"object","properties":{"limit":{"type":"integer","example":100000,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":99500,"description":"Remaining lookups"},"reset":{"type":"integer","example":572091,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"sch-url-metrics":{"type":"object","properties":{"limit":{"type":"integer","example":600,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":600,"description":"Remaining lookups"},"reset":{"type":"integer","example":7769,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"kw-url-metrics":{"type":"object","properties":{"limit":{"type":"integer","example":600,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":600,"description":"Remaining lookups"},"reset":{"type":"integer","example":7769,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"lm-url-metrics":{"type":"object","properties":{"limit":{"type":"integer","example":100000,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":99999,"description":"Remaining lookups"},"reset":{"type":"integer","example":14958,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"sp-overview":{"type":"object","properties":{"limit":{"type":"integer","example":70,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":70,"description":"Remaining lookups"},"reset":{"type":"integer","example":14958,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"lm-suggest":{"type":"object","properties":{"limit":{"type":"integer","example":100,"description":"Maximum available lookups"},"remaining":{"type":"integer","example":100,"description":"Remaining lookups"},"reset":{"type":"integer","example":14958,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"ai-watcher-prompts":{"type":"object","properties":{"limit":{"type":"integer","example":100,"description":"Number of AI Search Watcher prompts your plan allows."},"remaining":{"type":"integer","example":96,"description":"AI Search Watcher prompts you can still add."},"reset":{"type":"integer","nullable":true,"example":null,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"ai-watcher-monitors":{"type":"object","properties":{"limit":{"type":"integer","example":3,"description":"Number of AI Search Watcher monitors your plan allows."},"remaining":{"type":"integer","example":2,"description":"AI Search Watcher monitors you can still create."},"reset":{"type":"integer","nullable":true,"example":null,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}},"checked-keywords-ranks":{"type":"object","properties":{"limit":{"type":"integer","example":1651,"description":"Number of keywords your plan lets you track in SERPWatcher. Deprecated: the same allowance as tracked_keywords."},"remaining":{"type":"integer","example":1651,"description":"Keywords you can still add to trackings. Deprecated: the same value as tracked_keywords."},"reset":{"type":"integer","nullable":true,"example":null,"description":"Seconds until this pool is full again (relative, not a Unix timestamp). For a daily pool this is the end of the 24-hour period that its first counted request started; for a monthly pool, the end of the calendar month."}}}},"description":"Quota pools of the account, keyed by pool name. Other keys can appear, for example pools of other Mangools tools that the API does not expose."},"tracked-keywords":{"type":"number","description":"tracked-keywords","example":1500},"upgraded_account":{"type":"boolean","example":true},"limit_options":{"type":"array","description":"Plan comparison table for the limits shown in the Mangools apps.","items":{"type":"object","properties":{"name":{"type":"string","example":"Related keywords"},"tooltip":{"type":"string"},"limits":{"type":"array","items":{"type":"object","properties":{"plan":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"example":"BASIC"},"value":{"type":"string","example":"200"},"color":{"type":"string","example":"orange"}}}}}}},"highestPlan":{"type":"string","description":"Level of the highest active plan of the account, for example free, basic or premium.","example":"premium"},"platformPlan":{"type":"string","description":"Platform of the account plan, for example mangools, api, ai or combo.","example":"mangools"},"trackings":{"type":"integer","description":"Number of trackings your plan allows in SERPWatcher.","example":10},"maxGeneratePrompts":{"type":"integer","description":"Number of prompts that POST /aiwatcher/prompts/generate returns for your plan.","example":5}}},"Annotation":{"type":"object","properties":{"_id":{"type":"string","description":"Annotation ID."},"date":{"type":"string","description":"Date the annotation is pinned to on the timeline (YYYY-MM-DD)."},"content":{"type":"object","properties":{"text":{"type":"string","description":"Annotation text. Set only on annotations written by a user."},"keywords_count":{"type":"number","description":"Number of keywords added or removed, negative for a removal. Set on automatic annotations."},"avg":{"type":"number","description":"Average rank recorded."},"platformId":{"type":"number","description":"Platform ID (1 = desktop, 2 = mobile)."}}},"nonShareable":{"type":"boolean","description":"When true, the annotation is hidden from shared dashboard links."},"tracking_id":{"type":"string","description":"Tracking ID."},"user_id":{"type":"string","description":"ID of the account owner."},"creator":{"type":"string","description":"ID of the user who created the annotation."},"created_at":{"type":"integer","description":"Unix timestamp of creation."},"type":{"type":"number","description":"Annotation type."}}},"Report":{"type":"object","properties":{"_id":{"type":"string","description":"Report ID."},"user_id":{"type":"string","description":"ID of the account owner."},"tracking_id":{"type":"string","description":"Tracking ID."},"type":{"type":"integer","description":"Report type: 0 rank-change alert, 1 weekly, 2 monthly.","enum":[0,1,2]},"emails":{"type":"array","description":"Recipient email addresses.","items":{"type":"string"}},"name":{"type":"string","description":"Report name."},"triggers":{"type":"array","description":"Trigger types of a rank-change alert.","items":{"type":"integer"}},"created_at":{"type":"integer","description":"Unix timestamp of creation."}}},"Tag":{"type":"object","properties":{"_id":{"type":"string","description":"Tag ID."},"user_id":{"type":"string","description":"ID of the account owner."},"creator":{"type":"string","description":"ID of the user who created the tag."},"tracking_id":{"type":"string","description":"Tracking ID."},"name":{"type":"string","description":"Tag name."},"color":{"type":"string","description":"Tag color."},"created_at":{"type":"integer","description":"Unix timestamp of creation."}}},"TrackedKeyword":{"type":"object","properties":{"keyword_id":{"type":"string","description":"Keyword ID"},"tracking_id":{"type":"string","description":"tracking_id"},"user_id":{"type":"string","description":"user_id"},"kw":{"type":"string","description":"kw"},"location_id":{"type":"integer","description":"location_id"},"platform_id":{"type":"integer","description":"platform_id"}}},"GetTrackingDetailRes":{"type":"object","properties":{"tracking":{"$ref":"#/components/schemas/TrackingDetail"},"whiteLabel":{"type":"object","nullable":true,"description":"White-label settings of the account that owns the tracking. Sent only on shared and custom-domain requests, otherwise null.","properties":{"logo":{"type":"string","description":"URL of the logo."},"name":{"type":"string","description":"Brand name."},"website":{"type":"string","description":"Website URL."},"accentColor":{"type":"string","description":"Accent color as a hex value with a leading #."},"enabled":{"type":"boolean","description":"Whether white-labelling is on."}}},"keywords":{"type":"array","items":{"$ref":"#/components/schemas/TrackingDetailKeyword"}}}},"GetTrackingStatsRes":{"type":"object","properties":{"annotations":{"type":"array","items":{"$ref":"#/components/schemas/Annotation"}},"history_dates":{"type":"array","items":{"type":"string"},"example":["2021-10-20","2021-10-08","2021-9-29"]},"stats":{"type":"object","properties":{"timeframes":{"type":"object","description":"Statistics keyed by date.","additionalProperties":{"$ref":"#/components/schemas/TrackingStatsItem"}},"top_up":{"type":"array","description":"Keywords with the largest rank gain. Always empty at present.","items":{"type":"string","description":"Tracked keyword ID."}},"top_down":{"type":"array","description":"Keywords with the largest rank loss. Always empty at present.","items":{"type":"string","description":"Tracked keyword ID."}}}},"keywords":{"type":"array","description":"Per-keyword rank data.","items":{"$ref":"#/components/schemas/TrackingStatsKeyword"}}}},"TrackingDetailKeyword":{"type":"object","properties":{"_id":{"type":"string","description":"Tracked keyword ID."},"kwId":{"type":"string","description":"Keyword ID."},"kw":{"type":"string","description":"Keyword text."},"url":{"type":"string","description":"Currently ranking URL, or null.","nullable":true},"tags":{"type":"array","description":"Assigned tags.","items":{"$ref":"#/components/schemas/Tag"}},"created_at":{"type":"integer","description":"Unix timestamp of creation."},"is_deleted":{"type":"boolean","description":"Whether the keyword is deleted."},"last_checked_at":{"type":"integer","description":"Unix timestamp of the last check."},"rank_check_pending":{"type":"boolean","description":"True while a scan of the keyword is queued and has not landed: an on-demand refresh in flight or the first crawl of a keyword added in the last 24 hours."}}},"MapPack":{"type":"object","properties":{"rank":{"type":"number","description":"Map Pack position in the SERP.","nullable":true},"url":{"type":"string","description":"URL ranking in the Map Pack.","nullable":true},"hasUrl":{"type":"boolean","description":"Whether the Map Pack has a URL."}}},"TrackingStatsItem":{"type":"object","properties":{"estimated_visits":{"type":"number","description":"Estimated monthly visits from the tracked keywords on this date."},"performance_index":{"type":"number","description":"Performance index, 0-100."},"visibility_index":{"type":"number","description":"Visibility index, 0-100."},"performance_total":{"type":"number","description":"Total weight of the tracked keywords."},"rank_distribution":{"type":"object","description":"How many tracked keywords fell into each rank bucket on this date. `rest` counts keywords ranked 100 or worse, or not ranked.","properties":{"1":{"type":"integer","description":"Ranked first.","example":0},"3":{"type":"integer","description":"Ranked 2-3.","example":1},"10":{"type":"integer","description":"Ranked 4-10.","example":3},"20":{"type":"integer","description":"Ranked 11-20.","example":0},"100":{"type":"integer","description":"Ranked 21-99.","example":0},"rest":{"type":"integer","description":"Ranked 100 or worse, or not ranked at all.","example":5}}},"keywords_with_history":{"type":"integer","description":"Tracked keywords that had rank history on this date."},"keywords_eligible":{"type":"integer","description":"Tracked keywords that existed on this date."}}},"TrackingDetail":{"type":"object","properties":{"count":{"type":"number","description":"count"},"created_at":{"type":"number","description":"created_at"},"domain":{"type":"string","description":"domain"},"location":{"$ref":"#/components/schemas/LocationShort"},"platform_id":{"type":"number","description":"platform_id"},"share_token":{"type":"string","description":"share_token"},"tracked_keyword_ids":{"type":"array","description":"tracked_keyword_ids","items":{"type":"string"}},"tracking_config":{"$ref":"#/components/schemas/TrackingConfig"},"_id":{"type":"string","description":"_id"}}},"TrackingConfig":{"type":"object","properties":{"address":{"nullable":true,"type":"string","description":"address"},"ludocid":{"nullable":true,"type":"string","description":"ludocid"},"name":{"nullable":true,"type":"string","description":"name"},"place_id":{"nullable":true,"type":"string","description":"place_id"}}},"Tracking":{"type":"object","properties":{"_id":{"type":"string","description":"Tracking ID."},"domain":{"type":"string","description":"Tracked domain."},"location":{"$ref":"#/components/schemas/LocationShort"},"platform_id":{"type":"integer","description":"Platform ID (1 = desktop, 2 = mobile)."},"count":{"type":"integer","description":"Number of tracked keywords."},"tracked_keyword_ids":{"type":"array","description":"IDs of the tracked keywords.","items":{"type":"string"}},"tracking_config":{"$ref":"#/components/schemas/TrackingConfig"},"share_token":{"type":"string","description":"Token of the read-only share link."},"created_at":{"type":"integer","description":"Unix timestamp of creation."},"is_deleted":{"type":"boolean","description":"Whether the tracking is deleted."},"reports_active":{"type":"array","description":"Types of the email reports that are active on the tracking.","items":{"nullable":true,"type":"integer"}},"stats":{"type":"object","description":"Statistics of the requested date range. Present only when `from` or `to` is set.","properties":{"timeframes":{"type":"object","description":"Statistics keyed by date.","additionalProperties":{"$ref":"#/components/schemas/TrackingStatsItem"}}}}}},"TrackingPost":{"type":"object","properties":{"tracking":{"$ref":"#/components/schemas/Tracking"},"keywords":{"type":"array","description":"The tracked keywords.","items":{"$ref":"#/components/schemas/TrackedKeyword"}},"reports":{"type":"array","description":"The default weekly and monthly email reports created with the tracking.","items":{"$ref":"#/components/schemas/Report"}},"estimatedTimeProcessing":{"type":"number","description":"Estimated time until the keywords are processed."},"postponed_processing":{"type":"boolean","description":"Whether processing of some keywords is postponed."},"postponed_keywords":{"type":"integer","description":"Number of keywords whose processing is postponed."}}},"ImportedKeywords":{"type":"object","properties":{"_id":{"type":"string","example":"11e2a4ff072b3f6394dfb602dcea80c3"},"kw":{"type":"string","example":"seo agency"},"lid":{"type":"number","example":21167},"sv":{"nullable":true,"type":"number","example":930},"svs":{"type":"number","example":0},"cpc":{"nullable":true,"type":"number","example":0.813559,"description":"Cost per click in USD, or null when Google reports none."},"ppc":{"nullable":true,"type":"number","example":15},"svn":{"nullable":true,"type":"number","example":530},"msv":{"type":"array","description":"Monthly search volumes, oldest first.","items":{"$ref":"#/components/schemas/MonthlySearchVolume"}},"ts":{"type":"number","example":1617710810},"seo":{"type":"number","example":null,"nullable":true},"seo_ts":{"type":"number","example":null,"nullable":true}}},"Serp":{"type":"object","properties":{"_id":{"type":"string","description":"SERP ID","example":"aa93adafb6466917d51dc3bf836d32da"},"kw":{"type":"string","description":"Keyword text","example":"seo specialist"},"page":{"type":"integer","description":"page number of SERP","example":0},"location_id":{"type":"integer","description":"Location ID of the SERP, for example 2840 (United States).","example":2840},"location":{"$ref":"#/components/schemas/LocationRef"},"platform_id":{"type":"integer","description":"ID of platform e.g. `1` for desktop or `2` for mobile","example":1},"items":{"type":"array","description":"Organic results, ads and rich-snippet features, in the order Google rendered them.","items":{"$ref":"#/components/schemas/SerpItem"},"example":[{"type":"SIMILAR_QUESTIONS","size":{"t":828.859375,"l":180,"b":1052.859375,"r":832},"screenCoverage":0,"visPart":0},{"type":"ORGANIC","url":"https://en.wikipedia.org/wiki/Monitoring","title":"Monitoring - Wikipedia","desc":"Monitoring (medicine), the observation of a disease, condition or one or several medical parameters over time · Baby monitoring · Biomonitoring, of toxic chemical ...","size":{"t":1092.859375,"l":180,"b":1212.859375,"r":780},"domain":"wikipedia.org","topRank":13,"m":{"fb":{"v":{"l":null,"og":null},"ts":1617190715},"moz":{"v":{"upa":70,"pda":98},"ts":1617190715},"majestic":{"v":{"Status":"Found","ExtBackLinks":441,"RefDomains":152,"ACRank":2,"RefIPs":99,"ItemType":3,"RefSubNets":97,"CitationFlow":16,"TrustFlow":10,"TrustMetric":10,"IndexedURLs":1,"NonUniqueLinkTypeHomepages":"8","NonUniqueLinkTypeIndirect":"228","NonUniqueLinkTypeDeleted":"26","NonUniqueLinkTypeNoFollow":"209","NonUniqueLinkTypeProtocolHTTPS":"237","NonUniqueLinkTypeFrame":"0","NonUniqueLinkTypeImageLink":"11","NonUniqueLinkTypeRedirect":"0","NonUniqueLinkTypeTextLink":"436","TotalNonUniqueLinks":"447","OutLinksInternal":"","OutLinksExternal":"","OutDomainsExternal":"","RefDomainsEDU":0,"ExtBackLinksEDU":0,"RefDomainsGOV":0,"ExtBackLinksGOV":0,"RefDomainsEDU_Exact":0,"ExtBackLinksEDU_Exact":0,"RefDomainsGOV_Exact":0,"ExtBackLinksGOV_Exact":0},"ts":1617190715},"rank":{"v":{"r":55},"ts":1617190715}}}]},"browser":{"type":"object","description":"Dimensions of the viewport the SERP was rendered in.","properties":{"doc":{"type":"object","properties":{"w":{"type":"integer","description":"Width in CSS pixels."},"h":{"type":"integer","description":"Height in CSS pixels."}},"description":"Full document size."},"view":{"type":"object","properties":{"w":{"type":"integer","description":"Width in CSS pixels."},"h":{"type":"integer","description":"Height in CSS pixels."}},"description":"Viewport size."}},"example":{"doc":{"w":1366,"h":3213},"view":{"w":1366,"h":768}}},"rank":{"type":"number","description":"rank","example":39},"rank_updated_at":{"type":"integer","description":"Timestamp data of rank last update","example":1592618403},"created_at":{"type":"number","description":"created_at","example":1592618403},"ctr":{"type":"array","items":{"type":"number","format":"double"}},"results":{"type":"integer","example":2360000000},"serp_results":{"type":"integer","nullable":true,"example":null},"serp_snapshot_id":{"type":"string","nullable":true,"example":"58dc27755a3518edf5bb650abadf22d1.2021-03-31","description":"Key of the stored copy of the result page, `<md5>.<YYYY-MM-DD>[.100][.sch]`, where `<md5>` is the `_id` of the lookup, `.100` marks a hundred-result SERP and `.sch` a page SERPChecker or KWFinder stored from 2026-10-02. Pass it as returned to `/serpchecker/serps/{serp_id}/snapshot`. Null when no page was stored for this response."},"serp_source_url":{"type":"string","nullable":true,"example":"https://example.com/serp/58dc27755a3518edf5bb650abadf22d1.2021-03-31.html","description":"URL of the stored copy of the result page. Null when no page was stored for this response."},"serpFeaturesImpact":{"type":"integer","example":2,"description":"Impact of the SERP features on the organic results. Returned by SERPChecker only."}}},"SerpResetResponse":{"type":"array","items":{"$ref":"#/components/schemas/Serp"}},"KwfinderList":{"type":"object","properties":{"_id":{"type":"string","description":"Unique list identifier. Use this value as the `list_id` path parameter for `GET /kwfinder/lists/{list_id}`, `PATCH /kwfinder/lists/{list_id}` and the keyword sub-resources.","example":"6a29390c4c966b1271aef0d2"},"name":{"type":"string","description":"name","example":"My Awesome Keyword List"},"user_id":{"type":"string","description":"user_id","example":"005de7e7771450763339653e918778ef"},"keyword_ids":{"type":"array","description":"The keyword IDs in the list. Omitted from `GET /kwfinder/lists/{list_id}`, which returns the keywords themselves under `keywords` instead.","items":{"type":"string"},"example":["005de7e7771450763339653e918778ef","005de7e7771450763339653e918778ef"]},"created_at":{"type":"integer","description":"Unix timestamp in MILLISECONDS when the list was created.","example":1590868935000},"updated_at":{"type":"integer","description":"Unix timestamp in MILLISECONDS when the list was last changed.","example":1590868935000},"creator":{"type":"string","description":"ID of the user who created the list. Differs from `user_id` when a team member created it on the account.","example":"005de7e7771450763339653e918778ef"},"__v":{"type":"integer","description":"Storage revision counter. Ignore it.","example":0}}},"KdUrlMetrics":{"type":"object","description":"Keyword-difficulty URL authority result returned by GET /kwfinder/kd/url-metrics.","properties":{"_id":{"type":"string","description":"md5 hash of the looked-up URL.","example":"6be984976f0eedca1741745c5e5290c0"},"url":{"type":"string","description":"The looked-up URL (IDN-decoded).","example":"https://example.com/"},"lps":{"type":"integer","nullable":true,"description":"URL authority / link-profile-strength score (0–100) used as an input signal for KWFinder keyword difficulty. Null when Moz/Majestic metrics are unavailable for the URL.","example":42}}},"SerpcheckerUrlMetrics":{"type":"object","description":"SEO metrics for a single URL returned by GET /serpchecker/url-metrics (Facebook, Moz, Majestic and a computed rank, plus the domain's top-rank).","properties":{"_id":{"type":"string","description":"md5 hash of the looked-up URL.","example":"6be984976f0eedca1741745c5e5290c0"},"url":{"type":"string","description":"The looked-up URL (IDN-decoded).","example":"https://example.com/"},"domain":{"type":"string","description":"The domain/subdomain of the looked-up URL (IDN-decoded).","example":"example.com"},"m":{"$ref":"#/components/schemas/UrlMetricGroups"},"topRank":{"type":"integer","nullable":true,"description":"Mangools rank of the domain, a website popularity rank in which a lower number means a more popular site. Null when unknown."}}},"LinkminerUrlMetrics":{"type":"array","description":"URL metrics returned by GET /linkminer/url-metrics. Always a single-element array for the queried URL. Each element carries Majestic link-authority metrics for the URL/domain/subdomain.","items":{"type":"object","properties":{"_id":{"type":"string","description":"md5 hash of the looked-up URL.","example":"6be984976f0eedca1741745c5e5290c0"},"url":{"type":"string","description":"The looked-up URL (IDN-decoded).","example":"https://example.com/"},"m":{"type":"object","properties":{"majestic":{"type":"object","allOf":[{"$ref":"#/components/schemas/MajesticMetric"}],"description":"Majestic metrics. `v` holds the Majestic fields CitationFlow, TrustFlow, RefDomains, ExtBackLinks, RefIPs, RefSubNets, IndexedURLs and ACRank, and related link-type counts."}}}}}},"SPBacklinkProfile":{"type":"object","properties":{"urlId":{"type":"string","description":"md5 hash of the looked-up URL or host.","example":"6be984976f0eedca1741745c5e5290c0"},"majestic":{"$ref":"#/components/schemas/MajesticIndexItemInfo"},"majesticBackLinkCalendar":{"type":"array","example":[{"Date":"2020-12-14","NewLinks":6004,"LostLinks":0}],"items":{"type":"object","properties":{"Date":{"type":"string","example":"2020-12-14"},"NewLinks":{"type":"integer","example":6004},"LostLinks":{"type":"integer","example":0}}}},"majesticRefDomains":{"type":"array","example":[{"domain":"google.com","topRank":1,"matchedLinks":9,"citationFlow":100,"trustFlow":99}],"items":{"type":"object","properties":{"domain":{"type":"string","example":"google.com"},"topRank":{"type":"integer","example":1},"matchedLinks":{"type":"integer","example":9},"citationFlow":{"type":"integer","example":100},"trustFlow":{"type":"integer","example":99}}}},"majesticAnchors":{"type":"array","example":[{"anchorText":"example tools","refDomains":1495,"deletedLinks":909,"noFollowLinks":1502,"totalLinks":5956,"class":"brand.domain","tokens":[{"token":"example","brand.domain":0.9090909090909091,"other.normal":0.3,"other.stop":{}},{"token":"tools","brand.domain":0,"other.normal":0.3,"other.stop":{}}],"score":{"other.stop":0,"other.normal":0.6,"brand.domain":2.727272727272727}}],"items":{"type":"object","properties":{"anchorText":{"type":"string","example":"example tools"},"refDomains":{"type":"integer","example":1495},"deletedLinks":{"type":"integer","example":909},"noFollowLinks":{"type":"integer","example":1502},"totalLinks":{"type":"integer","example":5956},"class":{"type":"string","enum":["brand.domain","brand.url","naked.url","other","other.normal","other.stop","empty"],"description":"Winning anchor class. `empty`, `naked.url`, `brand.url` and `other` are decided from the anchor text alone, so those anchors carry no `score` and an empty `tokens`.","example":"brand.domain"},"tokens":{"type":"array","items":{"type":"object","description":"Classifier scores for one token of the anchor text.","properties":{"token":{"type":"string","example":"uptime"},"brand.domain":{"type":"number","description":"Similarity to the target domain's own tokens; 0 below the recognition threshold.","example":0.9090909090909091},"other.normal":{"type":"number","description":"Baseline score carried by every token.","example":0.3},"other.stop":{"oneOf":[{"type":"number"},{"type":"object","additionalProperties":{"type":"number"}}],"description":"`1` when the token is numeric or shorter than three characters. Otherwise a map of the languages in which the token is a stop word, out of de, en, es, fr, hi, pt, ru and sk — empty when it is a stop word in none of them.","example":{}}},"additionalProperties":false}},"score":{"type":"object","description":"Anchor-level scores, summed over the tokens. Absent when the class was decided from the anchor text alone.","properties":{"brand.domain":{"type":"number","example":2.727272727272727},"other.normal":{"type":"number","example":0.6},"other.stop":{"type":"number","example":0}},"additionalProperties":false},"citationFlow":{"type":"integer","description":"Majestic Citation Flow of the anchor.","example":34}}}}}},"SPTopContent":{"type":"object","properties":{"urlId":{"type":"string","example":"6be984976f0eedca1741745c5e5290c0"},"topContent":{"type":"array","example":[{"url":"https://example.com/","citationFlow":53,"trustFlow":63,"refDomains":3800,"extBackLinks":376507,"fb":{"l":null,"og":null}}],"items":{"type":"object","properties":{"url":{"type":"string","example":"https://example.com/"},"citationFlow":{"type":"integer","example":53},"trustFlow":{"type":"integer","example":63},"refDomains":{"type":"integer","example":3800},"extBackLinks":{"type":"integer","example":376507},"fb":{"type":"object","allOf":[{"$ref":"#/components/schemas/FacebookMetricValue"}]}}}}}},"SPCompetitors":{"type":"object","properties":{"id":{"type":"string","description":"The looked-up domain (IDN-decoded).","example":"example.com"},"source":{"type":"string","example":"is"},"competitors":{"type":"array","example":[{"domainId":"example.org","domain":"example.org","topRank":1546,"fb":null,"refIps":null,"score":369}],"items":{"type":"object","properties":{"domainId":{"type":"string","example":"example.org"},"domain":{"type":"string","example":"example.org"},"topRank":{"type":"integer","nullable":true,"example":1546},"fb":{"type":"integer","nullable":true,"description":"Facebook engagement."},"refIps":{"type":"integer","nullable":true,"description":"Referring IP addresses."},"score":{"type":"number","nullable":true,"example":369}}}}}},"RankDist":{"type":"object","properties":{"_id":{"type":"string","example":"f96c16a793a4f2f376ec7272382860d2"},"domain":{"type":"string","example":"example.com"},"bucket":{"type":"integer","example":-1896106463,"description":"Legacy field, present only on older records."},"lid":{"type":"integer","example":2250},"visibility":{"type":"object","example":{"2019-04":{"organic":{"sum":447,"traffic":403,"index":902},"paid":{"sum":447,"traffic":0,"index":0},"updated_at":1558086619834}},"description":"Legacy visibility histogram keyed by month. Present only on older records.","additionalProperties":{"type":"object","properties":{"organic":{"type":"object","properties":{"sum":{"type":"number","example":447},"traffic":{"type":"number","example":403},"index":{"type":"number","example":902}}},"paid":{"type":"object","properties":{"sum":{"type":"number","example":447},"traffic":{"type":"number","example":403},"index":{"type":"number","example":902}}},"updated_at":{"type":"integer","format":"int64","description":"Unix timestamp in milliseconds of the month bucket, unlike the seconds used elsewhere in this schema.","example":1558086619834}}}},"rank":{"type":"object","example":{"2019-04":{"organic":[{"r":1,"v":2},{"r":10,"v":1}],"paid":[],"updated_at":1558086619834}},"description":"Legacy rank histogram keyed by month. Present only on older records.","additionalProperties":{"type":"object","properties":{"organic":{"type":"array","items":{"type":"object","properties":{"r":{"type":"integer","description":"Position in the result page.","example":1},"v":{"type":"integer","description":"Number of keywords ranking at that position.","example":2}}}},"paid":{"type":"array","items":{"type":"object","properties":{"r":{"type":"integer","description":"Position in the result page.","example":1},"v":{"type":"integer","description":"Number of keywords ranking at that position.","example":2}}}},"updated_at":{"type":"integer","format":"int64","description":"Unix timestamp in milliseconds of the month bucket, unlike the seconds used elsewhere in this schema.","example":1558086619834}}}},"updated_at":{"type":"integer","description":"Unix timestamp (seconds) of the last refresh.","example":1558086619},"metrics_absolute":{"type":"object","description":"Absolute domain metrics keyed by month (`YYYY-MM`).","additionalProperties":{"type":"object","properties":{"organic":{"type":"object","additionalProperties":{"type":"number","description":"Any further numeric column."},"description":"Organic traffic metrics for the month. The properties below are the columns returned today; further numeric columns may appear.","properties":{"pos_1":{"type":"integer","description":"Keywords ranking at position 1.","example":6696},"pos_2_3":{"type":"integer","description":"Keywords ranking at positions 2-3.","example":23889},"pos_4_10":{"type":"integer","description":"Keywords ranking at positions 4-10.","example":124080},"pos_11_20":{"type":"integer","description":"Keywords ranking at positions 11-20.","example":160861},"pos_21_30":{"type":"integer","description":"Keywords ranking at positions 21-30.","example":134966},"pos_31_40":{"type":"integer","description":"Keywords ranking at positions 31-40.","example":147168},"pos_41_50":{"type":"integer","description":"Keywords ranking at positions 41-50.","example":157139},"pos_51_60":{"type":"integer","description":"Keywords ranking at positions 51-60.","example":159320},"pos_61_70":{"type":"integer","description":"Keywords ranking at positions 61-70.","example":162025},"pos_71_80":{"type":"integer","description":"Keywords ranking at positions 71-80.","example":167414},"pos_81_90":{"type":"integer","description":"Keywords ranking at positions 81-90.","example":176025},"pos_91_100":{"type":"integer","description":"Keywords ranking at positions 91-100.","example":129790},"count":{"type":"integer","description":"Total ranking keywords for the domain.","example":1549381},"etv":{"type":"number","description":"Estimated traffic volume.","example":7262760.486102195},"impressions_etv":{"type":"number","description":"Estimated traffic volume based on impressions.","example":1096663.9067178322},"estimated_paid_traffic_cost":{"type":"number","description":"Estimated cost of the equivalent paid traffic, in USD.","example":15183566.728475826},"is_new":{"type":"integer","description":"Keywords that entered the top 100 since the previous measurement.","example":455287},"is_up":{"type":"integer","description":"Keywords that moved up since the previous measurement.","example":608410},"is_down":{"type":"integer","description":"Keywords that moved down since the previous measurement.","example":287212},"is_lost":{"type":"integer","description":"Keywords that left the top 100 since the previous measurement.","example":589667}}}}}}}},"SPMetrics":{"type":"object","properties":{"urlId":{"type":"string","example":"6be984976f0eedca1741745c5e5290c0","description":"md5 hash of the looked-up URL. Present when `urlType=URL`; domain lookups carry `domainId` instead."},"moz":{"type":"object","description":"Moz authority metrics, narrowed to the two fields SiteProfiler uses. Absent when Moz holds no data for the URL.","properties":{"pda":{"type":"number","description":"Domain authority.","example":60},"upa":{"type":"number","description":"Page authority.","example":61}}},"majestic":{"type":"object","description":"Majestic metrics, narrowed to the five fields SiteProfiler uses. Absent when Majestic holds no data for the URL.","properties":{"Status":{"type":"string","description":"Anything other than `Found` means Majestic holds no data for the item.","example":"Found"},"CitationFlow":{"type":"integer","example":53},"TrustFlow":{"type":"integer","example":63},"RefIPs":{"type":"integer","example":3475},"ItemType":{"type":"integer","example":3}}},"fb":{"type":"object","nullable":true,"allOf":[{"$ref":"#/components/schemas/FacebookMetricValue"},{"description":"Facebook engagement data for the domain, or null when it has never been fetched."}]},"domainId":{"type":"string","example":"example.com"},"domain":{"type":"string","example":"example.com"},"majesticHistory":{"type":"object","description":"Majestic link history keyed by ISO date.","additionalProperties":{"type":"object","properties":{"rank":{"type":"integer","nullable":true},"refIps":{"type":"integer","nullable":true},"refSubnets":{"type":"integer","nullable":true}}},"example":{"2021-04-12":{"rank":7886,"refIps":3475,"refSubnets":2503}}},"fbHistory":{"type":"object","description":"Facebook engagement count keyed by ISO date. Only returned for domain and subdomain lookups.","additionalProperties":{"type":"integer"},"example":{"2021-04-12":1183}},"rankDist":{"type":"array","description":"Domain statistics for the host. Empty when none are cached.","items":{"$ref":"#/components/schemas/RankDist"}},"topRank":{"oneOf":[{"type":"integer"},{"type":"object","additionalProperties":false,"description":"Always empty. This operation reports an unknown rank as `{}`, not as null."}],"description":"Mangools rank of the domain, or an empty object when no rank is stored yet. The same field is `null` rather than `{}` on `GET /siteprofiler/competitors` and in SERP results.","example":3190},"topRankHistory":{"type":"object","description":"Historical top rank keyed by ISO date.","additionalProperties":{"type":"integer"},"example":{"2020-10-05":13050,"2021-02-19":9312,"2021-04-12":7886}}}},"KWfinderRequest":{"type":"object","properties":{"kw":{"type":"string","example":"seo"},"language":{"$ref":"#/components/schemas/Language"},"location":{"$ref":"#/components/schemas/LocationShort"},"rank":{"nullable":true,"type":"integer","example":70},"rank_ts":{"nullable":true,"type":"number","example":1592976768},"t":{"type":"number","description":"Entry type: 0 related keywords, 1 competitor keywords, 2 keyword gap."},"created":{"type":"integer","description":"Unix timestamp (seconds) of the lookup.","example":1592976768},"url":{"type":"string","description":"Looked-up URL. Present on competitor lookups (t 1).","example":"example.com"},"lid":{"oneOf":[{"type":"integer"},{"type":"string"}],"description":"Location ID. Present on competitor lookups (t 1, sent as a string) and gap analyses (t 2, sent as an integer).","example":2840}}},"BackLinkExport":{"type":"object","properties":{"_id":{"type":"string","description":"Export ID.","example":"5f8d0d55b54764421b7156c3"},"creator":{"type":"string","description":"ID of the user who created the export."},"jobName":{"type":"string","description":"name of job - domain.tld"},"state":{"type":"integer","description":"Export lifecycle state, named after the last finished stage: 100 queued or downloading backlinks, 200 backlinks downloaded, 300 metrics merged, 400 rows sorted, 500 file uploaded, 600 done.","enum":[100,200,300,400,500,600],"example":600},"error":{"type":"string","description":"error in processing, if any"},"request":{"type":"object","description":"The export request, stored as it was accepted. Keys whose value was omitted from the request are absent here too.","properties":{"url":{"type":"string","description":"The URL, subdomain or root domain the export was created for.","example":"mangools.com"},"type":{"type":"string","enum":["RootDomain","SubDomain","URL"],"description":"What the URL resolved to, derived from the URL itself.","example":"RootDomain"},"limit":{"type":"integer","description":"Maximum number of backlink rows to export. Absent means no limit.","example":50000},"filter":{"type":"object","description":"The backlink filter. Every key is optional and absent when it was not sent.","properties":{"targetAnchorText":{"type":"string","description":"Keep only links whose anchor text matches."},"targetHrefText":{"type":"string","description":"Keep only links whose target URL matches."},"linkType":{"type":"string","description":"Keep only links of this Majestic link type."},"noFollow":{"type":"boolean","description":"Keep only nofollow links, or only followed links."},"liveLinks":{"type":"boolean","description":"Keep only live links, or only lost links."},"minCitationFlow":{"type":"integer","description":"Lower bound on Citation Flow."},"maxCitationFlow":{"type":"integer","description":"Upper bound on Citation Flow."},"minTrustFlow":{"type":"integer","description":"Lower bound on Trust Flow."},"maxTrustFlow":{"type":"integer","description":"Upper bound on Trust Flow."},"minTopRank":{"type":"integer","description":"Lower bound on Mangools rank."},"maxTopRank":{"type":"integer","description":"Upper bound on Mangools rank."},"minLinkStrength":{"type":"integer","description":"Lower bound on Link Strength."},"maxLinkStrength":{"type":"integer","description":"Upper bound on Link Strength."},"flagTextLink":{"type":"boolean","description":"Restrict the export to links Majestic flags as text links. Omitted means no restriction."},"flagImageLink":{"type":"boolean","description":"Restrict the export to links Majestic flags as image links. Omitted means no restriction."},"flagFrameLink":{"type":"boolean","description":"Restrict the export to links Majestic flags as frame links. Omitted means no restriction."},"flagRedirectLink":{"type":"boolean","description":"Restrict the export to links Majestic flags as redirect links. Omitted means no restriction."},"flagMentionLink":{"type":"boolean","description":"Restrict the export to links Majestic flags as mention links. Omitted means no restriction."},"linksPerDomain":{"type":"integer","description":"Maximum number of links kept per referring domain.","example":1}}}}},"stats":{"type":"object","description":"Counters recorded while the export ran. The download counters appear once the export reaches state 200, the rest once it reaches state 300.","properties":{"fresh":{"type":"integer","description":"Rows returned from the fresh Majestic index."},"historic":{"type":"integer","description":"Rows returned from the historic Majestic index."},"duplicates":{"type":"integer","description":"Historic rows dropped because the fresh index already had them."},"filtered":{"type":"integer","description":"Rows dropped by the export filter."},"topRank":{"type":"object","description":"Counters for the Mangools rank metric lookups run while the export file was being built.","properties":{"requests":{"type":"integer","description":"Rows for which the metric was needed."},"rpcCalls":{"type":"integer","description":"Number of metric lookups sent."},"rpcGoodResult":{"type":"integer","description":"Number of metric lookups that were answered."},"goodResult":{"type":"integer","description":"Rows that ended up with a value."},"successRate":{"type":"integer","nullable":true,"description":"Percentage of `requests` that produced a value, rounded up. Null while `requests` is zero."}}},"fb":{"type":"object","description":"Counters for the Facebook metric lookups run while the export file was being built.","properties":{"requests":{"type":"integer","description":"Rows for which the metric was needed."},"rpcCalls":{"type":"integer","description":"Number of metric lookups sent."},"rpcGoodResult":{"type":"integer","description":"Number of metric lookups that were answered."},"goodResult":{"type":"integer","description":"Rows that ended up with a value."},"successRate":{"type":"integer","nullable":true,"description":"Percentage of `requests` that produced a value, rounded up. Null while `requests` is zero."}}}}},"backLinks":{"type":"number","description":"count of backLinks"},"cost":{"type":"number","description":"Backlink rows charged for the export. Equal to costPrediction until the backlinks are downloaded (state 200), then the number of rows actually returned, with a minimum of 100."},"costPrediction":{"type":"number","description":"Estimated cost in backlink rows when the export was created: the suggested cost of the target, or limit when that is smaller."},"createdAt":{"type":"number","description":"Unix timestamp (seconds) when the export was created."},"completedAt":{"type":"number","nullable":true,"description":"Unix timestamp (seconds) when the export finished."},"downloadURL":{"type":"string","description":"Direct download link. Present only while state is 600 and for 60 days after completedAt.","example":"https://example.com/exports/56cac3c2-2880-41a2-9f6d-a5d86364df6c/example.com.csv"}}},"BackLinkExportSuggestion":{"type":"object","properties":{"url":{"type":"string","description":"url"},"refDomains":{"type":"number","description":"refDomains"},"backLinks":{"type":"number","description":"backLinks"},"cost":{"type":"number","description":"cost"},"state":{"type":"string","description":"for example MayExist"},"type":{"type":"string","description":"Target type of the suggested URL.","enum":["RootDomain","SubDomain","URL"],"example":"RootDomain"}}},"BackLinkExportSuggestionResponse":{"type":"object","properties":{"suggestedType":{"type":"string","description":"The export target type inferred from the requested url (RootDomain, SubDomain or URL)","example":"RootDomain"},"suggestions":{"type":"array","description":"Related export targets with their backlink counts and estimated cost","items":{"$ref":"#/components/schemas/BackLinkExportSuggestion"}}}},"TrackingUpdateResponse":{"type":"object","properties":{"tracking":{"type":"object","description":"The updated tracking (id, domain and local-SEO configuration)","properties":{"_id":{"type":"string","description":"tracking id"},"domain":{"type":"string","description":"The (possibly updated) tracking domain"},"tracking_config":{"$ref":"#/components/schemas/TrackingConfig"}}},"annotation":{"$ref":"#/components/schemas/Annotation"}}},"KwfinderCompetitors":{"type":"object","properties":{"url_type":{"type":"string","description":"url_type","example":"RootDomain"},"location":{"$ref":"#/components/schemas/LocationShort"},"keywords":{"type":"array","description":"keywords","items":{"$ref":"#/components/schemas/Keyword"}},"totalCount":{"type":"integer","description":"Total number of keywords found for the request.","example":1500},"page":{"type":"integer","description":"Current page number.","example":0},"resultsSize":{"type":"integer","description":"Maximum number of keywords per page for your plan.","example":1000},"originalItemsCount":{"type":"integer","description":"Number of items found before any filtering.","example":1500},"isAllowedPagination":{"type":"boolean","description":"Whether pagination is allowed for the user's plan.","example":true}}},"KwfinderSuggestedKeywords":{"type":"object","properties":{"url_type":{"type":"string","description":"url_type","example":"RootDomain"},"location":{"$ref":"#/components/schemas/LocationShort"},"keywords":{"type":"array","description":"keywords","items":{"$ref":"#/components/schemas/KwfinderSuggestedKeyword"}},"totalCount":{"nullable":true,"type":"integer","description":"Total number of keywords found for the request.","example":1500},"page":{"type":"integer","description":"Current page number.","example":0},"resultsSize":{"type":"integer","description":"Maximum number of keywords per page for your plan.","example":1000},"originalItemsCount":{"type":"integer","description":"Number of items found before any filtering.","example":1500},"isAllowedPagination":{"type":"boolean","description":"Whether pagination is allowed for the user's plan.","example":true}}},"KwfinderSuggestedKeyword":{"type":"object","properties":{"_id":{"type":"string","description":"Keyword ID","example":"005de7e7771450763339653e918778ef"},"position":{"type":"integer","description":"The domain's ranking position for the keyword.","example":3},"kw":{"type":"string","description":"Keyword text","example":"seo solutions"},"sv":{"type":"integer","description":"Search volume","example":930},"lid":{"type":"integer","description":"Location ID","example":0}}},"LocationShort":{"type":"object","properties":{"_id":{"type":"integer","example":2703},"label":{"type":"string","example":"Slovakia"},"code":{"type":"string","nullable":true,"description":"Lower-cased ISO country code, or null when the location has none.","example":"us"}}},"KwfinderGapAnalysis":{"type":"object","properties":{"isAllowedPagination":{"type":"boolean","description":"Whether pagination is allowed for the user's plan or for a lookup paid by a keyword credit","example":true},"page":{"type":"integer","description":"Current page number","example":1},"resultsSize":{"type":"integer","description":"Maximum number of results per competitor","example":1000},"mode":{"type":"string","description":"Analysis mode, always domains.","example":"domains"},"results":{"type":"array","description":"Gap analysis results per competitor","items":{"$ref":"#/components/schemas/KwfinderGapAnalysisResult"}}}},"KwfinderGapAnalysisResult":{"type":"object","properties":{"domain":{"type":"string","description":"Competitor domain","example":"example.org"},"totalCount":{"type":"integer","description":"Total number of gap keywords found","example":5432},"originalItemsCount":{"type":"integer","description":"Number of items found before any filtering.","example":5432},"keywords":{"type":"array","description":"List of gap keywords","items":{"$ref":"#/components/schemas/KwfinderGapKeyword"}}}},"KwfinderGapKeyword":{"allOf":[{"$ref":"#/components/schemas/Keyword"},{"type":"object","properties":{"position":{"type":"integer","description":"Competitor's ranking position.","example":3}}}]},"AIWatcherPromptDetail":{"type":"object","properties":{"dateRange":{"type":"object","properties":{"from":{"type":"string","description":"Start date","example":"2024-01-01"},"to":{"type":"string","description":"End date","example":"2024-01-31"}}},"filters":{"type":"object","properties":{"models":{"type":"array","items":{"type":"integer"},"nullable":true,"description":"Filtered model IDs."}}},"prompt":{"type":"object","properties":{"_id":{"type":"string","description":"Prompt ID"},"text":{"type":"string","description":"Prompt text"},"created_at":{"type":"integer","description":"Creation timestamp"},"updated_at":{"type":"integer","description":"Last update timestamp"},"tag_ids":{"type":"array","description":"IDs of the tags assigned to the prompt.","items":{"type":"string"}}}},"metrics":{"type":"object","description":"Aggregated metrics for the prompt over the requested date range. Each metric carries its value on the end date and the change against the start date.","properties":{"score":{"type":"object","description":"Average brand score.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"visibility":{"type":"object","description":"Average visibility.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"position":{"type":"object","description":"Average brand position in the answer.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"citationsCount":{"type":"object","description":"Number of citations.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"citationRank":{"type":"object","description":"Average citation rank.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}}}},"timeSeries":{"type":"array","description":"Daily metrics over time","items":{"type":"object","properties":{"date":{"type":"string"},"score":{"type":"number","nullable":true}}}},"topBrands":{"type":"array","description":"Top mentioned brands","items":{"type":"object","properties":{"brand":{"type":"string"},"rank":{"type":"integer"},"avgScore":{"type":"number"},"frequency":{"type":"integer"}}}},"topDomains":{"type":"array","description":"Top cited domains","items":{"type":"object","properties":{"domain":{"type":"string"},"url":{"type":"string"},"title":{"type":"string"},"avgScore":{"type":"number"},"frequency":{"type":"integer"}}}},"aio":{"type":"object","nullable":true,"description":"Google AI Overview state on the end date, or null when the prompt has none.","properties":{"hasAio":{"type":"boolean","description":"Whether the AI Overview appeared."}}}}},"AIMonitorListItem":{"type":"object","description":"A monitor as the list endpoint returns it: the identifying fields, its state and the days that have results. GET /aiwatcher/monitors/{monitor_id} returns the full monitor with its models and history.","required":["_id","brand","domain","location_id","language_id","monitoring_state","dates"],"properties":{"_id":{"type":"string","description":"Monitor ID."},"brand":{"type":"string","description":"Brand name."},"domain":{"type":"string","description":"Brand domain."},"location_id":{"type":"integer","description":"Location the AI answers are collected for."},"language_id":{"type":"integer","description":"Language ID."},"share_token":{"type":"string","nullable":true,"description":"Token of the read-only share link."},"monitoring_state":{"type":"string","enum":["active","warned","paused"],"description":"active is checked normally; warned and paused are set when the account can no longer cover the monitor."},"dates":{"type":"array","items":{"type":"string","format":"date"},"description":"Days (YYYY-MM-DD) that have aggregated results, in no guaranteed order.","example":["2026-09-24"]}}},"UrlMetricGroups":{"type":"object","description":"Third-party metric groups for the URL. A group is omitted until its data is available; `v` holds the group's metrics.","properties":{"fb":{"type":"object","allOf":[{"$ref":"#/components/schemas/FacebookMetric"}],"description":"Facebook engagement metrics for the URL."},"moz":{"type":"object","allOf":[{"$ref":"#/components/schemas/MozMetric"}],"description":"Moz URL metrics."},"majestic":{"type":"object","allOf":[{"$ref":"#/components/schemas/MajesticMetric"}],"description":"Majestic index-item metrics."},"rank":{"type":"object","nullable":true,"description":"Computed Mangools authority rank derived from Moz + Majestic.","properties":{"v":{"type":"object","properties":{"r":{"type":"integer","nullable":true,"description":"Rank value 0–100, or null when Moz/Majestic inputs are missing.","example":42}}},"ts":{"type":"integer","description":"Unix timestamp (seconds) when the rank was computed; 0 when rank is null.","example":1537866000}}}}},"SerpItem":{"type":"object","description":"One entry of the parsed SERP: an organic result, an ad, or a rich-snippet feature. Which properties are present depends on `type` — only result-like entries carry `url`, `title`, `desc`, `domain`, `topRank` and `m`; every entry carries `type` and, when it was rendered, its geometry.","properties":{"type":{"type":"string","description":"SERP feature code. `ORGANIC` is an organic result, `ADV_TOP` / `ADV_BOTTOM` are ads, every other value is a rich snippet. The full list is enumerated in the endpoint description.","example":"ORGANIC"},"url":{"nullable":true,"type":"string","description":"Result URL (IDN-decoded).","example":"https://en.wikipedia.org/wiki/Monitoring"},"title":{"nullable":true,"type":"string","description":"Result headline as rendered by Google.","example":"Monitoring - Wikipedia"},"desc":{"type":"string","description":"Result snippet as rendered by Google.","example":"Monitoring (medicine), the observation of a disease, condition or one or several medical parameters over time"},"domain":{"type":"string","description":"Registrable domain of `url`.","example":"wikipedia.org"},"topRank":{"type":"integer","nullable":true,"description":"Mangools rank of the domain, a website popularity rank in which a lower number means a more popular site. Null when unknown.","example":13},"size":{"type":"object","description":"Bounding box of the rendered element in CSS pixels, measured on the desktop viewport.","properties":{"t":{"type":"number","description":"Top edge.","example":1092.859375},"l":{"type":"number","description":"Left edge.","example":180},"b":{"type":"number","description":"Bottom edge.","example":1212.859375},"r":{"type":"number","description":"Right edge.","example":780}}},"screenCoverage":{"type":"integer","description":"Share of the viewport this element covers, in percent (0 when it renders below the fold). Returned by SERPChecker only.","example":12},"visPart":{"type":"integer","description":"Share of the element itself that falls inside the viewport, in percent. Returned by SERPChecker only.","example":100},"m":{"$ref":"#/components/schemas/UrlMetricGroups"},"items":{"type":"array","description":"Sub-features of this entry, such as sitelinks, thumbnails or star ratings.","items":{"$ref":"#/components/schemas/SerpItem"}},"ctr":{"type":"number","description":"Estimated click-through rate of the entry, from 0 to 1.","example":0.2837},"coverage":{"type":"number","description":"Share of the page area the element covers, from 0 to 1.","example":0.05219},"positionFromTheTopEdge":{"type":"string","description":"Distance of the element from the top edge of the page in CSS pixels, as a decimal string with two decimals.","example":"1092.86"},"positionToFold":{"type":"object","description":"Where the element sits relative to the fold.","properties":{"status":{"type":"string","description":"Whether the element is above the fold, in it or below it.","enum":["above","in","below"],"example":"below"},"fold":{"type":"integer","description":"Height of the fold in CSS pixels.","example":1050},"elementTop":{"type":"integer","description":"Top edge of the element in CSS pixels.","example":1092},"elementBottom":{"type":"integer","description":"Bottom edge of the element in CSS pixels.","example":1182},"rectTopOfWrapper":{"type":"integer","description":"Top edge of the wrapper that holds the element in CSS pixels.","example":1092},"rectBottomOfWrapper":{"type":"integer","description":"Bottom edge of the wrapper that holds the element in CSS pixels.","example":1182}}}}},"MajesticLinkCount":{"description":"Majestic returns these link counts as decimal strings. A provider value of -1 (no data) is normalised to the integer 0.","oneOf":[{"type":"string"},{"type":"integer"}],"example":"5956"},"MajesticIndexItemInfo":{"type":"object","description":"Majestic metrics for a URL, subdomain or domain.","properties":{"Status":{"type":"string","description":"Majestic lookup status. Anything other than `Found` means Majestic holds no data for the item.","example":"Found"},"ExtBackLinks":{"type":"integer","example":376507},"RefDomains":{"type":"integer","example":3800},"ACRank":{"type":"integer","example":8},"RefIPs":{"type":"integer","example":3475},"ItemType":{"type":"integer","example":3},"RefSubNets":{"type":"integer","example":2503},"CitationFlow":{"type":"integer","example":53},"TrustFlow":{"type":"integer","example":63},"TrustMetric":{"type":"integer","example":63},"IndexedURLs":{"type":"integer","example":1},"RefDomainsEDU":{"type":"integer","example":9},"ExtBackLinksEDU":{"type":"integer","example":10},"RefDomainsGOV":{"type":"integer","example":0},"ExtBackLinksGOV":{"type":"integer","example":0},"RefDomainsEDU_Exact":{"type":"integer","example":4},"ExtBackLinksEDU_Exact":{"type":"integer","example":5},"RefDomainsGOV_Exact":{"type":"integer","example":0},"ExtBackLinksGOV_Exact":{"type":"integer","example":0},"NonUniqueLinkTypeHomepages":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeIndirect":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeDeleted":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeNoFollow":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeProtocolHTTPS":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeFrame":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeImageLink":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeRedirect":{"$ref":"#/components/schemas/MajesticLinkCount"},"NonUniqueLinkTypeTextLink":{"$ref":"#/components/schemas/MajesticLinkCount"},"TotalNonUniqueLinks":{"$ref":"#/components/schemas/MajesticLinkCount"},"OutLinksInternal":{"$ref":"#/components/schemas/MajesticLinkCount"},"OutLinksExternal":{"$ref":"#/components/schemas/MajesticLinkCount"},"OutDomainsExternal":{"$ref":"#/components/schemas/MajesticLinkCount"}},"example":{"Status":"Found","ExtBackLinks":376507,"RefDomains":3800,"ACRank":8,"RefIPs":3475,"ItemType":3,"RefSubNets":2503,"CitationFlow":53,"TrustFlow":63,"TrustMetric":63,"IndexedURLs":1,"NonUniqueLinkTypeHomepages":"263","NonUniqueLinkTypeIndirect":"5","NonUniqueLinkTypeDeleted":"2013","NonUniqueLinkTypeNoFollow":"5358","NonUniqueLinkTypeProtocolHTTPS":"377230","NonUniqueLinkTypeFrame":"2","NonUniqueLinkTypeImageLink":"1140","NonUniqueLinkTypeRedirect":"51","NonUniqueLinkTypeTextLink":"377682","TotalNonUniqueLinks":"378875","OutLinksInternal":"21","OutLinksExternal":"11","OutDomainsExternal":"8","RefDomainsEDU":9,"ExtBackLinksEDU":10,"RefDomainsGOV":0,"ExtBackLinksGOV":0,"RefDomainsEDU_Exact":4,"ExtBackLinksEDU_Exact":5,"RefDomainsGOV_Exact":0,"ExtBackLinksGOV_Exact":0}},"FacebookMetricValue":{"type":"object","description":"Facebook engagement and Open Graph data for a URL.","properties":{"l":{"type":"integer","nullable":true,"description":"Open Graph engagement count, or null when Facebook returned no engagement object."},"og":{"type":"object","nullable":true,"description":"Open Graph object, or null when the URL has none.","properties":{"description":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"image":{"type":"string","nullable":true,"description":"URL of the first Open Graph image."}}}}},"MajesticMetric":{"type":"object","properties":{"v":{"$ref":"#/components/schemas/MajesticIndexItemInfo"},"ts":{"type":"integer","description":"Unix timestamp (seconds) of the last provider refresh.","example":1617190715}}},"MozMetric":{"type":"object","properties":{"v":{"type":"object","description":"Moz metrics for the URL. Fields beyond the two below may be present.","properties":{"pda":{"type":"number","description":"Domain authority.","example":60},"upa":{"type":"number","description":"Page authority.","example":61}},"additionalProperties":{"oneOf":[{"type":"number"},{"type":"string"}],"description":"Every field is a number or a string. Only the two fields above are documented."}},"ts":{"type":"integer","description":"Unix timestamp (seconds) of the last provider refresh.","example":1617190715}}},"FacebookMetric":{"type":"object","properties":{"v":{"$ref":"#/components/schemas/FacebookMetricValue"},"ts":{"type":"integer","description":"Unix timestamp (seconds) of the last provider refresh.","example":1617190715}}},"LocationRef":{"type":"object","description":"The three-field projection of a location that is embedded in another response (`Location.out` in models/Location.js). It is not the full `Location` object that `GET /mangools/locations` returns.","properties":{"_id":{"type":"integer","description":"Location ID.","example":2840},"code":{"type":"string","nullable":true,"description":"Lower-cased country code, or null when the location has none.","example":"us"},"label":{"type":"string","description":"Canonical name of the location.","example":"New York,United States"}}},"TrackedKeywordsAddRes":{"type":"object","properties":{"tracking":{"$ref":"#/components/schemas/Tracking"},"keywords":{"type":"array","description":"Existing and newly added tracked keywords in one merged list.","items":{"$ref":"#/components/schemas/TrackedKeyword"}},"postponed_processing":{"type":"boolean","description":"Whether processing of some keywords is postponed."},"postponed_keywords":{"type":"integer","description":"Number of keywords whose processing is postponed."},"estimatedTimeProcessing":{"type":"number","description":"Estimated time until the keywords are processed."}}},"TrackedKeywordDetail":{"type":"object","properties":{"_id":{"type":"string","description":"Tracked keyword ID."},"serp_id":{"type":"string","description":"SERP ID."},"keyword_id":{"type":"string","description":"Keyword ID."},"kw":{"type":"string","description":"Keyword text."},"items":{"type":"array","description":"Ranking URLs with per-day rank, visual metrics and estimated visits.","items":{"type":"object","properties":{"type":{"type":"string","description":"Which result group the URL belongs to."},"url":{"type":"string","description":"Ranking URL."},"rank_history":{"type":"array","description":"One entry per day of the requested range.","items":{"type":"object","properties":{"date":{"type":"string","description":"Day of the entry, YYYY-MM-DD."},"rank":{"type":"integer","description":"Rank on that day, or null when the URL was not found.","nullable":true},"p":{"type":"integer","description":"Result page the URL was found on."},"af":{"type":"number","description":"Pixels of the element that are above the fold."},"ft":{"type":"number","description":"Distance of the element from the top edge of the page in pixels."},"cov":{"type":"integer","description":"Area of the page that the element covers in pixels."},"b":{"type":"number","description":"Bottom edge of the element in pixels."}}}},"estimated_visits":{"type":"number","description":"Estimated visits on the end date, or null when it cannot be estimated.","nullable":true},"estimated_visits_from":{"type":"number","description":"Estimated visits on the start date, or null.","nullable":true},"estimated_visits_change":{"type":"number","description":"Difference between the two, or null.","nullable":true},"rank":{"type":"object","description":"Rank summary over the requested range.","properties":{"last":{"type":"integer","description":"Rank on the end date, 101 when the URL is outside the top 100, or null.","nullable":true},"avg":{"type":"number","description":"Average rank over the range."},"best":{"type":"integer","description":"Best rank in the range."},"change":{"type":"integer","description":"Difference between the rank on the end date and on the start date, or null.","nullable":true}}},"visual_metrics":{"type":"object","description":"Visual metrics of the URL on the end date.","properties":{"status":{"type":"string","description":"Whether the URL is above the fold, in it or below it, or null.","nullable":true},"serp_coverage":{"type":"number","description":"Share of the SERP the URL covers, in percent.","nullable":true},"serp_coverage_change":{"type":"number","description":"Change of the coverage over the range.","nullable":true},"above_the_fold":{"type":"integer","description":"Pixels above the fold, or null.","nullable":true},"above_the_fold_change":{"type":"number","description":"Change of the pixels above the fold over the range.","nullable":true},"from_top_edge":{"type":"integer","description":"Distance from the top edge of the page in pixels, or null.","nullable":true},"from_top_edge_change":{"type":"number","description":"Change of the distance from the top edge over the range.","nullable":true}}}}}},"search_volume":{"type":"integer","description":"Search volume on the end date.","nullable":true},"msv":{"type":"array","description":"Monthly search volumes.","nullable":true,"items":{"$ref":"#/components/schemas/MonthlySearchVolume"}},"serp_snapshot":{"type":"object","properties":{"10_id":{"type":"string","description":"Snapshot ID."},"id":{"type":"string","description":"Snapshot ID."},"source_url":{"type":"string","description":"Link to the SERP snapshot preview.","nullable":true},"source_10_url":{"type":"string","description":"Link to the SERP snapshot preview.","nullable":true},"crawled_at":{"description":"When the snapshot was crawled, or null.","nullable":true,"type":"integer"}}},"last_checked_at":{"type":"integer","description":"Unix timestamp of the last check."},"created_at":{"type":"integer","description":"Unix timestamp of creation."},"tags":{"type":"array","description":"Assigned tags.","items":{"$ref":"#/components/schemas/Tag"}}}},"TrackingStatsKeyword":{"type":"object","properties":{"_id":{"type":"string","description":"Tracked keyword ID."},"rank_change":{"type":"number","description":"Rank change against the previous period.","nullable":true},"search_volume":{"type":"number","description":"Search volume.","nullable":true},"is_more_url":{"type":"boolean","description":"Whether more than one URL of the domain ranks."},"visual_metrics":{"type":"object","description":"Visual metrics of the ranking result on the end date.","properties":{"status":{"type":"string","nullable":true,"description":"Whether the result is above the fold, in it or below it, or null.","enum":["above","in","below",null]},"serp_coverage":{"type":"number","nullable":true,"description":"Share of the SERP the result covers, in percent."},"serp_coverage_change":{"type":"number","nullable":true,"description":"Change of the coverage over the range."},"above_the_fold":{"type":"integer","nullable":true,"description":"Pixels above the fold, or null."},"above_the_fold_change":{"type":"number","nullable":true,"description":"Change of the pixels above the fold over the range."},"from_top_edge":{"type":"integer","nullable":true,"description":"Distance from the top edge of the page in pixels, or null."},"from_top_edge_change":{"type":"number","nullable":true,"description":"Change of the distance from the top edge over the range."}}},"serp_features":{"type":"array","description":"SERP features of the ranking day that the tracked keyword has.","items":{"type":"string","enum":["MAP_PACK","FEATURED_SNIPPET"],"description":"SERP feature code."}},"map_pack":{"$ref":"#/components/schemas/MapPack"},"feat_snippet":{"type":"object","properties":{"serpRank":{"type":"number","description":"Featured Snippet position in the SERP.","nullable":true},"url":{"type":"string","description":"URL in the Featured Snippet.","nullable":true},"isRanking":{"type":"boolean","description":"Whether the tracked domain holds the Featured Snippet."}}},"estimated_visits":{"type":"number","description":"Estimated visits.","nullable":true},"rank":{"type":"object","properties":{"last":{"type":"integer","description":"Most recent rank.","nullable":true},"avg":{"type":"number","description":"Average rank.","nullable":true},"best":{"type":"integer","description":"Best rank.","nullable":true}}},"last_checked_at":{"type":"integer","description":"Unix timestamp of the last check."},"last_crawled_at":{"type":"string","description":"Date of the last crawl (YYYY-MM-DD), or null.","nullable":true},"rank_check_pending":{"type":"boolean","description":"True while a scan of the keyword is queued and has not landed: an on-demand refresh in flight or the first crawl of a keyword added in the last 24 hours."},"estimated_visits_change":{"type":"number","description":"Change of estimated visits.","nullable":true},"estimated_visits_total_change":{"type":"number","description":"Total change of estimated visits.","nullable":true},"performanceIndexChange":{"type":"number","description":"Change of the performance index.","nullable":true},"rank_history":{"type":"array","description":"Rank history sampled across the range.","items":{"type":"number","nullable":true}},"is_empty_main_array":{"type":"boolean","description":"Whether the keyword has no organic result on the end date."},"nearest_before_day":{"type":"string","description":"Nearest earlier day with data.","nullable":true}}},"AIMonitorDashboard":{"type":"object","properties":{"monitor":{"type":"object","properties":{"_id":{"type":"string","description":"Monitor ID."},"brand":{"type":"string","description":"Brand name."},"domain":{"type":"string","description":"Brand domain."},"perception":{"type":"string","description":"Brand perception.","nullable":true},"perceptionModelId":{"type":"integer","description":"ID of the model the perception belongs to."},"location_id":{"type":"integer","description":"Location the AI answers are collected for."},"language_id":{"type":"integer","description":"Language ID."},"platform_id":{"type":"integer","description":"Platform ID (1 = desktop, 2 = mobile)."},"models":{"type":"array","description":"IDs of the AI models the monitor runs on.","items":{"type":"integer"}},"location":{"type":"object","nullable":true,"description":"Location the AI answers are collected for, or null when the monitor has none.","properties":{"id":{"type":"integer","description":"Location ID."},"name":{"type":"string","description":"Location name."},"label":{"type":"string","description":"Location name with its parents, for display."},"code":{"type":"string","nullable":true,"description":"Country code."},"type":{"type":"string","nullable":true,"description":"Location type in lower case, for example country or city."}}},"monitoring_state":{"type":"string","description":"Monitoring state. Sent to the owner only.","enum":["active","warned","paused"]}}},"isCompleted":{"type":"boolean","description":"Whether data collection for the end date is completed."},"hasPendingChanges":{"type":"boolean","description":"Whether the monitor has configuration changes that are not yet applied."},"dateRange":{"type":"object","properties":{"from":{"type":"string","description":"Start date."},"to":{"type":"string","description":"End date."}}},"filters":{"type":"object","properties":{"models":{"type":"array","items":{"type":"integer"},"nullable":true,"description":"Filtered model IDs."}}},"metrics":{"type":"object","properties":{"score":{"type":"object","description":"Average brand score.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"visibility":{"type":"object","description":"Average visibility.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"position":{"type":"object","description":"Average brand position in the answer.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"bestPerforming":{"type":"object","description":"Model with the best score.","properties":{"modelId":{"type":"integer","nullable":true,"description":"ID of the model."},"currentValue":{"type":"number","nullable":true,"description":"Value on the end date."},"change":{"type":"number","nullable":true,"description":"Change against the start date."}}},"bestVisibility":{"type":"object","description":"Model with the best visibility.","properties":{"modelId":{"type":"integer","nullable":true,"description":"ID of the model."},"currentValue":{"type":"number","nullable":true,"description":"Value on the end date."},"change":{"type":"number","nullable":true,"description":"Change against the start date."}}},"mostCited":{"type":"object","description":"Model with the most citations.","properties":{"modelId":{"type":"integer","nullable":true,"description":"ID of the model."},"currentValue":{"type":"number","nullable":true,"description":"Value on the end date."},"change":{"type":"number","nullable":true,"description":"Change against the start date."}}}}},"timeSeries":{"type":"array","description":"Daily metrics over time.","items":{"type":"object","properties":{"date":{"type":"string","description":"Day, YYYY-MM-DD."},"score":{"type":"number","nullable":true,"description":"Average score on that day."},"visibility":{"type":"number","nullable":true,"description":"Average visibility on that day."},"position":{"type":"number","nullable":true,"description":"Average position on that day."}}}},"rankings":{"type":"object","properties":{"brands":{"type":"array","description":"Brands ranked by score, the monitored brand included.","items":{"type":"object","properties":{"brand":{"type":"string","description":"Brand name."},"isMatch":{"type":"boolean","description":"Whether this row is the monitored brand."},"rank":{"type":"integer","nullable":true,"description":"Position in the ranking, or null when the brand dropped out of it."},"avgScore":{"type":"number","nullable":true,"description":"Average score."},"avgVisibility":{"type":"number","nullable":true,"description":"Average visibility."},"avgPosition":{"type":"number","nullable":true,"description":"Average position in the answers."},"frequency":{"type":"integer","description":"How often the brand was mentioned."},"rankChange":{"type":"integer","nullable":true,"description":"Change of the rank against the start date, or null."},"scoreChange":{"type":"number","nullable":true,"description":"Change of the score against the start date, or null."},"visibilityChange":{"type":"number","nullable":true,"description":"Change of the visibility against the start date, or null."},"positionChange":{"type":"number","nullable":true,"description":"Change of the position against the start date, or null."},"frequencyChange":{"type":"number","nullable":true,"description":"Change of the frequency against the start date, or null."},"brandVariations":{"nullable":true,"type":"array","description":"Spellings the brand is matched by. Sent only when the brand has variations.","items":{"type":"string"}},"isPlaceholder":{"type":"boolean","description":"True for a brand that ranked on the start date but not on the end date."},"timeSeries":{"type":"array","description":"Daily values of the brand in the requested range.","items":{"type":"object","properties":{"date":{"type":"string","description":"Day, YYYY-MM-DD."},"score":{"type":"number","nullable":true,"description":"Score on that day."},"visibility":{"type":"number","nullable":true,"description":"Visibility on that day."},"position":{"type":"number","nullable":true,"description":"Position on that day."},"rank":{"type":"integer","description":"Rank on that day."}}}}}}},"prompts":{"type":"array","description":"Prompts ranked by score.","items":{"type":"object","properties":{"prompt_id":{"type":"string","description":"Prompt ID."},"text":{"type":"string","description":"Prompt text."},"rank":{"type":"integer","description":"Position in the ranking."},"avgScore":{"type":"number","nullable":true,"description":"Average score."},"avgVisibility":{"type":"number","nullable":true,"description":"Average visibility."},"avgPosition":{"type":"number","nullable":true,"description":"Average position in the answers."},"aio":{"type":"object","nullable":true,"description":"Google AI Overview state on the end date, or null when there is none.","properties":{"hasAio":{"type":"boolean","description":"Whether the AI Overview appeared."}}},"rankChange":{"type":"integer","nullable":true,"description":"Change of the rank against the start date, or null."},"scoreChange":{"type":"number","nullable":true,"description":"Change of the score against the start date, or null."},"visibilityChange":{"type":"number","nullable":true,"description":"Change of the visibility against the start date, or null."},"positionChange":{"type":"number","nullable":true,"description":"Change of the position against the start date, or null."},"frequencyChange":{"type":"number","nullable":true,"description":"Always null for prompts."}}}},"domains":{"type":"array","description":"Cited domains ranked by frequency.","items":{"type":"object","properties":{"domain":{"type":"string","description":"Cited domain."},"url":{"type":"string","description":"Most cited URL of the domain."},"title":{"type":"string","description":"Title of that URL."},"hit":{"type":"boolean","description":"Whether the domain is the monitored one."},"frequency":{"type":"integer","description":"How often the domain was cited."},"rank":{"type":"integer","nullable":true,"description":"Position in the ranking, or null when the domain dropped out of it."},"avgScore":{"type":"number","nullable":true,"description":"Average score."},"avgVisibility":{"type":"number","nullable":true,"description":"Average visibility."},"avgPosition":{"type":"number","nullable":true,"description":"Average position in the answers."},"rankChange":{"type":"integer","nullable":true,"description":"Change of the rank against the start date, or null."},"positionChange":{"type":"number","nullable":true,"description":"Change of the position against the start date, or null."},"frequencyChange":{"type":"number","nullable":true,"description":"Change of the frequency against the start date, or null."},"isPlaceholder":{"type":"boolean","description":"True for a domain that ranked on the start date but not on the end date."}}}}}},"availableDates":{"type":"array","items":{"type":"string"}},"brand_perception_display":{"type":"boolean","description":"Show the brand perception card."},"score_label_display":{"type":"boolean","description":"Show the score label."},"performance_cards_display":{"type":"boolean","description":"Show the performance cards."},"performance_summary_display":{"type":"boolean","description":"Show the performance summary."},"brand_perception_feedback_given":{"type":"boolean","description":"Whether feedback on the brand perception was given."},"performance_summary_feedback_given":{"type":"boolean","description":"Whether feedback on the performance summary was given."}}},"AIMonitorPromptList":{"type":"object","properties":{"dateRange":{"type":"object","properties":{"from":{"type":"string","description":"Start date."},"to":{"type":"string","description":"End date."}}},"filters":{"type":"object","description":"Filters applied to the list.","properties":{"models":{"type":"array","nullable":true,"description":"Filtered model IDs. This endpoint does not filter by model and leaves it out.","items":{"type":"integer"}}}},"prompts":{"type":"array","items":{"type":"object","properties":{"prompt":{"type":"object","properties":{"_id":{"type":"string","description":"Prompt ID."},"text":{"type":"string","description":"Prompt text."},"tag_ids":{"type":"array","description":"IDs of the tags assigned to the prompt.","items":{"type":"string"}},"created_at":{"type":"integer","description":"Unix timestamp of creation."},"updated_at":{"type":"integer","description":"Unix timestamp of the last update."}}},"metrics":{"type":"object","description":"Metrics of the prompt over the requested range.","properties":{"score":{"type":"object","description":"Average brand score.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"visibility":{"type":"object","description":"Average visibility.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"position":{"type":"object","description":"Average brand position in the answer.","properties":{"value":{"type":"number","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"number","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"citationsCount":{"type":"object","description":"Number of citations.","properties":{"value":{"type":"integer","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"integer","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}},"citationRank":{"type":"object","description":"Rank of the brand domain among the cited domains.","properties":{"value":{"type":"integer","nullable":true,"description":"Value on the end date, or null when there is no data."},"change":{"type":"integer","nullable":true,"description":"Change against the start date, or null when either end of the range has no data."}}}}},"aio":{"type":"object","nullable":true,"description":"Google AI Overview state on the end date, or null when the prompt has none.","properties":{"hasAio":{"type":"boolean","description":"Whether the AI Overview appeared."}}}}}}}},"AIMonitorPromptsAddRes":{"type":"object","properties":{"added_count":{"type":"integer","description":"Number of prompts added."},"prompts":{"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","description":"Prompt ID."},"text":{"type":"string","description":"Prompt text."}}}}}}},"examples":{"Locations":{"summary":"Example of retrieved locations","value":[{"active":true,"canonical_name":"New York, United States","code":"us","country_code":"US","created_at":1588773715,"google_domain":"google.us","label":"New York, United States","name":"New York","parent_id":2840,"status":"Active","target_type":"State","tld":"us","type":70,"_id":21167},{"active":true,"canonical_name":"New York, New York, United States","code":"us","country_code":"US","created_at":1588773715,"google_domain":"google.us","label":"New York, New York, United States","name":"New York","parent_id":21167,"status":"Active","target_type":"City","tld":"us","type":92,"_id":1023191}]},"Location":{"summary":"Example of specific location","value":{"active":true,"canonical_name":"New York, United States","code":"us","country_code":"US","created_at":1588773715,"google_domain":"google.us","label":"New York, United States","name":"New York","parent_id":2840,"status":"Active","target_type":"State","tld":"us","type":70,"_id":21167}}},"responses":{"Unauthorized":{"description":"The `x-access-token` header is missing, malformed or does not match an active API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"AuthError","message":"Invalid API Key"}}}}},"RateLimited":{"description":"The request was refused by the quota system; `error.type` tells the two cases apart.\n\n**`RateLimit`** — too many requests in a short period (the burst limit, or the keyword-import cooldown). For the burst limit, `retry_after` is the length of the burst window: 30 seconds for API-key clients, 1 second for the hosted MCP server. What to do:\n\n1. Read `error.retry_after` (seconds) or the `Retry-After` header.\n2. Wait that many seconds.\n3. Send the same request again, once.\n4. Keep sending one request at a time, not in parallel.\n\n**`CreditLimit`** — the plan limit for this resource is spent. It never carries `retry_after`, and waiting does not clear it. Do not retry: call `GET /kwfinder/limits` to read the remaining allowance per resource and tell the user the quota is spent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"RateLimit","message":"Too many requests in short period. Wait retry_after seconds (also sent as the Retry-After header), then send this same request again. Send requests one at a time, not in parallel.","retry_after":30}}}}},"NotFound":{"description":"No resource matches the supplied identifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"Error","message":"Tag not found"}}}}},"GatewayRateLimited":{"description":"The gateway rate limit of 4 requests per second per client IP was exceeded. The gateway answers before the request reaches the API, so the body is an HTML error page, not the JSON `Error` object the API returns for its own 429 responses.","content":{"text/html":{"schema":{"type":"string","description":"HTML error page returned by the gateway."},"example":"<html>\n<head><title>429 Too Many Requests</title></head>\n<body>\n<center><h1>429 Too Many Requests</h1></center>\n</body>\n</html>\n"}}},"InvalidParameter":{"description":"A request parameter failed validation. The error names the parameter and carries no `errors` list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"InvalidInput","message":"Parameter url is invalid"}}}}},"ValidationFailed":{"description":"The request did not match the operation's input schema. `errors` carries one message per failed rule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"ValidationError","message":"Your request is invalid","errors":["\"kw\" is required"]}}}}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","name":"x-access-token","in":"header","description":"API token issued for your Mangools account, sent as an API key in the `x-access-token` HTTP header. This is NOT a standard RFC 6750 `Authorization: Bearer <token>` header. Auto-generated clients should be configured to send the token in `x-access-token` accordingly."}}}}