# info.summary
Read and manage Semalt account websites, analytics organization, campaign keywords, and indexing.

# info.description
The API uses the API key from the Semalt account. Site collections preserve separate accessible records instead of grouping them by domain or Search Console property. Repeated domains and properties are therefore intentional. Hidden and removed records are never returned.

# tags[].description
Website records available to the authenticated account.

# tags[].description
Personal labels for organizing and filtering accessible domains.

# tags[].description
Reusable, site-specific keyword collections used as analytics filters.

# tags[].description
Google Search Console properties and their analytics.

# tags[].description
Google ranking analytics resolved from an accessible website.

# tags[].description
AI visibility analytics for GPT-4.1 nano and GPT-5 nano.

# tags[].description
Campaign data associated with the authenticated account and an accessible website domain.

# tags[].description
Indexing URLs owned by the authenticated account.

# paths./me.get.description
Returns the account associated with the authenticated API key and the account ids linked to it.

# paths./sites.get.description
Returns website records available to the authenticated account. Records are not grouped, so the same domain can appear more than once when it is available through different accounts or properties.

# paths./sites.post.description
Creates or restores a manual website for the authenticated account. The operation is idempotent by normalized domain: adding the same domain again returns its existing site record.

# paths./sites.post.requestBody.description
Website to add. A complete URL is accepted and normalized to its domain.

# paths./sites/{site_id}.get.description
Use an id returned by a site collection. The request returns 404 when the site is hidden, removed, unknown, or not accessible to the current account.

# paths./site-tags.get.description
Returns personal site tags with the number of accessible domains assigned to each tag.

# paths./site-tags.post.description
Creates a tag for the linked account group. Repeating the same normalized name updates and returns the existing tag.

# paths./site-tags/{tag_id}.post.description
Renames a tag and optionally changes its color.

# paths./site-tags/{tag_id}/delete.post.description
Permanently deletes the tag and all of its domain assignments. Confirm this destructive action with the user before calling it.

# paths./site-tags/{tag_id}/delete.post.requestBody.description
Send an empty JSON object to confirm the request shape.

# paths./site-tags/{tag_id}/sites.get.description
Returns accessible domains assigned to the selected tag. search is a case-insensitive domain substring.

# paths./site-tags/{tag_id}/sites.post.description
Assigns the selected tag to each supplied accessible domain. Existing assignments are left unchanged.

# paths./site-tags/{tag_id}/sites/remove.post.description
Removes the selected tag from supplied accessible domains. Confirm the affected domains with the user before calling it.

# paths./site-tags/{tag_id}/sites/remove.post.requestBody.description
Domains from which the tag should be removed.

# paths./sites/{site_id}/keyword-groups.get.description
Returns reusable keyword groups visible for the selected site. Groups identify their owner and whether the authenticated account can edit them.

# paths./sites/{site_id}/keyword-groups.post.description
Creates a personal reusable keyword group for the domain represented by site_id.

# paths./sites/{site_id}/keyword-groups/{group_id}.post.description
Renames an editable non-default keyword group.

# paths./sites/{site_id}/keyword-groups/{group_id}/delete.post.description
Permanently deletes an editable non-default group and its keyword membership. Confirm this destructive action before calling it.

# paths./sites/{site_id}/keyword-groups/{group_id}/delete.post.requestBody.description
Send an empty JSON object to confirm the request shape.

# paths./sites/{site_id}/keyword-groups/{group_id}/keywords.get.description
Returns keyword rows stored in one reusable group. search is a case-insensitive keyword substring.

# paths./sites/{site_id}/keyword-groups/{group_id}/keywords.post.description
Adds normalized keywords to an editable group. Exact duplicates are skipped and reported, so retrying the same payload is safe.

# paths./sites/{site_id}/keyword-groups/{group_id}/keywords/remove.post.description
Removes keyword rows by ids returned by the group keyword list. Confirm the affected rows before calling it.

# paths./search-console/sites.get.description
Returns accessible Search Console properties with current and previous metrics for each record on this cursor page. By default, the current period ends yesterday and covers the preceding 29 inclusive calendar dates.

# paths./search-console/sites/{site_id}/overview.get.description
Returns summary cards and daily charts for the exact Search Console property associated with site_id.

# paths./search-console/sites/{site_id}/traffic.get.description
Returns one daily series for a selected query, page, device, or country. metric chooses which measurement is copied into each item.value; every item also contains clicks, impressions, CTR, and average position for context. Use value to select the exact dimension value.

