{"openapi":"3.0.2","paths":{"/v1/domains":{"get":{"description":"Retrieves all domains associated with the authenticated account. For subaccounts, only domains linked to that specific subaccount will be returned. Domains represent the website URLs being tracked and analyzed within the system. This endpoint always refreshes the account domain list from the source of truth, so domains added or removed in the product UI appear immediately (other authenticated endpoints may still use a short-lived auth cache).","summary":"List domains","tags":["domains"],"parameters":[],"operationId":"domains.getDomains","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"global_domain_identifier":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"},"domain":{"type":"string","example":"morningscore.io"},"global_company_identifier":{"type":"string","example":"v3.dev.18a7b02dcd2966351a16cda9cdaa09ef"},"hl":{"type":"string"},"gl":{"type":"string"}},"required":["global_domain_identifier","domain","global_company_identifier","hl","gl"],"description":"A domain linked to the account: global identifiers, hostname, and language / region (`hl` / `gl`) used for keyword data."},"description":"All domains visible to the authenticated account (subaccounts see only their linked domains)."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100},"post":{"description":"Registers a new website URL on the authenticated account. Responses use `201 Created` with global domain and company identifiers; subscriber caches refresh.","summary":"Add domain","tags":["domains"],"parameters":[],"operationId":"domains.addDomain","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","example":"morningscore.io"},"market":{"type":"string","enum":["ps_af","sq_al","ar_dz","kg_ao","en_ai","es_ar","hy_am","en_au","de_at","az_az","en_bs","ar_bh","bn_bd","be_by","nl_be","en_bz","fr_bj","es_bo","bs_ba","tn_bw","pt_br","zh_bn","bg_bg","fr_bf","fr_bi","km_kh","fr_cm","en_ca","pt_cv","fr_cf","ar_td","es_cl","zh_cn","es_co","en_ck","es_cr","fr_ci","hr_hr","es_cu","en_cy","cs_cz","sw_cd","da_dk","en_dm","es_do","es_ec","ar_eg","es_sv","et_ee","am_et","en_fj","fi_fi","fr_fr","fr_ga","en_gm","ka_ge","de_de","ak_gh","en_gi","el_gr","da_gl","fr_gp","es_gt","en_gg","en_gy","fr_ht","es_hn","zh_hk","hu_hu","is_is","bn_in","jw_id","ar_iq","en_ie","en_im","iw_il","it_it","en_jm","ja_jp","en_je","ar_jo","kk_kz","sw_ke","en_ki","ar_kw","ky_kg","lo_la","lv_lv","ar_lb","ar_ly","de_li","lt_lt","fr_lu","mk_mk","fr_mg","en_my","mt_mt","es_mx","mo_md","mn_mn","bs_me","en_ms","ar_ma","ny_mz","af_na","en_nr","ne_np","nl_nl","en_nz","es_ni","fr_ne","en_ng","en_nu","no_no","ar_om","ur_pk","ar_ps","es_pa","es_py","es_pe","tl_ph","pl_pl","pt_pt","es_pr","ar_qa","ro_ro","ru_ru","fr_rw","ar_sa","fr_sn","sr_rs","en_sc","en_sl","zh_sg","sk_sk","sl_si","en_sb","so_so","en_za","ko_kr","es_es","si_lk","sv_se","de_ch","zh_tw","tg_tj","sw_tz","th_th","en_tk","to_to","zh_tt","ar_tn","tr_tr","tk_tm","lg_ug","uk_ua","ar_ae","en_gb","en_us","es_uy","uz_uz","es_ve","vi_vn","en_vi","ny_zm","ny_zw","my_mm"],"example":"da_dk","description":"Search market as language_country (e.g. da_dk = Danish in Denmark, en_us = English in United States)."}},"required":["domain","market"],"description":"Hostname to register plus search market (e.g. `da_dk` for Danish in Denmark, `en_us` for English in the United States)."}}}},"responses":{"201":{"description":"201","content":{"application/json":{"schema":{"type":"object","properties":{"global_domain_identifier":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"},"domain":{"type":"string","example":"morningscore.io"},"global_company_identifier":{"type":"string","example":"v3.dev.18a7b02dcd2966351a16cda9cdaa09ef"},"hl":{"type":"string"},"gl":{"type":"string"}},"required":["global_domain_identifier","domain","global_company_identifier","hl","gl"],"description":"Newly registered domain and identifiers."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/domains/{domainId}":{"get":{"description":"Retrieves detailed information about a specific domain including score, link, health, competitor, and recent score-history metrics.","summary":"Get domain details","tags":["domains"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"domains.getDomainDetails","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"global_domain_identifier":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"},"domain":{"type":"string","example":"morningscore.io"},"global_company_identifier":{"type":"string","example":"v3.dev.18a7b02dcd2966351a16cda9cdaa09ef"},"hl":{"type":"string"},"gl":{"type":"string"},"score":{"type":"number","nullable":true},"keywords":{"type":"number","nullable":true},"traffic":{"type":"number","nullable":true},"currency":{"type":"string"},"metrics":{"type":"object","properties":{"link_score":{"type":"number","nullable":true},"refdomains":{"type":"number","nullable":true},"domain_rating":{"type":"number","nullable":true}},"required":["link_score","refdomains","domain_rating"]},"score_summary":{"nullable":true},"health":{"nullable":true},"competitors":{"nullable":true},"score_history":{"nullable":true},"cms_type":{"type":"string","enum":["wordpress","shopify"],"nullable":true,"description":"Detected CMS for the tracked domain hostname (wordpress or shopify). Null when unknown."},"shopify_bot_auth_expires_at":{"type":"string","format":"date-time","nullable":true,"description":"ISO expiry of Shopify Web Bot Auth from Signature-Input. Null when unset or unparseable. Present after expiry so clients can warn."}},"required":["global_domain_identifier","domain","global_company_identifier","hl","gl","score","keywords","traffic","currency","metrics"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100},"delete":{"description":"Removes a domain by global `domainId`, stops tracking, invalidates caches, and returns a confirmation subject to account limits.","summary":"Remove domain","tags":["domains"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"domains.removeDomain","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"description":"Confirmation after the domain was removed from the account."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":900}},"/v1/domains/{domainId}/activation-status":{"get":{"description":"Returns onboarding and data-activation progress for a domain: `is_activating`, `is_completed`, `is_failed`, optional `status` text, per-step rows, and `eta` when known. Poll shortly after adding a domain until activation settles.","summary":"Get domain activation status","tags":["domains"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"domains.getDomainActivationStatus","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean","description":"Whether an activation record exists for this domain."},"status":{"type":"string","nullable":true,"description":"Optional human-readable overall status text."},"is_activating":{"type":"boolean","description":"True while onboarding / data pipelines are still running."},"is_completed":{"type":"boolean","description":"True when activation finished successfully."},"is_failed":{"type":"boolean","description":"True when activation stopped with an error."},"eta":{"type":"string","nullable":true,"description":"Estimated completion time when available."},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable identifier for this activation step."},"status":{"type":"string","enum":["pending","in_progress","completed","failed"],"description":"Whether this step is waiting, running, done, or failed."}},"required":["id","status"]}}},"required":["found","status","is_activating","is_completed","is_failed","eta","steps"],"description":"Onboarding and data-activation progress after adding a domain: completion flags, per-step status, optional summary text, and `eta`. Poll until `is_completed` or `is_failed`."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/domains/{domainId}/website-summary":{"get":{"description":"Returns the generated website summary and brand names for a domain. Used during onboarding and anywhere a short “what this site is about” text is needed. Poll until `has_data` is true; `data_status` is `in_progress` while generation is running.","summary":"Get website summary","tags":["domains"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"domains.getWebsiteSummary","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"hostname":{"type":"string","nullable":true},"has_data":{"type":"boolean"},"data_status":{"type":"string","enum":["has_data","in_progress","failed","no_data"]},"status":{"type":"string","nullable":true},"summary":{"type":"string","nullable":true},"brands":{"type":"array","items":{"type":"string"}},"ready_at":{"type":"string","nullable":true}},"required":["hostname","has_data","data_status","status","summary","brands","ready_at"],"description":"Decompressed website summary for a domain: what the site is about, extracted brand names, and whether generation has finished. Poll until has_data is true or data_status is failed."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domainId}/morningscore-history":{"get":{"description":"Returns daily Morningscore history for a domain: score, traffic, and keyword counts from domain-market aggregations. This endpoint is not paginated with `pagination.page` / `pagination.per_page`. `from` / `to` bound the inclusive UTC date range; `limit` (default 90) caps how many of the most recent in-range daily rows are returned. When both `from` and `to` are omitted, the range defaults to the last `limit` days.","summary":"Get score history","tags":["domains"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"from","in":"query","description":"Inclusive start of the date range (ISO 8601 date or datetime, UTC day). Example: `2026-07-30` keeps rows on or after that day. If omitted (and `to` is omitted), defaults to `limit` days before now.","content":{"application/json":{"schema":{"type":"string","example":"2026-07-30"}}}},{"name":"to","in":"query","description":"Inclusive end of the date range (ISO 8601 date or datetime, UTC day). If omitted, defaults to now. If only `to` is set, `from` defaults to `limit` days before `to`.","content":{"application/json":{"schema":{"type":"string","example":"2026-08-11"}}}},{"name":"limit","in":"query","description":"Maximum number of daily history rows to return after applying `from`/`to`. Not page-based pagination. Also sizes the default window when `from`/`to` are omitted (last N days). Default `90`.","content":{"application/json":{"schema":{"default":90,"type":"number","minimum":1,"maximum":1000,"example":90}}}}],"operationId":"domains.getScoreHistory","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean","description":"True when at least one history row is returned after applying `limit`."},"data_status":{"type":"string","description":"Availability of history data (for example `has_data` or `missing_history`)."},"domain":{"type":"string","description":"Hostname the history belongs to."},"hl":{"type":"string","description":"Language code for the domain market."},"gl":{"type":"string","description":"Country/region code for the domain market."},"build_id":{"type":"string","nullable":true,"description":"Reserved build identifier. Currently always `null` for this endpoint."},"from":{"type":"string","nullable":true},"to":{"type":"string","nullable":true},"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","nullable":true,"description":"UTC day for this history point (ISO 8601).","example":"2026-08-10T00:00:00.000Z"},"score":{"type":"number","nullable":true,"description":"Morningscore value for the day."},"traffic":{"type":"number","nullable":true,"description":"Estimated traffic for the day."},"keywords_count":{"type":"number","nullable":true,"description":"Number of keywords in the domain-market data for the day."},"keywords_with_score_count":{"type":"number","nullable":true,"description":"Number of keywords that contribute score for the day."},"ranking_keywords_count":{"type":"number","nullable":true,"description":"Reserved; currently always `null` on this endpoint."},"top_keywords_count":{"type":"number","nullable":true,"description":"Number of top-ranking keywords for the day."},"abs_score_change":{"type":"number","nullable":true,"description":"Absolute score change versus the previous returned row (`null` for the first row)."},"rel_score_change":{"type":"number","nullable":true,"description":"Relative score change versus the previous returned row (`null` when previous score is missing or zero)."}},"required":["score","traffic","keywords_count","keywords_with_score_count","ranking_keywords_count","top_keywords_count","abs_score_change","rel_score_change"],"additionalProperties":true},"description":"Daily history rows, oldest first. Length is at most `limit`."}},"required":["has_data","data_status","domain","hl","gl","build_id","data"],"additionalProperties":true}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/domains/{domainId}/competitors":{"get":{"description":"Returns a paginated list of saved competitors for a domain from the domain-market competitor source.","summary":"Get competitors","tags":["competitors"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"include_metrics","in":"query","content":{"application/json":{"schema":{"default":false,"type":"boolean","nullable":true}}}}],"operationId":"competitors.getCompetitors","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"global_domain_identifier":{"type":"string","nullable":true},"score":{"type":"number","nullable":true},"traffic":{"type":"number","nullable":true},"keywords_count":{"type":"number","nullable":true},"ranking_keywords_count":{"type":"number","nullable":true},"finished_at":{"type":"string","nullable":true}},"required":["domain"],"additionalProperties":true}}},"required":["total","page","per_page","data"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100},"post":{"description":"Adds a competitor hostname to the domain using the same app operation as the web UI, authenticated with the user API key.","summary":"Add competitor","tags":["competitors"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"competitors.addCompetitor","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"competitor_domain":{"type":"string","example":"morningscore.io"}},"required":["competitor_domain"],"description":"Hostname of the competitor website to track against the domain."}}}},"responses":{"201":{"description":"201","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"competitor":{"type":"object","properties":{"domain":{"type":"string"},"global_domain_identifier":{"type":"string"}},"required":["domain","global_domain_identifier"]}},"required":["message","competitor"],"description":"Confirmation after a competitor was added to the domain."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/domains/{domainId}/suggested-competitors":{"get":{"description":"Returns competitor suggestions for a domain, excluding competitors already saved on the account.","summary":"Get suggested competitors","tags":["competitors"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":20}}}}],"operationId":"competitors.getSuggestedCompetitors","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"companyName":{"type":"string"},"competitorTypeEnum":{"type":"string"},"relevanceScore":{"type":"number"},"source":{"type":"string"}},"required":["domain"],"additionalProperties":true}},"has_data":{"type":"boolean"},"data_status":{"type":"string"}},"required":["total","page","per_page","data"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/domains/{domainId}/competitors/{competitorId}":{"delete":{"description":"Removes a saved competitor from the domain by its global domain identifier.","summary":"Remove competitor","tags":["competitors"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"competitorId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"competitors.removeCompetitor","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"description":"Confirmation after a competitor was removed from the domain."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":900}},"/v1/{domainId}/missions":{"get":{"description":"Lists missions for a domain. `status` maps to Laravel: `current`, `completed`, `archived` (`is_archived`), `active` (`is_not_archived`), or `suggested`. Optional `category` filters by keywords, links, onsite, or onboarding.","summary":"List missions","tags":["missions"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"status","in":"query","description":"Which mission list to return: incomplete (`current`), `completed`, `archived`, non-archived (`active`), or AI/domain `suggested` missions.","content":{"application/json":{"schema":{"default":"current","type":"string","enum":["current","completed","archived","active","suggested"]}}}},{"name":"category","in":"query","description":"Filter missions by category (maps to Laravel `category` query filter).","content":{"application/json":{"schema":{"type":"string","enum":["keywords","keywords_target_only","links","onsite","onboarding"]}}}}],"operationId":"missions.listMissions","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":0},"is_disabled":{"type":"boolean"},"xp":{"type":"number","nullable":true},"xp_claimed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"category":{"type":"string","enum":["keywords","links","onsite","onboarding","unknown"],"description":"High-level mission category derived from mission type."},"translated_category":{"type":"string"},"completed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"archived_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"checking_status":{"type":"boolean"},"created_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization."},"description":{"type":"string"},"difficulty":{"type":"number"},"roi_currency":{"type":"number","description":"Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code)."},"roi_slug":{"type":"string","enum":["epic","amazing","great","good","fine","small_fix"],"description":"ROI tier label derived from `increase_ratio`."},"type":{"type":"string","description":"Mission type slug.","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks","onboarding_verify_account","onboarding_keywords_count","onboarding_competitors_count","onboarding_keyword_research_count","onboarding_added_missions_count","onboarding_scan_website_count","onboarding_prompts_count","onboarding_geo_score","onboarding_article_count","onboarding_tooltips_clicked_count","onboarding_guides_opened_count","onboarding_add_domain","onboarding_watch_intro_video"]},"is_suggested":{"type":"boolean"},"keyword":{"type":"string","nullable":true},"kwHash":{"type":"string","nullable":true},"progress_ratio":{"type":"number"},"roi":{"type":"number"},"roi_recent":{"type":"number"},"current":{"type":"number"},"target":{"type":"number"},"target_currency":{"type":"string"},"target_diff":{"type":"number"},"hostname":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"onsite_page_id":{"oneOf":[{"type":"string"},{"type":"number"}],"nullable":true,"description":"Onsite page id from mission parameters (string or numeric depending on storage)."}},"required":["id","is_disabled","xp","xp_claimed_at","category","translated_category","completed_at","archived_at","checking_status","created_at","description","difficulty","roi_currency","roi_slug","type","is_suggested","keyword","kwHash","progress_ratio","roi","roi_recent","current","target","target_currency","target_diff","hostname","page","onsite_page_id"],"description":"Mission row as returned by Laravel `MissionResource` on list and mutation endpoints."}}},"required":["total","page","per_page","data"],"description":"Paginated mission list (`total`, `page`, `per_page`, `data`)."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100},"post":{"description":"Creates a new mission for the domain. Supported `mission_type` values: `keywords_target_position`, `keywords_morningscore`, `keywords_gsc`, `links_count`, `links_count_rating`, `links_specific`, `links_rank`, `onsite_page_tasks`. You can create many missions; Laravel only deduplicates **incomplete** missions with the same type and parameters.","summary":"Create mission","tags":["missions"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"missions.createMission","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"mission_type":{"type":"string","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks"],"description":"Mission type to create. One of: `keywords_target_position`, `keywords_morningscore`, `keywords_gsc`, `links_count`, `links_count_rating`, `links_specific`, `links_rank`, `onsite_page_tasks`.","example":"keywords_target_position"},"keyword":{"type":"string","description":"**Required** for `keywords_target_position`. Keyword to rank for."},"target":{"type":"number","description":"**Required** for every creatable type. Meaning varies: rank position, Morningscore, link count, link rank, tasks to fix, etc."},"target_currency":{"type":"string","description":"**Required** for `keywords_morningscore`. Currency for the target score (e.g. `USD`, `DKK`)."},"target_domain":{"type":"string","description":"**Required** for `links_specific`. Referring domain to obtain a link from."},"rating":{"type":"number","description":"**Required** for `links_count_rating`. Minimum link rating threshold."},"page":{"type":"string","description":"**Required** for `onsite_page_tasks`. Landing page path (e.g. `/blog/post/`)."},"onsite_page_id":{"type":"string","description":"Optional for `onsite_page_tasks`. Onsite crawler page id when known."},"sort_index":{"type":"integer"},"initial":{"type":"integer"},"currency":{"type":"string"}},"required":["mission_type"],"description":"Mission creation payload. `company_id` and `domain_id` are set from the path. You may create multiple missions per domain; Laravel removes other **incomplete** missions that match the same type and parameters."}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"missions":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}},"description":"Domain missions relation after create (raw model attributes)."},"mission":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":0},"is_disabled":{"type":"boolean"},"xp":{"type":"number","nullable":true},"xp_claimed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"category":{"type":"string","enum":["keywords","links","onsite","onboarding","unknown"],"description":"High-level mission category derived from mission type."},"translated_category":{"type":"string"},"completed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"archived_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"checking_status":{"type":"boolean"},"created_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization."},"description":{"type":"string"},"difficulty":{"type":"number"},"roi_currency":{"type":"number","description":"Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code)."},"roi_slug":{"type":"string","enum":["epic","amazing","great","good","fine","small_fix"],"description":"ROI tier label derived from `increase_ratio`."},"type":{"type":"string","description":"Mission type slug.","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks","onboarding_verify_account","onboarding_keywords_count","onboarding_competitors_count","onboarding_keyword_research_count","onboarding_added_missions_count","onboarding_scan_website_count","onboarding_prompts_count","onboarding_geo_score","onboarding_article_count","onboarding_tooltips_clicked_count","onboarding_guides_opened_count","onboarding_add_domain","onboarding_watch_intro_video"]},"is_suggested":{"type":"boolean"},"keyword":{"type":"string","nullable":true},"kwHash":{"type":"string","nullable":true},"progress_ratio":{"type":"number"},"roi":{"type":"number"},"roi_recent":{"type":"number"},"current":{"type":"number"},"target":{"type":"number"},"target_currency":{"type":"string"},"target_diff":{"type":"number"},"hostname":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"onsite_page_id":{"oneOf":[{"type":"string"},{"type":"number"}],"nullable":true,"description":"Onsite page id from mission parameters (string or numeric depending on storage)."}},"required":["id","is_disabled","xp","xp_claimed_at","category","translated_category","completed_at","archived_at","checking_status","created_at","description","difficulty","roi_currency","roi_slug","type","is_suggested","keyword","kwHash","progress_ratio","roi","roi_recent","current","target","target_currency","target_diff","hostname","page","onsite_page_id"],"additionalProperties":true,"description":"Created mission; includes `MissionResource` fields plus any extra model attributes."},"message":{"type":"string","nullable":true},"_request_uuid":{"type":"string"}},"required":["missions","mission"],"description":"Response from Laravel `api.app.missions.missions.create`."}}}},"201":{"description":"201","content":{"application/json":{"schema":{"type":"object","properties":{"missions":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}},"description":"Domain missions relation after create (raw model attributes)."},"mission":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":0},"is_disabled":{"type":"boolean"},"xp":{"type":"number","nullable":true},"xp_claimed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"category":{"type":"string","enum":["keywords","links","onsite","onboarding","unknown"],"description":"High-level mission category derived from mission type."},"translated_category":{"type":"string"},"completed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"archived_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"checking_status":{"type":"boolean"},"created_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization."},"description":{"type":"string"},"difficulty":{"type":"number"},"roi_currency":{"type":"number","description":"Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code)."},"roi_slug":{"type":"string","enum":["epic","amazing","great","good","fine","small_fix"],"description":"ROI tier label derived from `increase_ratio`."},"type":{"type":"string","description":"Mission type slug.","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks","onboarding_verify_account","onboarding_keywords_count","onboarding_competitors_count","onboarding_keyword_research_count","onboarding_added_missions_count","onboarding_scan_website_count","onboarding_prompts_count","onboarding_geo_score","onboarding_article_count","onboarding_tooltips_clicked_count","onboarding_guides_opened_count","onboarding_add_domain","onboarding_watch_intro_video"]},"is_suggested":{"type":"boolean"},"keyword":{"type":"string","nullable":true},"kwHash":{"type":"string","nullable":true},"progress_ratio":{"type":"number"},"roi":{"type":"number"},"roi_recent":{"type":"number"},"current":{"type":"number"},"target":{"type":"number"},"target_currency":{"type":"string"},"target_diff":{"type":"number"},"hostname":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"onsite_page_id":{"oneOf":[{"type":"string"},{"type":"number"}],"nullable":true,"description":"Onsite page id from mission parameters (string or numeric depending on storage)."}},"required":["id","is_disabled","xp","xp_claimed_at","category","translated_category","completed_at","archived_at","checking_status","created_at","description","difficulty","roi_currency","roi_slug","type","is_suggested","keyword","kwHash","progress_ratio","roi","roi_recent","current","target","target_currency","target_diff","hostname","page","onsite_page_id"],"additionalProperties":true,"description":"Created mission; includes `MissionResource` fields plus any extra model attributes."},"message":{"type":"string","nullable":true},"_request_uuid":{"type":"string"}},"required":["missions","mission"],"description":"Response from Laravel `api.app.missions.missions.create`."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/{domainId}/missions/{missionId}/archive":{"post":{"description":"Archives a mission (`archived_at` set). Returns the mission as `MissionResource`.","summary":"Archive mission","tags":["missions"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"missionId","in":"path","required":true,"schema":{"type":"integer","minimum":0,"exclusiveMinimum":0,"example":42},"description":"Numeric mission id."}],"operationId":"missions.archiveMission","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":0},"is_disabled":{"type":"boolean"},"xp":{"type":"number","nullable":true},"xp_claimed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"category":{"type":"string","enum":["keywords","links","onsite","onboarding","unknown"],"description":"High-level mission category derived from mission type."},"translated_category":{"type":"string"},"completed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"archived_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"checking_status":{"type":"boolean"},"created_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization."},"description":{"type":"string"},"difficulty":{"type":"number"},"roi_currency":{"type":"number","description":"Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code)."},"roi_slug":{"type":"string","enum":["epic","amazing","great","good","fine","small_fix"],"description":"ROI tier label derived from `increase_ratio`."},"type":{"type":"string","description":"Mission type slug.","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks","onboarding_verify_account","onboarding_keywords_count","onboarding_competitors_count","onboarding_keyword_research_count","onboarding_added_missions_count","onboarding_scan_website_count","onboarding_prompts_count","onboarding_geo_score","onboarding_article_count","onboarding_tooltips_clicked_count","onboarding_guides_opened_count","onboarding_add_domain","onboarding_watch_intro_video"]},"is_suggested":{"type":"boolean"},"keyword":{"type":"string","nullable":true},"kwHash":{"type":"string","nullable":true},"progress_ratio":{"type":"number"},"roi":{"type":"number"},"roi_recent":{"type":"number"},"current":{"type":"number"},"target":{"type":"number"},"target_currency":{"type":"string"},"target_diff":{"type":"number"},"hostname":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"onsite_page_id":{"oneOf":[{"type":"string"},{"type":"number"}],"nullable":true,"description":"Onsite page id from mission parameters (string or numeric depending on storage)."}},"required":["id","is_disabled","xp","xp_claimed_at","category","translated_category","completed_at","archived_at","checking_status","created_at","description","difficulty","roi_currency","roi_slug","type","is_suggested","keyword","kwHash","progress_ratio","roi","roi_recent","current","target","target_currency","target_diff","hostname","page","onsite_page_id"],"description":"Mission row as returned by Laravel `MissionResource` on list and mutation endpoints."},"meta":{"type":"object","additionalProperties":{"nullable":true}},"message":{"type":"string","nullable":true},"_request_uuid":{"type":"string"}},"required":["model"],"description":"Single mission payload after archive or unarchive."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/{domainId}/missions/{missionId}/unarchive":{"post":{"description":"Clears `archived_at` on a mission. Returns the mission as `MissionResource`.","summary":"Unarchive mission","tags":["missions"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"missionId","in":"path","required":true,"schema":{"type":"integer","minimum":0,"exclusiveMinimum":0,"example":42},"description":"Numeric mission id."}],"operationId":"missions.unarchiveMission","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":0},"is_disabled":{"type":"boolean"},"xp":{"type":"number","nullable":true},"xp_claimed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"category":{"type":"string","enum":["keywords","links","onsite","onboarding","unknown"],"description":"High-level mission category derived from mission type."},"translated_category":{"type":"string"},"completed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"archived_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"checking_status":{"type":"boolean"},"created_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization."},"description":{"type":"string"},"difficulty":{"type":"number"},"roi_currency":{"type":"number","description":"Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code)."},"roi_slug":{"type":"string","enum":["epic","amazing","great","good","fine","small_fix"],"description":"ROI tier label derived from `increase_ratio`."},"type":{"type":"string","description":"Mission type slug.","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks","onboarding_verify_account","onboarding_keywords_count","onboarding_competitors_count","onboarding_keyword_research_count","onboarding_added_missions_count","onboarding_scan_website_count","onboarding_prompts_count","onboarding_geo_score","onboarding_article_count","onboarding_tooltips_clicked_count","onboarding_guides_opened_count","onboarding_add_domain","onboarding_watch_intro_video"]},"is_suggested":{"type":"boolean"},"keyword":{"type":"string","nullable":true},"kwHash":{"type":"string","nullable":true},"progress_ratio":{"type":"number"},"roi":{"type":"number"},"roi_recent":{"type":"number"},"current":{"type":"number"},"target":{"type":"number"},"target_currency":{"type":"string"},"target_diff":{"type":"number"},"hostname":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"onsite_page_id":{"oneOf":[{"type":"string"},{"type":"number"}],"nullable":true,"description":"Onsite page id from mission parameters (string or numeric depending on storage)."}},"required":["id","is_disabled","xp","xp_claimed_at","category","translated_category","completed_at","archived_at","checking_status","created_at","description","difficulty","roi_currency","roi_slug","type","is_suggested","keyword","kwHash","progress_ratio","roi","roi_recent","current","target","target_currency","target_diff","hostname","page","onsite_page_id"],"description":"Mission row as returned by Laravel `MissionResource` on list and mutation endpoints."},"meta":{"type":"object","additionalProperties":{"nullable":true}},"message":{"type":"string","nullable":true},"_request_uuid":{"type":"string"}},"required":["model"],"description":"Single mission payload after archive or unarchive."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/{domainId}/missions/{missionId}":{"delete":{"description":"Permanently deletes a mission and its parameters, progress, and notes.","summary":"Delete mission","tags":["missions"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"missionId","in":"path","required":true,"schema":{"type":"integer","minimum":0,"exclusiveMinimum":0,"example":42},"description":"Numeric mission id."}],"operationId":"missions.deleteMission","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":0},"is_disabled":{"type":"boolean"},"xp":{"type":"number","nullable":true},"xp_claimed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"category":{"type":"string","enum":["keywords","links","onsite","onboarding","unknown"],"description":"High-level mission category derived from mission type."},"translated_category":{"type":"string"},"completed_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"archived_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization.","nullable":true},"checking_status":{"type":"boolean"},"created_at":{"type":"string","description":"ISO 8601 datetime string from Laravel serialization."},"description":{"type":"string"},"difficulty":{"type":"number"},"roi_currency":{"type":"number","description":"Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code)."},"roi_slug":{"type":"string","enum":["epic","amazing","great","good","fine","small_fix"],"description":"ROI tier label derived from `increase_ratio`."},"type":{"type":"string","description":"Mission type slug.","enum":["keywords_target_position","keywords_morningscore","keywords_gsc","links_count","links_count_rating","links_specific","links_rank","onsite_page_tasks","onboarding_verify_account","onboarding_keywords_count","onboarding_competitors_count","onboarding_keyword_research_count","onboarding_added_missions_count","onboarding_scan_website_count","onboarding_prompts_count","onboarding_geo_score","onboarding_article_count","onboarding_tooltips_clicked_count","onboarding_guides_opened_count","onboarding_add_domain","onboarding_watch_intro_video"]},"is_suggested":{"type":"boolean"},"keyword":{"type":"string","nullable":true},"kwHash":{"type":"string","nullable":true},"progress_ratio":{"type":"number"},"roi":{"type":"number"},"roi_recent":{"type":"number"},"current":{"type":"number"},"target":{"type":"number"},"target_currency":{"type":"string"},"target_diff":{"type":"number"},"hostname":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"onsite_page_id":{"oneOf":[{"type":"string"},{"type":"number"}],"nullable":true,"description":"Onsite page id from mission parameters (string or numeric depending on storage)."}},"required":["id","is_disabled","xp","xp_claimed_at","category","translated_category","completed_at","archived_at","checking_status","created_at","description","difficulty","roi_currency","roi_slug","type","is_suggested","keyword","kwHash","progress_ratio","roi","roi_recent","current","target","target_currency","target_diff","hostname","page","onsite_page_id"],"additionalProperties":true},"message":{"type":"string","nullable":true},"_request_uuid":{"type":"string"}},"additionalProperties":true,"description":"Response from Laravel `api.app.missions.missions.delete` (deleted model when present)."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":900}},"/v1/{domain_id}/overall":{"get":{"description":"Retrieves a overview of the domain's SEO health status including overall scores, historical data, and categorized breakdowns of health issues across categories.","summary":"Get onsite overall summary","tags":["health"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"health.getOnsiteOverall","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"prev_score":{"type":"number"},"score":{"type":"number"},"crawl_status":{"type":"string"},"crawled_at":{"type":"string","nullable":true},"pages_count":{"type":"number"},"historical_scores":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"score":{"type":"number"}},"required":["date","score"]}},"categories":{"type":"object","properties":{"basic":{"type":"object","properties":{"score":{"type":"number"},"unresolved_tasks":{"type":"number"},"total_unresolved_issues":{"type":"number"},"total_resolved_issues":{"type":"number"},"problems":{"type":"array","items":{"type":"object","properties":{"validator":{"type":"string"},"category":{"type":"string"},"max_impact":{"type":"number"},"site_wide":{"type":"boolean"},"tasks_num":{"type":"number"},"tasks_resolved":{"type":"number"},"issues_num":{"type":"number"},"impact":{"type":"number"},"crawl_status":{"type":"string"},"disabled":{"type":"boolean"},"resolved":{"type":"boolean"},"is_rank_active":{"type":"boolean"}},"required":["validator","category","max_impact","site_wide","tasks_num","tasks_resolved","issues_num","impact","crawl_status","disabled","resolved"]}},"resolved_tasks":{"type":"number","nullable":true},"total_tasks":{"type":"number","nullable":true}},"required":["score","unresolved_tasks","total_unresolved_issues","total_resolved_issues","problems"]},"technical":{"type":"object","properties":{"score":{"type":"number"},"unresolved_tasks":{"type":"number"},"total_unresolved_issues":{"type":"number"},"total_resolved_issues":{"type":"number"},"problems":{"type":"array","items":{"type":"object","properties":{"validator":{"type":"string"},"category":{"type":"string"},"max_impact":{"type":"number"},"site_wide":{"type":"boolean"},"tasks_num":{"type":"number"},"tasks_resolved":{"type":"number"},"issues_num":{"type":"number"},"impact":{"type":"number"},"crawl_status":{"type":"string"},"disabled":{"type":"boolean"},"resolved":{"type":"boolean"},"is_rank_active":{"type":"boolean"}},"required":["validator","category","max_impact","site_wide","tasks_num","tasks_resolved","issues_num","impact","crawl_status","disabled","resolved"]}},"resolved_tasks":{"type":"number","nullable":true},"total_tasks":{"type":"number","nullable":true}},"required":["score","unresolved_tasks","total_unresolved_issues","total_resolved_issues","problems"]},"optimization":{"type":"object","properties":{"score":{"type":"number"},"unresolved_tasks":{"type":"number"},"total_unresolved_issues":{"type":"number"},"total_resolved_issues":{"type":"number"},"problems":{"type":"array","items":{"type":"object","properties":{"validator":{"type":"string"},"category":{"type":"string"},"max_impact":{"type":"number"},"site_wide":{"type":"boolean"},"tasks_num":{"type":"number"},"tasks_resolved":{"type":"number"},"issues_num":{"type":"number"},"impact":{"type":"number"},"crawl_status":{"type":"string"},"disabled":{"type":"boolean"},"resolved":{"type":"boolean"},"is_rank_active":{"type":"boolean"}},"required":["validator","category","max_impact","site_wide","tasks_num","tasks_resolved","issues_num","impact","crawl_status","disabled","resolved"]}},"resolved_tasks":{"type":"number","nullable":true},"total_tasks":{"type":"number","nullable":true}},"required":["score","unresolved_tasks","total_unresolved_issues","total_resolved_issues","problems"]}},"required":["basic","technical","optimization"]},"await_partial_health_data":{"type":"object","properties":{"status":{"type":"string"},"reason":{"type":"string","nullable":true},"page_count":{"type":"number","nullable":true},"crawl_id":{"type":"string","nullable":true},"crawl_state":{"type":"string","nullable":true},"has_score":{"type":"boolean","nullable":true}},"required":["status"],"nullable":true,"description":"Latest domain-activation wait for a usable onsite health score. Null when no activation has this task. Completes when an OnsiteScore exists for the domain and the crawl is validated, aborted, or past 50 pages."}},"required":["prev_score","score","crawl_status","pages_count","historical_scores","categories"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/issues":{"get":{"description":"Retrieves all SEO issues for a specific domain, optionally filtered by issue type. This endpoint provides a consolidated view of all individual SEO problems detected across the site, regardless of which task they belong to. For large websites, filtering by issue type is recommended to optimize performance and prevent timeouts.\n\n**Note:** This endpoint is cached. See the `cache_expires_at` field for the expiration date.\n","summary":"List issues","tags":["health"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"filter.issue_type","in":"query","description":"Filter results to only show issues of a specific type (e.g. broken links, missing meta descriptions).","required":true,"content":{"application/json":{"schema":{"type":"string","enum":["duplicate_title_h1_tag","broken_images","broken_links_external","broken_links_internal","large_images","long_meta_description","long_title_tag","long_url","low_word_count","many_h1_tags","long_h1_h2_tag","missing_alt_tags","missing_h1_tag","missing_keywords_htags","missing_keyword_title","missing_meta_description","missing_title_tag","no_links_external","no_links_internal","seo_friendly_url","short_meta_description","short_title_tag","duplicate_pages","h_tags_in_footer","missing_404_page","missing_favicon","missing_sitemap","missing_ssl","redirect_https","missing_h2_h3_tag","page_load_speed","page_score","insecure_internal_links","h1_not_first_header","images_without_dimensions","html_size_above_threshold","duplicate_title","duplicate_meta_description","redirecting_internal_links"],"example":"duplicate_title_h1_tag"}}}},{"name":"filter.resolved","in":"query","description":"When true, shows only resolved issues. When false, shows only unresolved issues. When omitted, shows all issues","content":{"application/json":{"schema":{"type":"boolean","nullable":true}}}},{"name":"filter.ignored","in":"query","description":"When true, shows only ignored issues. When false, shows only non-ignored issues. When omitted, shows all issues","content":{"application/json":{"schema":{"type":"boolean","nullable":true}}}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"soft_limit","in":"query","description":"The soft-limit of issues. Please keep this at a reasonable value (e.g. 5000). Increasing this, will cause all non-cached requests to be slower.","content":{"application/json":{"schema":{"default":5000,"type":"number","minimum":1000,"maximum":50000}}}}],"operationId":"health.getTaskIssues","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"rank_id":{"type":"string","nullable":true},"page_id":{"type":"string"},"issue_id":{"type":"string"},"validator":{"type":"string"},"category":{"type":"string"},"resolved":{"type":"boolean"},"taskHash":{"type":"string","nullable":true},"task_hash":{"type":"string","nullable":true},"ignored":{"type":"boolean","nullable":true},"parameters":{"nullable":true},"issue_identifier":{"type":"string","nullable":true},"page":{"type":"object","properties":{"path":{"type":"string"},"path_full":{"type":"string"},"last_crawled":{"type":"string","nullable":true}},"required":["path","path_full"]},"rank_config":{"type":"object","properties":{"is_active":{"type":"boolean"},"is_table":{"type":"boolean"},"copy_button":{"type":"boolean"},"download_button":{"type":"boolean"},"markdown_expired":{"type":"boolean"}},"required":["is_active","is_table","copy_button","download_button","markdown_expired"],"nullable":true},"rank":{"type":"object","properties":{"_id":{"type":"string"},"jetforce_task":{"type":"string"},"global_company_identifier":{"type":"string"},"global_domain_identifier":{"type":"string"},"status":{"type":"string"},"progress":{"type":"string"},"contentStatus":{"type":"string"},"content_status":{"type":"string","nullable":true},"content":{"nullable":true},"taskHash":{"type":"string"},"task_hash":{"type":"string","nullable":true},"issue_identifier":{"type":"string"},"issueIdentifierHash":{"type":"string"},"issue_identifier_hash":{"type":"string","nullable":true},"createdAt":{"type":"string"},"created_at":{"type":"string","nullable":true},"updatedAt":{"type":"string"},"updated_at":{"type":"string","nullable":true},"__v":{"type":"number"}},"required":["_id","jetforce_task","global_company_identifier","global_domain_identifier","status","progress","contentStatus","taskHash","issue_identifier","issueIdentifierHash","createdAt","updatedAt","__v"],"nullable":true}},"required":["page_id","issue_id","validator","category","resolved","page"]}},"cache_expires_at":{"type":"string","description":"The date and time when the cache will expire","example":"2026-08-24T08:48:32.803Z"},"cache_hit":{"type":"boolean","description":"Indicates if the current data returned was part of a cache","example":true}},"required":["total","page","per_page","data","cache_expires_at","cache_hit"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/pages":{"get":{"description":"Retrieves all indexed pages for a specific domain. This endpoint allows for filtering by page ID and provides the foundation for page-specific SEO analysis. Pages are the base unit where SEO issues occur and are essential for organizing and addressing tasks and their associated issues.","summary":"List pages","tags":["health"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"filter.page_id","in":"query","content":{"application/json":{"schema":{"type":"string","nullable":true}}}}],"operationId":"health.getPages","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"/inbound-outbound-links/","description":"The relative URL path of the page, starting with a forward slash. This is the part of the URL after the domain name.","nullable":true},"path_full":{"type":"string","example":"https://morningscore.io/inbound-outbound-links/","description":"The complete URL of the page including protocol (http/https), domain name, and path. This represents the full address where the page can be accessed.","nullable":true},"canonical":{"type":"string","nullable":true},"canonical_path":{"type":"string","nullable":true},"latest_crawl":{"type":"string","pattern":"^[0-9a-fA-F]{24}$","description":"A valid mongodb ObjectId","example":"67f9127721cbed7145e4a5d9","nullable":true},"latest_crawl_meta":{"type":"object","additionalProperties":{"nullable":true},"nullable":true},"latest_crawl_result":{"type":"string","pattern":"^[0-9a-fA-F]{24}$","description":"A valid mongodb ObjectId","example":"67f9127721cbed7145e4a5d9","nullable":true},"last_crawled":{"type":"string","nullable":true},"crawl_state":{"type":"string","enum":["created","crawled","validated","aborted"],"nullable":true},"issues_unresolved":{"type":"number","nullable":true},"issues_resolved":{"type":"number","nullable":true},"issues_num":{"type":"number","nullable":true},"tasks_count":{"type":"number","nullable":true},"tasks_unresolved":{"type":"number","nullable":true},"tasks_unresolved_impact":{"type":"number","nullable":true},"tasks_resolved":{"type":"number","nullable":true}}}},"cache_expires_at":{"type":"string","description":"The date and time when the cache will expire","example":"2026-08-24T08:48:32.804Z"},"cache_hit":{"type":"boolean","description":"Indicates if the current data returned was part of a cache","example":true}},"required":["total","page","per_page","data","cache_expires_at","cache_hit"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/ai-fix":{"post":{"description":"Returns an AI-generated fix suggestion for a specific SEO issue. This endpoint provides recommendations on how to resolve individual SEO problems but does not apply the changes.","summary":"Get AI fix","tags":["health"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"health.getAiFix","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"rank_id":{"type":"string","example":"eyJwYXlsb2FkIjoie1wicGFnZV9pZFwiOlwiNjc0ODYxYzFiMmMwZjlhZWI4ODYwYzA2XCIsXCJ0YXNrX2lkXCI6XCI2NzQ4NjFjMmIyYzBmOWFlYjg4NjExZDBcIixcImlzc3VlX2lkZW50aWZpZXJcIjpcIm1hbnlfaDFfdGFnc1wiLFwidmFsaWRhdG9yXCI6XCJtYW55X2gxX3RhZ3NcIn0iLCJzaWduYXR1cmUiOiJmYmUyZTEwNjhjYmIxOTNiMjFlMzU2YWNjMzk5MWVlODAyODRjYTMwZTFiOTlmN2RjYWE5MmE0NzEwZDE2MDY5In0="},"fresh_data":{"type":"boolean","nullable":true}},"required":["rank_id"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string"}},"required":["task_id"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"402","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/ai-fix-status/{task_id}":{"get":{"description":"Returns the status of the AI fix for a specific task. This endpoint provides information on the progress of the AI fix and the data that has been generated.","summary":"Get AI fix status","tags":["health"],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"health.getAiFixStatus","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["in_progress","completed","failed"]},"reason":{"type":"string","enum":["image_not_found"],"description":"Machine-readable failure reason when status is failed. image_not_found means the source image URL could not be fetched."},"data":{"type":"object","properties":{"content":{"nullable":true},"parameters":{"nullable":true},"progress":{"type":"string"},"task_id":{"type":"string"},"identifier":{"type":"string"}},"required":["progress","task_id","identifier"]}},"required":["status"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/health/crawler-ips":{"get":{"description":"Returns a list of IP addresses used by our crawlers. No API key is required.","summary":"Get list of crawler IPs","tags":["health"],"parameters":[{"name":"format","in":"query","description":"The format of the response (json or txt)","content":{"application/json":{"schema":{"default":"json","type":"string","enum":["json","txt"]}}}}],"operationId":"health.getCrawlerIps","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"type":"string"},"example":["1.2.3.4","5.6.7.8"],"description":"List of IP addresses as JSON array"},{"type":"string","example":"1.2.3.4\n5.6.7.8","description":"List of IP addresses as newline separated string"}]}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"security":[],"x-order":100}},"/v1/credits/status":{"get":{"description":"Retrieves the current status, usage, and limits for a specific credit type. Credit types include monthly scan limits, AI credits, tracked keywords, and other feature-specific quotas. This endpoint helps monitor resource consumption and plan capacity.","summary":"Get credits status and usage","tags":["other"],"parameters":[{"name":"credit_type","in":"query","description":"The type of credit to check status for (e.g. monthly scans, AI credits)","required":true,"content":{"application/json":{"schema":{"type":"string","enum":["credits.health.monthly_full_scans","credits.health.pages_per_scan","credits.health.monthly_single_scans","credits.links.monthly_lookups","credits.links.monthly_scans","credits.missions.limit_per_domain","credits.reports.limit_per_month","credits.scan_website.limit_per_month","credits.keywords.research_limit_per_month","credits.ai.monthly_ai_credits","credits.ai.tracked_prompts","credits.keywords.tracked_limit","credits.users.limit"],"example":"credits.ai.monthly_ai_credits"}}}}],"operationId":"other.getStatus","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"credit_type":{"type":"string","enum":["credits.health.monthly_full_scans","credits.health.pages_per_scan","credits.health.monthly_single_scans","credits.links.monthly_lookups","credits.links.monthly_scans","credits.missions.limit_per_domain","credits.reports.limit_per_month","credits.scan_website.limit_per_month","credits.keywords.research_limit_per_month","credits.ai.monthly_ai_credits","credits.ai.tracked_prompts","credits.keywords.tracked_limit","credits.users.limit"],"example":"credits.ai.monthly_ai_credits","description":"The type of credit to check status for (e.g. monthly scans, AI credits)"},"limit":{"type":"number"},"usage":{"type":"number"}},"required":["credit_type","limit","usage"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domainId}/backlinks":{"get":{"description":"Get backlinks pointing to this domain. Backlinks are links from other websites that point to your domain, indicating trust and authority. A higher number of quality backlinks generally correlates with better search engine rankings.","summary":"Get backlinks","tags":["links"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"kind","in":"query","content":{"application/json":{"schema":{"default":"all","type":"string","enum":["all","new","lost"]}}}}],"operationId":"links.getLinks","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"link":{"type":"string"},"strength":{"type":"number","nullable":true},"date":{"type":"string","nullable":true}},"required":["link"],"example":{"link":"https://youtube.com","strength":45,"date":"2025-02-28T00:00:00.000Z"}}}},"required":["total","page","per_page","data"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domainId}/keywords-v2":{"get":{"description":"Returns a paginated list of discovered ranking keywords for a domain, including search volume, CPC, estimated traffic, positions, geotargets, Google Search Console context, and data-status metadata. Use sort.by and sort.direction to order results.","summary":"List keywords","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":1000}}}},{"name":"sort.by","in":"query","description":"Keyword field used for sorting the result list.","content":{"application/json":{"schema":{"type":"string","enum":["est_traffic","traffic_value","sv","cpc","position","geotarget","your_position","kw"],"example":"est_traffic"}}}},{"name":"sort.direction","in":"query","description":"Sort direction for the selected sort.by field.","content":{"application/json":{"schema":{"default":"desc","type":"string","enum":["asc","desc"],"example":"desc"}}}}],"operationId":"keywords.getKeywords","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"kw":{"type":"string"},"kwHash":{"type":"string","nullable":true},"gl":{"type":"string"},"hl":{"type":"string"},"position":{"type":"number","nullable":true},"position_at":{"type":"string","nullable":true},"timestamp":{"type":"string","nullable":true},"prev_position":{"type":"number","nullable":true},"prev_position_at":{"type":"string","nullable":true},"first_seen_at":{"type":"string","nullable":true},"sv":{"type":"number","nullable":true},"cpc":{"type":"number","nullable":true},"est_traffic":{"type":"number","nullable":true},"prev_est_traffic":{"type":"number","nullable":true},"traffic_value":{"type":"number","nullable":true},"prev_traffic_value":{"type":"number","nullable":true},"traffic_value_usd":{"type":"number","nullable":true},"prev_traffic_value_usd":{"type":"number","nullable":true},"position_change":{"type":"number","nullable":true},"traffic_value_change":{"type":"number","nullable":true},"est_traffic_change":{"type":"number","nullable":true},"changeType":{"type":"string","nullable":true},"landing_page":{"type":"string","nullable":true},"raw_landing_page":{"type":"string","nullable":true},"full_landing_page":{"type":"string","nullable":true},"relative_landing_page":{"type":"string","nullable":true},"your_position":{"type":"number","nullable":true},"your_prev_position":{"type":"number","nullable":true},"your_position_change":{"type":"number","nullable":true},"yourChangeType":{"type":"string","nullable":true},"your_landing_page":{"type":"string","nullable":true},"your_raw_landing_page":{"type":"string","nullable":true},"your_full_landing_page":{"type":"string","nullable":true},"geotarget_id":{"type":"string","nullable":true},"geotarget":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"canonical_name":{"type":"string","nullable":true},"parent_id":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true},"target_type":{"type":"string","nullable":true}},"required":["id"],"nullable":true},"gscStatus":{"type":"string","nullable":true},"syncedAt":{"oneOf":[{"type":"string","nullable":true},{"type":"string","format":"date-time"}],"nullable":true},"scanning":{"type":"boolean","nullable":true},"scan_type":{"type":"string","nullable":true},"scan_types":{"type":"array","items":{"type":"string"},"nullable":true},"is_tracked":{"type":"boolean","nullable":true},"is_favorite":{"type":"boolean","nullable":true},"folder_name":{"type":"string","nullable":true},"has_mission":{"type":"boolean","nullable":true},"ai_overview":{"type":"object","properties":{"_id":{"type":"string","nullable":true},"id":{"type":"string","nullable":true},"brand_found":{"type":"boolean","nullable":true},"brand_found_in_sources":{"type":"boolean","nullable":true},"brand_found_in_text_blocks":{"type":"boolean","nullable":true},"brands_in_text_blocks":{"type":"array","items":{"type":"string"},"nullable":true},"brands_in_sources":{"type":"array","items":{"type":"string"},"nullable":true}},"nullable":true},"google_serp_url":{"type":"string","nullable":true},"cpc_usd":{"type":"number","nullable":true},"traffic_value_change_usd":{"type":"number","nullable":true}},"required":["kw","gl","hl","position","position_at","timestamp","prev_position","prev_position_at","first_seen_at","sv","cpc","landing_page","raw_landing_page","full_landing_page","geotarget_id","folder_name"]}},"has_data":{"type":"boolean"},"geotargets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"canonical_name":{"type":"string","nullable":true},"parent_id":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true},"target_type":{"type":"string","nullable":true}},"required":["id"]}},"last_keyword_import":{"type":"string","nullable":true},"initial_scan_completed":{"type":"boolean"},"gsc_info":{"type":"object","properties":{"ranking_keywords_count":{"type":"number","nullable":true}}},"is_filtering":{"type":"boolean"},"data_status":{"nullable":true},"grouped_by":{"type":"string"},"total_keywords_before_filters":{"type":"number"},"total_before_filters":{"type":"number"},"total_before_pagination":{"type":"number"}},"required":["total","page","per_page","data","has_data","geotargets","initial_scan_completed","gsc_info","is_filtering"],"description":"Paginated keyword list with ranking metrics and domain metadata."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domainId}/tracked-keywords":{"get":{"description":"Returns a paginated list of keywords actively monitored for the domain, including ranking metrics, geotargets, filtering metadata, and Google Search Console context. Use sort.by and sort.direction to order results.","summary":"List tracked keywords","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":1000}}}},{"name":"sort.by","in":"query","description":"Keyword field used for sorting the result list.","content":{"application/json":{"schema":{"type":"string","enum":["est_traffic","traffic_value","sv","cpc","position","geotarget","your_position","kw"],"example":"est_traffic"}}}},{"name":"sort.direction","in":"query","description":"Sort direction for the selected sort.by field.","content":{"application/json":{"schema":{"default":"desc","type":"string","enum":["asc","desc"],"example":"desc"}}}}],"operationId":"keywords.getTrackedKeywords","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"kw":{"type":"string"},"kwHash":{"type":"string","nullable":true},"gl":{"type":"string"},"hl":{"type":"string"},"position":{"type":"number","nullable":true},"position_at":{"type":"string","nullable":true},"timestamp":{"type":"string","nullable":true},"prev_position":{"type":"number","nullable":true},"prev_position_at":{"type":"string","nullable":true},"first_seen_at":{"type":"string","nullable":true},"sv":{"type":"number","nullable":true},"cpc":{"type":"number","nullable":true},"est_traffic":{"type":"number","nullable":true},"prev_est_traffic":{"type":"number","nullable":true},"traffic_value":{"type":"number","nullable":true},"prev_traffic_value":{"type":"number","nullable":true},"traffic_value_usd":{"type":"number","nullable":true},"prev_traffic_value_usd":{"type":"number","nullable":true},"position_change":{"type":"number","nullable":true},"traffic_value_change":{"type":"number","nullable":true},"est_traffic_change":{"type":"number","nullable":true},"changeType":{"type":"string","nullable":true},"landing_page":{"type":"string","nullable":true},"raw_landing_page":{"type":"string","nullable":true},"full_landing_page":{"type":"string","nullable":true},"relative_landing_page":{"type":"string","nullable":true},"your_position":{"type":"number","nullable":true},"your_prev_position":{"type":"number","nullable":true},"your_position_change":{"type":"number","nullable":true},"yourChangeType":{"type":"string","nullable":true},"your_landing_page":{"type":"string","nullable":true},"your_raw_landing_page":{"type":"string","nullable":true},"your_full_landing_page":{"type":"string","nullable":true},"geotarget_id":{"type":"string","nullable":true},"geotarget":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"canonical_name":{"type":"string","nullable":true},"parent_id":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true},"target_type":{"type":"string","nullable":true}},"required":["id"],"nullable":true},"gscStatus":{"type":"string","nullable":true},"syncedAt":{"oneOf":[{"type":"string","nullable":true},{"type":"string","format":"date-time"}],"nullable":true},"scanning":{"type":"boolean","nullable":true},"scan_type":{"type":"string","nullable":true},"scan_types":{"type":"array","items":{"type":"string"},"nullable":true},"is_tracked":{"type":"boolean","nullable":true},"is_favorite":{"type":"boolean","nullable":true},"folder_name":{"type":"string","nullable":true},"has_mission":{"type":"boolean","nullable":true},"ai_overview":{"type":"object","properties":{"_id":{"type":"string","nullable":true},"id":{"type":"string","nullable":true},"brand_found":{"type":"boolean","nullable":true},"brand_found_in_sources":{"type":"boolean","nullable":true},"brand_found_in_text_blocks":{"type":"boolean","nullable":true},"brands_in_text_blocks":{"type":"array","items":{"type":"string"},"nullable":true},"brands_in_sources":{"type":"array","items":{"type":"string"},"nullable":true}},"nullable":true},"google_serp_url":{"type":"string","nullable":true},"cpc_usd":{"type":"number","nullable":true},"traffic_value_change_usd":{"type":"number","nullable":true}},"required":["kw","gl","hl","position","position_at","timestamp","prev_position","prev_position_at","first_seen_at","sv","cpc","landing_page","raw_landing_page","full_landing_page","geotarget_id","folder_name"]}},"has_data":{"type":"boolean"},"geotargets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"canonical_name":{"type":"string","nullable":true},"parent_id":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true},"target_type":{"type":"string","nullable":true}},"required":["id"]}},"last_keyword_import":{"type":"string","nullable":true},"initial_scan_completed":{"type":"boolean"},"gsc_info":{"type":"object","properties":{"ranking_keywords_count":{"type":"number","nullable":true}}},"is_filtering":{"type":"boolean"},"data_status":{"nullable":true},"grouped_by":{"type":"string"},"total_keywords_before_filters":{"type":"number"},"total_before_filters":{"type":"number"},"total_before_pagination":{"type":"number"}},"required":["total","page","per_page","data","has_data","geotargets","initial_scan_completed","gsc_info","is_filtering"],"description":"Paginated keyword list with ranking metrics and domain metadata."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100},"post":{"description":"Adds one or more keywords to rank tracking for the domain. Subject to the account tracked-keyword limit (credits.keywords.tracked_limit).","summary":"Add tracked keywords","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"keywords.addTrackedKeywords","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"kws":{"type":"array","items":{"type":"string","minLength":1,"maxLength":191},"minItems":1,"description":"Keyword phrases to start tracking for the domain.","example":["seo tools","keyword research"]},"folder_name":{"type":"string","description":"Optional folder name to place the keywords in."}},"required":["kws"],"description":"Add one or more keywords to rank tracking for the domain."}}}},"responses":{"201":{"description":"201","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"tracked_kws":{"type":"array","items":{"type":"string"}},"in_lookup_kws":{"type":"array","items":{"type":"string"}}},"required":["message","tracked_kws","in_lookup_kws"],"description":"Confirmation after keywords were queued for tracking."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"402","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800},"delete":{"description":"Stops tracking the given keywords by kwHash. Obtain kwHash values from GET /tracked-keywords.","summary":"Remove tracked keywords","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"keywords.removeTrackedKeywords","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"kw_hashes":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":100,"description":"kwHash values from GET /tracked-keywords list items."}},"required":["kw_hashes"],"description":"Remove tracked keywords by their kwHash identifiers."}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"removed_kw_hashes":{"type":"array","items":{"type":"string"}}},"required":["message","removed_kw_hashes"],"description":"Confirmation after tracked keywords were removed."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":900}},"/v1/{domainId}/keyword/{kw}":{"get":{"description":"Returns detailed metrics for a single keyword: search volume, CPC, latest Google position, landing page URL, page score, and the market locale used for the lookup.","summary":"Get keyword metrics","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"kw","in":"path","required":true,"schema":{"type":"string","minLength":1,"example":"seo tools"},"description":"The keyword text. URL-encode spaces and special characters when calling the HTTP API directly (e.g. `%20`)."}],"operationId":"keywords.getKeywordDetails","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"kw":{"type":"string"},"gl":{"type":"string"},"hl":{"type":"string"},"sv":{"type":"number","nullable":true},"cpc":{"type":"number","nullable":true},"landing_page":{"type":"string","nullable":true},"position":{"type":"number","nullable":true},"position_at":{"type":"string","nullable":true},"pagescore":{"type":"number","nullable":true}},"required":["kw","gl","hl","sv","cpc","landing_page","position","position_at","pagescore"],"description":"Detailed metrics for a single keyword."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domainId}/keyword-overlap":{"get":{"description":"Compares your domain against a competitor using the latest domain-market keyword builds. Supports gap, overlap, wins, and losses modes with optional search-volume and position filters.","summary":"Compare keyword overlap","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"competitor_domain","in":"query","required":true,"content":{"application/json":{"schema":{"type":"string","minLength":1}}}},{"name":"mode","in":"query","content":{"application/json":{"schema":{"default":"gap","type":"string","enum":["gap","overlap","wins","losses"]}}}},{"name":"min_sv","in":"query","content":{"application/json":{"schema":{"default":0,"type":"number","minimum":0,"nullable":true}}}},{"name":"max_position","in":"query","content":{"application/json":{"schema":{"default":100,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}}],"operationId":"keywords.getKeywordOverlap","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean"},"data_status":{"type":"string"},"domain":{"type":"string"},"competitor_domain":{"type":"string"},"hl":{"type":"string"},"gl":{"type":"string"},"mode":{"type":"string"},"page":{"type":"number"},"per_page":{"type":"number"},"total":{"type":"number"},"total_candidates":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"kw":{"type":"string"},"sv":{"type":"number","nullable":true},"cpc":{"type":"number","nullable":true},"your_position":{"type":"number","nullable":true},"your_score":{"type":"number","nullable":true},"your_traffic":{"type":"number","nullable":true},"your_landing_page":{"type":"string","nullable":true},"competitor_position":{"type":"number","nullable":true},"competitor_score":{"type":"number","nullable":true},"competitor_traffic":{"type":"number","nullable":true},"competitor_landing_page":{"type":"string","nullable":true},"position_delta":{"type":"number","nullable":true},"opportunity_score":{"type":"number"}},"required":["kw","sv","cpc","your_position","your_score","your_traffic","your_landing_page","competitor_position","competitor_score","competitor_traffic","competitor_landing_page","position_delta","opportunity_score"]}}},"required":["has_data","data_status","domain","competitor_domain","hl","gl","mode","page","per_page","total","total_candidates","data"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/keywords/research":{"get":{"description":"Returns keyword ideas for a seed term in the given market, including search volume, CPC, difficulty, and whether each suggestion is already tracked. Returns the initial suggestion set only (no background expansion). Subject to a monthly abuse limit of 100 requests per company (separate from plan research credits).","summary":"Research keywords","tags":["keywords"],"parameters":[{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of keyword suggestions to return per page.","content":{"application/json":{"schema":{"default":50,"type":"number","minimum":1,"maximum":200}}}},{"name":"kw","in":"query","description":"Seed keyword to expand into related suggestions.","required":true,"content":{"application/json":{"schema":{"type":"string","minLength":1,"example":"seo tools"}}}},{"name":"market","in":"query","description":"Search market as language_country (e.g. da_dk = Danish in Denmark, en_us = English in United States).","required":true,"content":{"application/json":{"schema":{"type":"string","enum":["ps_af","sq_al","ar_dz","kg_ao","en_ai","es_ar","hy_am","en_au","de_at","az_az","en_bs","ar_bh","bn_bd","be_by","nl_be","en_bz","fr_bj","es_bo","bs_ba","tn_bw","pt_br","zh_bn","bg_bg","fr_bf","fr_bi","km_kh","fr_cm","en_ca","pt_cv","fr_cf","ar_td","es_cl","zh_cn","es_co","en_ck","es_cr","fr_ci","hr_hr","es_cu","en_cy","cs_cz","sw_cd","da_dk","en_dm","es_do","es_ec","ar_eg","es_sv","et_ee","am_et","en_fj","fi_fi","fr_fr","fr_ga","en_gm","ka_ge","de_de","ak_gh","en_gi","el_gr","da_gl","fr_gp","es_gt","en_gg","en_gy","fr_ht","es_hn","zh_hk","hu_hu","is_is","bn_in","jw_id","ar_iq","en_ie","en_im","iw_il","it_it","en_jm","ja_jp","en_je","ar_jo","kk_kz","sw_ke","en_ki","ar_kw","ky_kg","lo_la","lv_lv","ar_lb","ar_ly","de_li","lt_lt","fr_lu","mk_mk","fr_mg","en_my","mt_mt","es_mx","mo_md","mn_mn","bs_me","en_ms","ar_ma","ny_mz","af_na","en_nr","ne_np","nl_nl","en_nz","es_ni","fr_ne","en_ng","en_nu","no_no","ar_om","ur_pk","ar_ps","es_pa","es_py","es_pe","tl_ph","pl_pl","pt_pt","es_pr","ar_qa","ro_ro","ru_ru","fr_rw","ar_sa","fr_sn","sr_rs","en_sc","en_sl","zh_sg","sk_sk","sl_si","en_sb","so_so","en_za","ko_kr","es_es","si_lk","sv_se","de_ch","zh_tw","tg_tj","sw_tz","th_th","en_tk","to_to","zh_tt","ar_tn","tr_tr","tk_tm","lg_ug","uk_ua","ar_ae","en_gb","en_us","es_uy","uz_uz","es_ve","vi_vn","en_vi","ny_zm","ny_zw","my_mm"],"example":"da_dk"}}}},{"name":"domainId","in":"query","content":{"application/json":{"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}}}],"operationId":"keywords.getKeywordResearch","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean"},"data_status":{"type":"string"},"seed_keyword":{"type":"string"},"hl":{"type":"string"},"gl":{"type":"string"},"partial":{"type":"boolean"},"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"kw":{"type":"string"},"sv":{"type":"number","nullable":true},"cpc":{"type":"number","nullable":true},"difficulty":{"type":"number","nullable":true},"max_score":{"type":"number","nullable":true},"is_tracked":{"type":"boolean","nullable":true}},"required":["kw","sv","cpc","difficulty","max_score","is_tracked"],"additionalProperties":true}}},"required":["has_data","data_status","seed_keyword","hl","gl","partial","total","page","per_page","data"],"additionalProperties":true}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/keywords/serp-overview":{"get":{"description":"Returns cached Google SERP rankings for a keyword in the given market, including organic result positions, titles, and URLs. Read-only: never schedules a fresh SERP lookup.","summary":"Get keyword SERP","tags":["keywords"],"parameters":[{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of SERP positions to return per page.","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"kw","in":"query","description":"Keyword to retrieve SERP results for.","required":true,"content":{"application/json":{"schema":{"type":"string","minLength":1,"example":"seo tools"}}}},{"name":"market","in":"query","description":"Search market as language_country (e.g. da_dk = Danish in Denmark, en_us = English in United States).","required":true,"content":{"application/json":{"schema":{"type":"string","enum":["ps_af","sq_al","ar_dz","kg_ao","en_ai","es_ar","hy_am","en_au","de_at","az_az","en_bs","ar_bh","bn_bd","be_by","nl_be","en_bz","fr_bj","es_bo","bs_ba","tn_bw","pt_br","zh_bn","bg_bg","fr_bf","fr_bi","km_kh","fr_cm","en_ca","pt_cv","fr_cf","ar_td","es_cl","zh_cn","es_co","en_ck","es_cr","fr_ci","hr_hr","es_cu","en_cy","cs_cz","sw_cd","da_dk","en_dm","es_do","es_ec","ar_eg","es_sv","et_ee","am_et","en_fj","fi_fi","fr_fr","fr_ga","en_gm","ka_ge","de_de","ak_gh","en_gi","el_gr","da_gl","fr_gp","es_gt","en_gg","en_gy","fr_ht","es_hn","zh_hk","hu_hu","is_is","bn_in","jw_id","ar_iq","en_ie","en_im","iw_il","it_it","en_jm","ja_jp","en_je","ar_jo","kk_kz","sw_ke","en_ki","ar_kw","ky_kg","lo_la","lv_lv","ar_lb","ar_ly","de_li","lt_lt","fr_lu","mk_mk","fr_mg","en_my","mt_mt","es_mx","mo_md","mn_mn","bs_me","en_ms","ar_ma","ny_mz","af_na","en_nr","ne_np","nl_nl","en_nz","es_ni","fr_ne","en_ng","en_nu","no_no","ar_om","ur_pk","ar_ps","es_pa","es_py","es_pe","tl_ph","pl_pl","pt_pt","es_pr","ar_qa","ro_ro","ru_ru","fr_rw","ar_sa","fr_sn","sr_rs","en_sc","en_sl","zh_sg","sk_sk","sl_si","en_sb","so_so","en_za","ko_kr","es_es","si_lk","sv_se","de_ch","zh_tw","tg_tj","sw_tz","th_th","en_tk","to_to","zh_tt","ar_tn","tr_tr","tk_tm","lg_ug","uk_ua","ar_ae","en_gb","en_us","es_uy","uz_uz","es_ve","vi_vn","en_vi","ny_zm","ny_zw","my_mm"],"example":"da_dk"}}}},{"name":"geotarget_id","in":"query","content":{"application/json":{"schema":{"type":"string"}}}}],"operationId":"keywords.getSerpOverview","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"position":{"type":"number","nullable":true},"domain":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"desc":{"type":"string","nullable":true}},"required":["position","domain","url","title","desc"],"additionalProperties":true}},"has_data":{"type":"boolean"},"data_status":{"type":"string"},"kw":{"type":"string"},"hl":{"type":"string"},"gl":{"type":"string"},"geotarget_id":{"type":"string","nullable":true}},"required":["total","page","per_page","data","has_data","data_status","kw","hl","gl","geotarget_id"],"additionalProperties":true}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/domains/{domainId}/suggested-keywords":{"get":{"description":"Returns keyword suggestions for a domain from domain-market data, excluding keywords already tracked when configured.","summary":"Get suggested keywords","tags":["keywords"],"parameters":[{"name":"domainId","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}},{"name":"excluded_keywords","in":"query","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}],"operationId":"keywords.getSuggestedKeywords","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"kw":{"type":"string"},"position":{"type":"number","nullable":true},"sv":{"type":"number","nullable":true},"cpc":{"type":"number","nullable":true},"est_traffic":{"type":"number","nullable":true},"traffic_value":{"type":"number","nullable":true},"potential_score":{"type":"number","nullable":true}},"required":["kw"],"additionalProperties":true}}},"required":["total","page","per_page","data"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/geo-score":{"get":{"description":"Returns the current GEO Score overview for a domain, including visibility counts, score changes, calculation status, and related brand data.","summary":"Get GEO Score overview","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"ai.getGeoScore","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean"},"hasEverBeenCalculated":{"type":"boolean","nullable":true},"geoScoreStatusId":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"geoScorePercentage":{"type":"number","nullable":true},"foundInAnyCount":{"type":"number","nullable":true},"foundInAnswerCount":{"type":"number","nullable":true},"foundInSourceCount":{"type":"number","nullable":true},"foundInBothCount":{"type":"number","nullable":true},"notFoundCount":{"type":"number","nullable":true},"totalPromptCount":{"type":"number","nullable":true},"calculatedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"geoScorePercentageChange":{"type":"number","nullable":true},"foundInAnyCountChange":{"type":"number","nullable":true},"brands":{"type":"array","items":{"nullable":true},"nullable":true},"blockers":{"type":"array","items":{"nullable":true},"nullable":true},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending","in_progress","completed","failed"]},"count":{"type":"number"},"progress":{"type":"number"},"total":{"type":"number"}},"required":["id","status"]},"nullable":true},"eta":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"etaCalculatedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"isCalculating":{"type":"boolean","nullable":true},"isPendingStart":{"type":"boolean","nullable":true},"isFailed":{"type":"boolean","nullable":true},"hasActiveSteps":{"type":"boolean","nullable":true}},"required":["has_data"],"description":"GEO Score overview and visibility counts for the domain."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/geo-score/prompts":{"get":{"description":"Returns paginated GEO prompts for a domain with their latest lookup status and whether the domain was found in AI answers, sources, both, or neither.","summary":"Get GEO Score prompts","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}}],"operationId":"ai.getGeoScorePrompts","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean"},"entries":{"type":"array","items":{"type":"object","properties":{"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]},"folder_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"prompt":{"type":"string"},"tracked":{"type":"boolean"},"latest":{"type":"object","properties":{"lookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"foundInAny":{"type":"boolean","nullable":true},"foundInBoth":{"type":"boolean","nullable":true},"foundInContent":{"type":"boolean","nullable":true},"foundInSources":{"type":"boolean","nullable":true},"foundBrands":{"type":"array","items":{"type":"string"},"nullable":true}},"nullable":true},"latestLookupRequestedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"latestLookupETADoneAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"change":{"type":"object","properties":{"foundInAny":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInBoth":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInContent":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInSources":{"type":"string","enum":["same","found","lost"],"nullable":true}},"required":["foundInAny","foundInBoth","foundInContent","foundInSources"],"nullable":true}},"required":["_id","prompt","tracked"]}},"data_status":{"type":"string","nullable":true},"state":{"type":"object","properties":{"total_before_pagination":{"type":"number","nullable":true},"total_before_filters":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"is_filtering":{"type":"boolean","nullable":true},"has_filter_results":{"type":"boolean","nullable":true}},"nullable":true}},"required":["has_data","entries"],"description":"Paginated GEO prompts and their latest visibility status."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/geo-score/calculate":{"post":{"description":"Starts GEO Score for a domain the same way the in-app Start button does: creates the score status, generates prompts, and enqueues lookups. Calculation finishes asynchronously; poll GET /geo-score for progress. Idempotent when generation has already started.","summary":"Start GEO Score generation","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"ai.calculateGeoScore","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"started":{"type":"boolean","enum":[true]},"status":{"type":"string"}},"required":["started","status"],"description":"GEO Score generation was started or already in progress for the domain. Poll GET /geo-score for calculation progress; the numeric score is not ready immediately."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/{domain_id}/ai/{provider}/tracker":{"get":{"description":"Returns paginated tracked prompts for ChatGPT visibility on a domain.","summary":"Get AI tracker prompts","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["chatgpt"],"example":"chatgpt"},"description":"The AI search provider to query tracker data for. Only ChatGPT is currently supported."},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}}],"operationId":"ai.getProviderTracker","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean"},"entries":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]},"folder_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"prompt":{"type":"string"},"tracked":{"type":"boolean"},"latest":{"type":"object","properties":{"lookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"foundInAny":{"type":"boolean","nullable":true},"foundInBoth":{"type":"boolean","nullable":true},"foundInContent":{"type":"boolean","nullable":true},"foundInSources":{"type":"boolean","nullable":true},"foundBrands":{"type":"array","items":{"type":"string"},"nullable":true}},"nullable":true},"latestLookupRequestedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"latestLookupETADoneAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"change":{"type":"object","properties":{"foundInAny":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInBoth":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInContent":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInSources":{"type":"string","enum":["same","found","lost"],"nullable":true}},"required":["foundInAny","foundInBoth","foundInContent","foundInSources"],"nullable":true}},"required":["_id","prompt","tracked"]},{"type":"object","properties":{"group_key":{"type":"string"},"folder_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"groupName":{"type":"string","nullable":true},"group_type":{"type":"string","enum":["folder","brand"]},"entries":{"type":"array","items":{"type":"object","properties":{"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]},"folder_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"prompt":{"type":"string"},"tracked":{"type":"boolean"},"latest":{"type":"object","properties":{"lookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"foundInAny":{"type":"boolean","nullable":true},"foundInBoth":{"type":"boolean","nullable":true},"foundInContent":{"type":"boolean","nullable":true},"foundInSources":{"type":"boolean","nullable":true},"foundBrands":{"type":"array","items":{"type":"string"},"nullable":true}},"nullable":true},"latestLookupRequestedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"latestLookupETADoneAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"change":{"type":"object","properties":{"foundInAny":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInBoth":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInContent":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInSources":{"type":"string","enum":["same","found","lost"],"nullable":true}},"required":["foundInAny","foundInBoth","foundInContent","foundInSources"],"nullable":true}},"required":["_id","prompt","tracked"]}},"aggregation":{"type":"object","properties":{"total_entries":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"foundInAny":{"type":"number","nullable":true},"foundInSources":{"type":"number","nullable":true},"foundInBoth":{"type":"number","nullable":true},"foundInContent":{"type":"number","nullable":true},"latestLookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"oldestLookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true}},"nullable":true}},"required":["group_key","group_type","entries"]}]}},"data_status":{"type":"string","nullable":true},"total_entries":{"type":"number","nullable":true},"grouped_by":{"type":"string","nullable":true},"aggregation":{"type":"object","properties":{"total_entries":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"foundInAny":{"type":"number","nullable":true},"foundInSources":{"type":"number","nullable":true},"foundInBoth":{"type":"number","nullable":true},"foundInContent":{"type":"number","nullable":true},"latestLookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"oldestLookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true}},"nullable":true},"state":{"type":"object","properties":{"total_before_pagination":{"type":"number","nullable":true},"total_before_filters":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"is_filtering":{"type":"boolean","nullable":true},"has_filter_results":{"type":"boolean","nullable":true}},"nullable":true}},"required":["has_data","entries"],"description":"Paginated tracked prompts for ChatGPT visibility."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/ai/{provider}/tracker/summary":{"get":{"description":"Returns aggregate ChatGPT tracker metrics, including active prompt count, initial score, current score, and score change.","summary":"Get AI tracker summary","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["chatgpt"],"example":"chatgpt"},"description":"The AI search provider to query tracker data for. Only ChatGPT is currently supported."}],"operationId":"ai.getProviderTrackerSummary","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"activePromptsCount":{"type":"number"},"initialScore":{"type":"number"},"currentScore":{"type":"number"},"scoreChange":{"type":"number"}},"required":["activePromptsCount","initialScore","currentScore","scoreChange"],"description":"Aggregate AI tracker metrics for AI visibility."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/ai/{provider}/tracker/prompts/{prompt_id}":{"get":{"description":"Returns details for a single tracked ChatGPT prompt, including the latest visibility data when available.","summary":"Get AI tracker prompt details","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["chatgpt"],"example":"chatgpt"},"description":"The AI search provider to query tracker data for. Only ChatGPT is currently supported."},{"name":"prompt_id","in":"path","required":true,"schema":{"type":"string"},"description":"The tracked prompt identifier."}],"operationId":"ai.getProviderTrackerPrompt","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]},"folder_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"prompt":{"type":"string"},"tracked":{"type":"boolean"},"latest":{"type":"object","properties":{"lookupAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"foundInAny":{"type":"boolean","nullable":true},"foundInBoth":{"type":"boolean","nullable":true},"foundInContent":{"type":"boolean","nullable":true},"foundInSources":{"type":"boolean","nullable":true},"foundBrands":{"type":"array","items":{"type":"string"},"nullable":true}},"nullable":true},"latestLookupRequestedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"latestLookupETADoneAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"change":{"type":"object","properties":{"foundInAny":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInBoth":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInContent":{"type":"string","enum":["same","found","lost"],"nullable":true},"foundInSources":{"type":"string","enum":["same","found","lost"],"nullable":true}},"required":["foundInAny","foundInBoth","foundInContent","foundInSources"],"nullable":true},"has_data":{"type":"boolean","enum":[true]}},"required":["_id","prompt","tracked","has_data"]},{"type":"object","properties":{"has_data":{"type":"boolean","enum":[false]}},"required":["has_data"]}],"description":"Details for one tracked AI prompt."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/ai/{provider}/tracker/folders":{"get":{"description":"Returns the prompt folders available for the domain AI tracker view.","summary":"Get AI tracker folders","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["chatgpt"],"example":"chatgpt"},"description":"The AI search provider to query tracker data for. Only ChatGPT is currently supported."}],"operationId":"ai.getProviderTrackerFolders","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]},"folderName":{"type":"string","nullable":true}},"required":["_id"]}},"has_data":{"type":"boolean"},"state":{"type":"object","properties":{"total_before_pagination":{"type":"number","nullable":true},"total_before_filters":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"is_filtering":{"type":"boolean","nullable":true},"has_filter_results":{"type":"boolean","nullable":true}},"nullable":true}},"required":["entries","has_data"],"description":"Prompt folders available for GEO Score data."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/ai/tracker/suggestions":{"get":{"description":"Returns website-summary based prompt suggestions for the ChatGPT tracker. Reads the shared suggestion bag when it already has enough prompts. Otherwise enqueues a separate quick worker (1–50) that is not blocked by domain activation’s 60-prompt job. If the bag is empty and no website summary exists yet, returns data_status waiting_for_website_summary and does not enqueue. No AI provider is required because suggestions are not provider-specific.","summary":"Get AI tracker prompt suggestions","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"amount","in":"query","description":"Number of suggestions to return. Also used for a fast 1–50 fill on a separate worker when the bag is empty. Does not wait on domain activation’s 60-prompt job. Plain query example: ?amount=10","content":{"application/json":{"schema":{"default":10,"type":"integer","minimum":1,"maximum":50,"example":10}}}},{"name":"regenerate","in":"query","description":"When true, advances to the next bag batch (does not wait on LLM). Plain query example: ?regenerate=true","content":{"application/json":{"schema":{"default":false,"type":"boolean","nullable":true}}}}],"operationId":"ai.getTrackerSuggestions","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_data":{"type":"boolean"},"data_status":{"type":"string","enum":["has_data","no_data","waiting_for_website_summary"]},"is_generating":{"type":"boolean"},"entries":{"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string"},"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]}},"required":["prompt","_id"]}}},"required":["has_data","data_status","is_generating","entries"],"description":"Website-summary based prompt suggestions for the ChatGPT tracker. When the bag is empty, is_generating may be true while suggestions are produced asynchronously. data_status is waiting_for_website_summary when generation cannot start yet because domain activation has not written a website summary."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/ai/{provider}/tracked-prompts":{"post":{"description":"Adds one or more prompts to the ChatGPT tracker. Optionally place the prompts in an existing folder by ID or create/use a folder by name.","summary":"Add tracked prompts","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["chatgpt"],"example":"chatgpt"},"description":"The AI search provider to query tracker data for. Only ChatGPT is currently supported."}],"operationId":"ai.addProviderTrackedPrompts","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"prompts":{"type":"array","items":{"type":"string","minLength":2},"minItems":1,"description":"Prompt texts to track for ChatGPT visibility. Each prompt must be at least 2 letters after trimming. Empty or whitespace-only strings are rejected.","example":["What is the best SEO tool for small businesses?"]},"folder_id":{"type":"string","description":"Existing folder ID to add the prompts to. If omitted, the provider default is used unless folder_name is provided."},"folder_name":{"type":"string","description":"Folder name to create or reuse for the prompts when folder_id is not supplied."}},"required":["prompts"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}]},"id":{"type":"string"},"prompt":{"type":"string"},"status":{"type":"string","nullable":true},"folder_id":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"nullable":true}}],"nullable":true},"latestLookupRequestedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true}},"required":["prompt"]}}},"required":["entries"],"nullable":true}},"required":["success"],"description":"Result of adding tracked prompts."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"402","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/{domain_id}/ai/{provider}/tracked-prompts/{prompt_id}":{"delete":{"description":"Removes a tracked ChatGPT prompt for the domain.","summary":"Remove tracked prompt","tags":["ai"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["chatgpt"],"example":"chatgpt"},"description":"The AI search provider to query tracker data for. Only ChatGPT is currently supported."},{"name":"prompt_id","in":"path","required":true,"schema":{"type":"string"},"description":"The tracked prompt identifier to remove."}],"operationId":"ai.removeProviderTrackedPrompt","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"description":"Result of removing a tracked prompt."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":900}},"/v1/{domain_id}/geo-health":{"get":{"description":"Returns GEO Health for a domain when a report exists (overall score, pillar breakdown, allowlisted section metrics/top lists). Returns 404 when no report is available yet, including while a report is still generating.","summary":"Get GEO Health report","tags":["geoHealth"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"geoHealth.getGeoHealth","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"has_report":{"type":"boolean","enum":[true]},"is_generating":{"type":"boolean"},"domain":{"type":"string","nullable":true},"gl":{"type":"string","nullable":true},"geoHealthScorePercentage":{"type":"number"},"landingPagesScanned":{"type":"number"},"lastReportGeneratedAt":{"oneOf":[{"type":"string"},{"type":"string","format":"date-time"}],"nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["seo","brand_mentions","content","reviews","links","social_media"]},"scorePercentage":{"type":"number"},"mentioningWebsitesCount":{"type":"number","nullable":true},"pagesCount":{"type":"number","nullable":true},"reviewsCount":{"type":"number","nullable":true},"averageRating":{"type":"number","nullable":true},"socialMediaSitesCount":{"type":"number","nullable":true},"mentionsCount":{"type":"number","nullable":true}},"required":["key","scorePercentage"]}},"report":{"type":"object","properties":{"domain":{"type":"string"},"countryCode":{"type":"string"},"overallScore":{"type":"number"},"scoreExplanationHtml":{"type":"string"},"pillars":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["seo","brand_mentions","content","reviews","links","social_media"]},"scorePercentage":{"type":"number"}},"required":["key","scorePercentage"]}},"sections":{"type":"object","properties":{"seo":{"type":"object","properties":{"score":{"type":"number"},"seoScoreUsd":{"type":"number","nullable":true},"topKeywords":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"searches":{"type":"number"},"rank":{"type":"number"},"seoScoreUsd":{"type":"number"}},"required":["keyword","searches","rank","seoScoreUsd"]},"nullable":true},"totalKeywords":{"type":"number","nullable":true}},"required":["score"],"nullable":true},"content":{"type":"object","properties":{"score":{"type":"number"},"healthScore":{"type":"number","nullable":true},"totalPages":{"type":"number","nullable":true},"totalPagesScore":{"type":"number","nullable":true},"lowPagescoreCount":{"type":"number","nullable":true},"pagescoreRatio":{"type":"number","nullable":true},"pagescoreRatioScore":{"type":"number","nullable":true}},"required":["score"],"nullable":true},"links":{"type":"object","properties":{"score":{"type":"number"},"linkscore":{"type":"number","nullable":true}},"required":["score"],"nullable":true},"brand_mentions":{"type":"object","properties":{"score":{"type":"number"},"totalMentions":{"type":"number","nullable":true},"topWebsites":{"type":"array","items":{"type":"object","properties":{"website":{"type":"string"},"domainAuthority":{"type":"number"}},"required":["website","domainAuthority"]},"nullable":true}},"required":["score"],"nullable":true},"reviews":{"type":"object","properties":{"score":{"type":"number"},"totalReviews":{"type":"number","nullable":true},"averageRating":{"type":"number","nullable":true},"sources":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"reviews":{"type":"number"},"rating":{"type":"number"}},"required":["platform","reviews","rating"]},"nullable":true}},"required":["score"],"nullable":true},"social_media":{"type":"object","properties":{"score":{"type":"number"},"sitesWithMentions":{"type":"number","nullable":true},"totalMentions":{"type":"number","nullable":true},"results":{"type":"array","items":{"type":"object","properties":{"site":{"type":"string"},"found":{"type":"boolean"},"mentions":{"oneOf":[{"type":"number"},{"type":"string"}],"nullable":true}},"required":["site","found"]},"nullable":true}},"required":["score"],"nullable":true}}}},"required":["domain","countryCode","overallScore","scoreExplanationHtml","pillars","sections"],"nullable":true},"errorMessage":{"type":"string","nullable":true}},"required":["has_report","is_generating","geoHealthScorePercentage","landingPagesScanned","items"],"description":"GEO Health summary and allowlisted report detail for the domain (pillar scores, key metrics, and top lists). Internal UI fields such as mission/benchmark ranges are not included. Returns 404 when no report is available yet (including while generating)."}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/geo-health/generate":{"post":{"description":"Starts manual GEO Health report generation for a domain. Returns 429 when the 24-hour regeneration cooldown has not elapsed. Joins an in-flight generation when one is already running.","summary":"Start GEO Health report generation","tags":["geoHealth"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"geoHealth.generateGeoHealth","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"wait_mode":{"type":"string","enum":["once"]},"skip_cooldown":{"type":"boolean"}}}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"started":{"type":"boolean","enum":[true]},"is_generating":{"type":"boolean","enum":[true]},"report_id":{"type":"string","nullable":true},"joined":{"type":"boolean"}},"required":["started","is_generating","joined"],"description":"GEO Health report generation was started or joined an in-flight generation for the domain."}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/{domain_id}/articles":{"post":{"description":"Starts async article generation using Rank Writer 2.0. Returns immediately with an article id; poll getArticle until contentStatus is generated. Optional preset controls quality/speed (defaults to fast).","summary":"Generate an article","tags":["writer"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}}],"operationId":"writer.generateArticle","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"preset":{"type":"string","enum":["fast","medium","slow"]}},"required":["keyword"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"402","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800},"get":{"description":"Retrieves a paginated list of articles. You can use the _id from the listed articles to fetch the full article content using the getArticle endpoint.","summary":"List articles","tags":["writer"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"pagination.page","in":"query","description":"The page number to return","content":{"application/json":{"schema":{"default":1,"type":"number","minimum":1,"maximum":100}}}},{"name":"pagination.per_page","in":"query","description":"The number of items to return per page","content":{"application/json":{"schema":{"default":10,"type":"number","minimum":1,"maximum":100}}}}],"operationId":"writer.listArticles","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"page":{"type":"number"},"per_page":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"metaTitle":{"type":"string","nullable":true},"metaDescription":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true},"updatedAt":{"type":"string","nullable":true},"contentStatus":{"type":"string","nullable":true},"status":{"type":"string","nullable":true}}}}},"required":["total","page","per_page","data"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/{domain_id}/articles/{article_id}":{"get":{"description":"Retrieves a specific article by its ID.","summary":"Get an article","tags":["writer"],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","example":"v3.dev.724c7b98c8766f051883aa91a7282204"}},{"name":"article_id","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"writer.getArticle","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"metaTitle":{"type":"string","nullable":true},"metaDescription":{"type":"string","nullable":true},"createdAt":{"type":"string","nullable":true},"updatedAt":{"type":"string","nullable":true},"contentStatus":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"content":{"type":"string","nullable":true}}}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/page-booster/analyze":{"post":{"description":"Analyze url and content for ranking improvements. Add orchestrate=true parameter to allow the analysis to execute on findings and improve your content with several individual checks chosen by the analysis. Costs 10 AI credits.","summary":"Page Booster full analysis","tags":["pageBooster"],"parameters":[],"operationId":"pageBooster.analyze","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"url_post":{"type":"string"},"post_content_html":{"type":"string"},"meta_post":{"type":"string"},"title_post":{"type":"string"},"h1_header":{"type":"string"},"publish_date_post":{"type":"string"},"update_date_post":{"type":"string"},"focus_keywords":{"type":"string"},"editor_type":{"type":"string","enum":["elementor","gutenberg","divi","shopify"]},"orchestrate":{"type":"boolean"}},"required":["url_post","post_content_html"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"analysisData":{"type":"object","additionalProperties":{"nullable":true}},"estimatedTokens":{"type":"number"},"modelName":{"type":"string"},"jobId":{"type":"string"},"checksToRun":{"type":"array","items":{"type":"string"}}},"required":["analysisData","estimatedTokens","modelName"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"402","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/page-booster/check/{check_type}":{"post":{"description":"Page Booster contains several smaller endpoints to fully cover all aspects of content optimization. This endpoint allows you to run the ones you want. Like only fixing grammar or improving Title Tags. Each check costs 2 AI credits. For check_type custom-prompt, body.custom_prompt is required (max 2000 characters) and modifies post_content_html.","summary":"Run a standalone Page Booster check","tags":["pageBooster"],"parameters":[{"name":"check_type","in":"path","required":true,"schema":{"type":"string","enum":["quick-summary","focus-keywords","improve-header","content-rewrite","content-outdated","eeat-signals","external-links-checker","add-faq","fix-grammar","improve-title-tag","improve-meta-description","custom-prompt"]}}],"operationId":"pageBooster.runCheck","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"url_post":{"type":"string"},"post_content_html":{"type":"string"},"meta_post":{"type":"string"},"title_post":{"type":"string"},"h1_header":{"type":"string"},"publish_date_post":{"type":"string"},"update_date_post":{"type":"string"},"focus_keywords":{"type":"string"},"editor_type":{"type":"string","enum":["elementor","gutenberg","divi","shopify"]},"analysis_summary":{"type":"string"},"content_summary":{"type":"string"},"content_type":{"type":"string","enum":["article","landing_page","product","product_category"]},"custom_prompt":{"type":"string","maxLength":2000},"async":{"type":"boolean"}},"required":["url_post","post_content_html"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"post_content_html":{"type":"string"},"title_post":{"type":"string"},"meta_post":{"type":"string"},"h1_header":{"type":"string"},"actionTaken":{"type":"string"},"estimatedTokens":{"type":"number"},"modelName":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}},"exaResearchResults":{"type":"string"}},"required":["actionTaken","estimatedTokens","modelName","citations"]},{"type":"object","properties":{"jobId":{"type":"string"},"check":{"type":"string"}},"required":["jobId","check"]}]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"402","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/page-booster/status/{job_id}":{"get":{"summary":"Get Page Booster job status","tags":["pageBooster"],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"pageBooster.getStatus","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["running","completed","failed"]},"steps":{"type":"array","items":{"type":"object","properties":{"check":{"type":"string"},"status":{"type":"string","enum":["pending","running","completed","failed"]},"error":{"type":"string"},"actionTaken":{"type":"string"},"citations":{"type":"array","items":{"type":"string"}},"exaResearchResults":{"type":"string"}},"required":["check","status"]}},"currentStep":{"type":"string","nullable":true},"result":{"type":"object","properties":{"post_content_html":{"type":"string"},"title_post":{"type":"string"},"meta_post":{"type":"string"},"h1_header":{"type":"string"},"analysisData":{"nullable":true}},"required":["post_content_html","title_post","meta_post","h1_header"],"nullable":true},"error":{"type":"string","nullable":true},"totalTokens":{"type":"number"}},"required":["id","status","steps","currentStep","result","error","totalTokens"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":100}},"/v1/ms-chat/verify-state":{"post":{"summary":"Verify ms-chat deep-link state","tags":["msChat"],"parameters":[],"operationId":"msChat.verifyState","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","minLength":1}},"required":["state"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean","enum":[true]},"state":{"type":"object","properties":{"resourceId":{"type":"string"},"returnUrl":{"type":"string"},"exp":{"type":"number"},"nonce":{"type":"string"},"siteUrl":{"type":"string"},"shopDomain":{"type":"string"}},"required":["resourceId","returnUrl","exp","nonce"]}},"required":["valid","state"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"security":[],"x-order":800}},"/v1/ms-chat/wp/register":{"post":{"summary":"Register WordPress site heartbeat","tags":["msChat"],"parameters":[],"operationId":"msChat.wpRegister","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"site_url":{"type":"string","minLength":1},"plugin_version":{"type":"string"},"wp_version":{"type":"string"},"php_version":{"type":"string"}},"required":["site_url"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"site_url":{"type":"string"}},"required":["success"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/ms-chat/wp/unregister":{"post":{"summary":"Unregister WordPress site","tags":["msChat"],"parameters":[],"operationId":"msChat.wpUnregister","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"site_url":{"type":"string","minLength":1}},"required":["site_url"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"site_url":{"type":"string"}},"required":["success"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/ms-chat/confirm":{"post":{"summary":"Confirm ms-chat WordPress agent link","tags":["msChat"],"parameters":[],"operationId":"msChat.wpConfirm","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"resource_id":{"type":"string","minLength":1},"site_url":{"type":"string","minLength":1},"agent_token":{"type":"string","minLength":1},"agent_token_hash":{"type":"string"},"ms_chat_state":{"type":"string"}},"required":["resource_id","site_url","agent_token"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"return_url":{"type":"string"},"site_url":{"type":"string"},"agent_secret":{"type":"string"}},"required":["success","site_url","agent_secret"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/ms-chat/revoke":{"post":{"summary":"Revoke ms-chat WordPress agent link","tags":["msChat"],"parameters":[],"operationId":"msChat.wpRevoke","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"resource_id":{"type":"string","minLength":1},"site_url":{"type":"string","minLength":1}},"required":["resource_id","site_url"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"401":{"description":"401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"429","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooManyRequestsError"}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"x-order":800}},"/v1/ms-chat/shopify/link-preview":{"get":{"summary":"Preview Shopify ms-chat link state","tags":["msChat"],"parameters":[{"name":"state","in":"query","required":true,"content":{"application/json":{"schema":{"type":"string","minLength":1}}}}],"operationId":"msChat.shopifyLinkPreview","responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"shopDomain":{"type":"string"},"displayDomain":{"type":"string"},"returnUrl":{"type":"string"},"resourceId":{"type":"string"}},"required":["shopDomain","displayDomain","returnUrl","resourceId"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"404","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"security":[],"x-order":100}},"/v1/ms-chat/shopify/confirm":{"post":{"summary":"Confirm ms-chat Shopify agent link","tags":["msChat"],"parameters":[{"name":"shop","in":"query","required":true,"content":{"application/json":{"schema":{"type":"string","minLength":1}}}}],"operationId":"msChat.shopifyConfirm","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","minLength":1}},"required":["state"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"returnUrl":{"type":"string"},"shopDomain":{"type":"string"}},"required":["success","returnUrl","shopDomain"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"403","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"404","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"security":[],"x-order":800}},"/v1/ms-chat/shopify/revoke":{"post":{"summary":"Revoke ms-chat Shopify agent link","tags":["msChat"],"parameters":[{"name":"shop","in":"query","required":true,"content":{"application/json":{"schema":{"type":"string","minLength":1}}}}],"operationId":"msChat.shopifyRevoke","requestBody":{"description":"Body","content":{"application/json":{"schema":{"type":"object","properties":{"resourceId":{"type":"string","minLength":1}},"required":["resourceId"]}}}},"responses":{"200":{"description":"200","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"400":{"description":"400","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"401","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"403","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"404","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"security":[],"x-order":800}}},"info":{"title":"Morningscore API","version":"1.0.0","description":"The Morningscore API gives you programmatic access to our SEO and website analysis tools. With this API, you can:\n\n- Fetch detailed domain information\n- Analyze onsite SEO issues\n- Retrieve AI fixes for issues\n\nVisit our [SEO API information](https://morningscore.io/seo-api/) for detailed feature descriptions, pricing plans, and practical use cases.\n\n## MCP\n\nWe also provide a Morningscore MCP interface for agent and LLM workflows that prefer tool-style access over direct REST integration.\n\nWith MCP, integrations can call curated Morningscore tools through a single protocol endpoint instead of manually orchestrating multiple REST calls.\n\nThe MCP endpoint is currently available at `mcp.morningscore.io/mcp`.\n\nMCP supports two authentication methods: header auth with \"X-Morningscore-Api-Key\" and OAuth Bearer tokens.\n\nMCP is currently in **BETA** and may change as we continue improving it.\n\n## Endpoint Groups\n\n- **Domains**: List available domains, inspect domain-level metrics, and score history.\n- **Competitors**: List saved competitors, fetch suggestions, and add or remove competitors for a domain.\n- **Missions**: List, create, archive, unarchive, and delete SEO missions for a domain.\n- **Health**: Analyze onsite SEO pages, issues, AI fixes, crawler IPs, and overall health summaries.\n- **Keywords**: List ranking and tracked keywords, inspect keyword metrics, compare competitor overlap, research keyword ideas, read cached Google SERP results, and fetch suggested keywords.\n- **AI**: GEO Score (AI visibility) and tracked prompts.\n- **GEO Health**: Six-pillar GEO Health reports (read and start generation).\n- **Links**: Retrieve backlink data for a domain\n- **Writer**: Generate and retrieve AI-written articles based on keywords\n- **Page Booster**:  Optimize the SEO of any landing page. Send HTML and receive an improved version.\n\n## Authentication\n\nAll API requests require an API key, which can be obtained from your [Morningscore dashboard](https://v3.morningscore.io/settings/api).\n\n## Rate Limiting\n\nEach API key is limited to a maximum of **20 requests per second**. This is calculated using a running window, meaning at any given moment, the number of requests made in the previous 5 seconds cannot exceed 100.\n\n\n\n","termsOfService":"https://morningscore.io/terms/","contact":{"email":"mail@morningscore.io","name":"Morningscore"}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message.","example":"Domain not found"}},"required":["error"],"title":"Error"},"RateLimitError":{"type":"object","properties":{"message":{"type":"string","description":"Rate limit exceeded.","example":"Too many requests"}},"required":["message"],"title":"RateLimitError"},"TooManyRequestsError":{"oneOf":[{"$ref":"#/components/schemas/Error"},{"$ref":"#/components/schemas/RateLimitError"}],"title":"TooManyRequestsError","description":"Per-window rate limit exceeded, or a monthly usage quota (e.g. keyword research) was exhausted."},"InternalError":{"type":"object","properties":{"error":{"type":"string","example":"Internal Server Error"},"message":{"type":"string"},"details":{"nullable":true}},"required":["error"],"title":"InternalError"},"BadRequestError":{"oneOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"message":{"type":"string","example":"Invalid request"}},"required":["message"]}],"title":"BadRequestError"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"tags":[{"name":"domains","title":"Domains","x-displayName":"Domains","description":"Manage domains on the authenticated account: list registered sites, add or remove domains, poll activation status after adding a domain, read the website summary, and read domain-level metrics including score history."},{"name":"competitors","title":"Competitors","x-displayName":"Competitors","description":"Manage and discover competitors for a domain: list saved competitors, fetch suggestions, add a competitor hostname, or remove one by global domain identifier."},{"name":"missions","title":"Missions","x-displayName":"Missions","description":"Manage SEO missions for a domain: list current, completed, and archived missions, create new missions, and archive, unarchive, or delete them."},{"name":"health","title":"Health","x-displayName":"Health","description":"Analyze onsite SEO health for a domain. This group covers indexed pages, issue lists, AI fix suggestions, crawler IPs, and overall health summaries."},{"name":"keywords","title":"Keywords","x-displayName":"Keywords","description":"Work with keyword visibility data for a domain: list ranking and tracked keywords, inspect single-keyword metrics, compare competitor overlap, research keyword ideas, read cached Google SERP results, and fetch suggested keywords."},{"name":"ai","title":"AI","x-displayName":"AI","description":"Monitor Google AI search visibility and tracked prompts. Use these endpoints to read GEO score data, list prompt folders, inspect tracker summaries, fetch prompt suggestions, and manage tracked prompts."},{"name":"geoHealth","title":"GEO Health","x-displayName":"GEO Health","description":"Read and generate six-pillar GEO Health reports for a domain. GET returns allowlisted report data when available; POST starts manual generation subject to the 24-hour cooldown."},{"name":"links","title":"Links","x-displayName":"Links","description":"Retrieve backlink data for a domain, including all, newly discovered, and lost links."},{"name":"writer","title":"Writer","x-displayName":"Writer","description":"Generate and retrieve AI-written articles for a domain. Use the returned article ID to poll or fetch generated content."},{"name":"pageBooster","title":"Page Booster","x-displayName":"Page Booster","description":"Optimize any existing landing page to increase odds of ranking in search and AI. Provide HTML and other optional parameters and receive fully optimized HTML. Can take up to 30 minutes per page. Heavy and expensive LLMs are used. Use the GET endpoint to fetch status (detailed info in response)."},{"name":"other","title":"Other","x-displayName":"Other","description":"Supporting API utilities, including current credit usage and limits for feature-specific quotas."}],"x-tagGroups":[{"name":"SEO Data","tags":["domains","competitors","missions","health","keywords","links"]},{"name":"AI Tools","tags":["ai","geoHealth","writer","pageBooster"]},{"name":"Account","tags":["other"]}],"security":[{"bearerAuth":[]}],"servers":[{"url":"https://api.morningscore.io","description":"Morningscore API Base URL"}]}