# paths./search-console/sites/{site_id}/keywords.get.description
Returns aggregated search queries. search matches query text; metric ranges are inclusive and apply before pagination.

# paths./search-console/sites/{site_id}/pages.get.description
Returns aggregated pages. search matches a page URL or path; metric ranges are inclusive and apply before pagination.

# paths./search-console/sites/{site_id}/devices.get.description
Returns aggregated desktop, mobile, and tablet performance. country can narrow the rows before aggregation.

# paths./search-console/sites/{site_id}/countries.get.description
Returns performance grouped by canonical Google Search Console country code. device can narrow the rows before aggregation.

# paths./google-serp/sites.get.description
Returns accessible site records with ranking statistics joined by normalized domain. The same domain remains separate when it is accessible through more than one account record. The default date range ends today.

# paths./google-serp/sites/{site_id}/overview.get.description
Returns site statistics for the selected search engine and date range. If an exact snapshot is unavailable, the analytics source may use the nearest earlier snapshot.

# paths./google-serp/sites/{site_id}/keywords.get.description
Returns keyword positions and movement for the domain resolved from site_id. search is a keyword token search and should contain at least four characters. keyword_group_id restricts results to a reusable group visible for this site. Continue cursor pagination with next_token from the result as page_token.

# paths./google-serp/sites/{site_id}/pages.get.description
Returns best-performing pages for the resolved domain. keyword_group_id calculates page metrics only from keywords in a reusable group. page_url and keyword are exact upstream values; numeric minimum and maximum filters are inclusive.

# paths./google-serp/sites/{site_id}/competitors.get.description
Returns the top competitors by shared keywords for the resolved domain.

# paths./google-serp/rankings.get.description
Returns a page of global domain rankings for one search engine and snapshot date.

# paths./ai-analytics/sites.get.description
Returns accessible site records with visibility metrics for the selected public model name. The default model is gpt-5-nano.

# paths./ai-analytics/sites/{site_id}/overview.get.description
Returns AI visibility statistics for the domain resolved from site_id and the selected model.

# paths./ai-analytics/sites/{site_id}/queries.get.description
Returns query, page, position, and category data. query_id and page_id are exact ids returned by this endpoint; position_group provides common TOP filters without constructing arrays.

# paths./ai-analytics/sites/{site_id}/pages.get.description
Returns best-performing pages for the resolved domain and selected model.

# paths./ai-analytics/sites/{site_id}/competitors.get.description
Returns the leading AI visibility competitors for the resolved domain and selected model.

# paths./ai-analytics/rankings.get.description
Returns a page of global domain rankings for the selected AI model.

# paths./my-seo/sites.get.description
Returns accessible sites and joins campaign details only when the authenticated account has a campaign for the site domain. Sites without such a campaign have campaign_access=false and campaign=null.

# paths./my-seo/sites/{site_id}/keywords.get.description
Available when the authenticated account has a campaign for the site domain. search matches keyword text; target_url is an exact normalized target URL; keyword_group_id restricts results to a reusable group visible for this site.

# paths./my-seo/sites/{site_id}/keywords.post.description
Adds keyword and target URL pairs to the authenticated account campaign for the site domain when it is a launched FullSEO campaign. Duplicate pairs update the existing manual records. Target URLs must belong to the campaign domain.

# paths./my-seo/sites/{site_id}/keywords.post.requestBody.description
Manual keyword rows and their initial review state.

# paths./my-seo/sites/{site_id}/keywords.post.requestBody.content.application/json.schema.properties.approved.description
true saves as Approved; false saves as Recommended.

# paths./my-seo/sites/{site_id}/backlinks.get.description
Available when the authenticated account has a campaign for the site domain. search matches donor domain, page, question, or associated keyword text.

# paths./indexing/urls.get.description
Returns indexing URLs and their current crawler status for the authenticated account. url_contains and domain are independent, case-insensitive substring filters.

# paths./indexing/urls.post.description
Submits each unique URL for every selected bot and debits the account indexing balance only for persisted requests. google is the default bot; bing is also supported. This operation does not accept an idempotency key: after an ambiguous network failure, inspect GET /indexing/urls before retrying.

# paths./indexing/urls.post.requestBody.description
Complete URLs and supported crawler names.

# components.securitySchemes.bearerAuth.description
Recommended: send the API key from your Semalt account as Authorization: Bearer <your_api_key>.

# components.parameters.SiteId.description
Stable site identifier returned by a site collection endpoint.

# components.parameters.TagId.description
Site tag identifier returned by GET /site-tags.

# components.parameters.GroupId.description
Keyword group identifier returned for the selected site.

# components.parameters.Limit.description
Maximum number of site records to return in this cursor page. The API may return fewer records; use has_more and next_cursor to continue.

# components.parameters.Cursor.description
Continuation cursor from the previous response meta.next_cursor. Omit it for the first page and treat its value as opaque.

# components.parameters.SiteSearch.description
Case-insensitive substring matched against the website domain and, when present, its Search Console property URL.

# components.parameters.DomainSearch.description
Case-insensitive substring matched against assigned domains.

# components.parameters.QuerySearch.description
Case-insensitive substring matched against Search Console query text.

# components.parameters.PageSearch.description
Case-insensitive substring matched against a Search Console page URL or path.

# components.parameters.KeywordSearch.description
Text used to narrow keyword or query results. For Google SERP token search, provide at least four characters.

# components.parameters.BacklinkSearch.description
Case-insensitive substring matched against donor domain, page, question, and keyword text.

# components.parameters.SiteType.description
Return only Search Console-connected records (gsc) or manually added records (manual).

# components.parameters.AccessType.description
Filter by how this account can access the site: direct ownership, a linked account, or another available account relationship.

# components.parameters.HasSearchConsole.description
When true, return only records connected to a usable Search Console property; when false, return records without one.

# components.parameters.TagIds.description
Comma-separated site tag ids from GET /site-tags. By default a site may match any supplied tag; use tag_match=all to require every tag.

# components.parameters.TagMatch.description
How tag_ids are combined: any returns a site with at least one selected tag; all requires every selected tag.

# components.parameters.ExcludeTagIds.description
Comma-separated site tag ids. Sites carrying any excluded tag are omitted.

# components.parameters.DateFrom.description
Inclusive first calendar date of the requested analytics period in YYYY-MM-DD format. If omitted, the endpoint selects a recent default period.

# components.parameters.DateTo.description
Inclusive last calendar date of the requested analytics period in YYYY-MM-DD format. If both dates are supplied in reverse order, site summaries normalize their order.

# components.parameters.Date.description
Requested snapshot date in YYYY-MM-DD format. When the exact snapshot is unavailable, Google SERP data may come from the nearest earlier snapshot.

# components.parameters.Page.description
One-based result page number. Use 1 for the first page.

# components.parameters.PageSize.description
Maximum number of items in one page. Public API responses cap this value at 200; some product datasets may apply a lower internal cap.

# components.parameters.SortDirection.description
Sort in ascending (ASC) or descending (DESC) order using sort_by. Defaults are endpoint-specific when omitted.

# components.parameters.Metric.description
Selects the measurement written to each traffic-series item.value: clicks is Google result visits, impressions is result appearances, ctr is clicks divided by impressions as a percentage, and position is average Google result position. Each item still includes all four measurements. Default: position.

# components.parameters.GscDimension.description
Entity represented by value in the traffic series. Use query for a search phrase, page for a page URL, device for desktop/mobile/tablet, or country for a Search Console country code.

# components.parameters.DimensionValue.description
Exact query text, page URL, device name, or country code whose daily series should be returned. Its meaning is determined by dimension.

# components.parameters.Device.description
Restrict Search Console data to one device category.

# components.parameters.Country.description
Restrict Search Console data to a canonical country code returned by Search Console, usually a three-character code.

# components.parameters.GscSortBy.description
Column used to order aggregated Search Console rows.

# components.parameters.ClicksMin.description
Keep rows with at least this many clicks.

# components.parameters.ClicksMax.description
Keep rows with no more than this many clicks.

# components.parameters.ImpressionsMin.description
Keep rows with at least this many impressions.

# components.parameters.ImpressionsMax.description
Keep rows with no more than this many impressions.

# components.parameters.CtrMin.description
Keep rows with CTR at or above this percentage.

# components.parameters.CtrMax.description
Keep rows with CTR at or below this percentage.

# components.parameters.PositionMin.description
Keep rows whose average position is at least this numeric value.

# components.parameters.PositionMax.description
Keep rows whose average position is no greater than this numeric value; useful for TOP 10-style filtering.

# components.parameters.SearchEngineId.description
Numeric search-engine/location identifier returned by Semalt analytics. The default value 1 is the standard engine.

# components.parameters.PageToken.description
Opaque Google SERP keyword cursor from the previous result next_token. Omit it for the first page.

# components.parameters.PageUrl.description
Exact page URL or path previously returned by Google SERP analytics.

# components.parameters.Keyword.description
Exact keyword value previously returned by Google SERP analytics.

# components.parameters.PositionGroup.description
Convenience filter for position sets: top1 is position 1, top3 is 1–3, top10 is 1–10, and quick_wins is 4–10.

# components.parameters.PositionChange.description
Filter keywords by movement between snapshots. dynamics means no movement filter.

# components.parameters.PrimaryOnly.description
When true, return only primary Google SERP position records.

# components.parameters.SerpKeywordSortBy.description
Column used to order Google SERP keyword rows.

# components.parameters.SerpPageSortBy.description
Column used to order Google SERP page rows.

# components.parameters.SerpRankingSortBy.description
Column used to order global Google SERP rankings.

# components.parameters.QueriesMin.description
Keep pages with at least this many tracked queries.

# components.parameters.QueriesMax.description
Keep pages with no more than this many tracked queries.

# components.parameters.AveragePositionMin.description
Keep pages whose average position is at least this value.

# components.parameters.AveragePositionMax.description
Keep pages whose average position is no greater than this value.

# components.parameters.SharePercentMin.description
Keep pages whose visibility share is at least this percentage.

# components.parameters.SharePercentMax.description
Keep pages whose visibility share is no greater than this percentage.

# components.parameters.RatingMin.description
Keep pages whose rating is at least this value.

# components.parameters.RatingMax.description
Keep pages whose rating is no greater than this value.

# components.parameters.Model.description
AI model dataset to query. gpt-4.1-nano selects GPT-4.1 nano analytics; gpt-5-nano selects GPT-5 nano analytics.

# components.parameters.QueryId.description
Exact AI Analytics query id returned by a previous query result.

# components.parameters.PageId.description
Exact AI Analytics page id returned by a previous result.

# components.parameters.AiQuerySortBy.description
Column used to order AI query-position rows.

# components.parameters.AiPageSortBy.description
Column used to order AI Analytics page rows.

# components.parameters.HasCampaign.description
When true, return only sites with a campaign; when false, return only sites without one.

# components.parameters.CampaignStatus.description
Return only campaigns in this lifecycle state.

# components.parameters.KeywordSource.description
Filter campaign keywords by their source.

# components.parameters.KeywordStatus.description
Filter campaign keywords by review status.

# components.parameters.KeywordGroupId.description
Restrict results to keywords in this reusable group. Obtain the id from GET /sites/{site_id}/keyword-groups; an empty group returns no matching rows.

# components.parameters.TargetUrl.description
Exact normalized target URL assigned to a campaign keyword.

# components.parameters.DomainRating.description
Filter donor domain rating into a simple range: under40, 40_70 (40 inclusive, 70 exclusive), or 70plus.

# components.parameters.MySeoBacklinkSortBy.description
Column used to order campaign backlinks.

# components.parameters.UrlContains.description
Case-insensitive substring matched against the complete submitted URL.

# components.parameters.Domain.description
Domain or hostname substring. A supplied URL is normalized to its domain before filtering.

# components.parameters.IndexingBot.description
Filter by crawler that processes the URL.

# components.responses.BadRequest.description
The JSON request body is malformed or is not an object.

# components.responses.Unauthorized.description
The API key is missing, invalid, or inactive.

# components.responses.Forbidden.description
The account can see the site but cannot access the requested product data.

# components.responses.NotFound.description
The route or accessible site record was not found.

# components.responses.Conflict.description
The requested write conflicts with product state, such as campaign status, a protected default group, or insufficient indexing balance.

# components.responses.UnsupportedMediaType.description
A write request did not use application/json.

# components.responses.ValidationError.description
One or more public parameter values are invalid.

# components.responses.UpstreamError.description
An analytics data source could not complete the request.

# components.schemas.Site.properties.id.description
Stable identifier to use in site detail endpoints.

# components.schemas.Site.properties.gsc_site_url.description
Exact Search Console property URL when connected.

# components.schemas.Site.properties.tags.description
Personal site tags assigned to this domain.

# components.schemas.Site.properties.analytics.description
Product-specific analytics included by product collection endpoints.