brandfound. API
API for tracking brand mentions in AI assistants (ChatGPT, Gemini, Claude, Perplexity). Manage companies, products, competitors, queries, mentions, and analytics.
Base URL
https://app.brandfound.ai/api/v1Playground
Click in the request panel to open the interactive Playground. Pick an API key, set parameters, and send the request directly from the docs.
120 / min60 / minUNAUTHORIZEDInvalid authorizationFORBIDDENInsufficient permissionsNOT_FOUNDResource not foundVALIDATION_ERRORValidation errorRATE_LIMIT_EXCEEDEDRate limit exceededINTERNAL_ERRORInternal errorWhat is new in version 1.2
Public method URLs have not changed, backward compatibility is preserved.
Analytics responds again
Methods of the Analytics, Links and Advertising sections returned a 500 error because of an issue on our side. Fixed, no action needed from you.
Query state is visible
The query list now has answersCount, the actual list of assistants in providers and a summary queue.status. Previously providers was always empty.
Polling queue
queries/queue and queue/summary show what is being polled and what it costs. Polls stopped for lack of FoxCoin are resumed via queue/resume: they do not restart on their own.
Balance and spending
billing/balance returns the balance and prices of all operations, billing/transactions returns the charge history with the related query.
Answer language
The language field now sets the answer language. Works in ChatGPT, Gemini, Perplexity and DeepSeek.
Assistant directory
The sources method returns available assistants and marks the ones used by default.
Monitoring
A query can be put on recurring polling with its own schedule. This used to be available in the web app only.
AI traffic
Site visits coming from AI answers, visitor behaviour, funnel and goals based on Yandex.Metrica data.
Commerce
Product cards in AI answers and the catalogue to match them against.
Company is now required
The links, links/filter-options, analytics/links/top-domains, analytics/competitors/preview and advertising methods require companyId. Without it the response used to merge all companies of the account.
Authentication
All API requests require authorization. Create an API key in Settings → API keyssection. Keys have the prefix gfx_.
Pass the key in the Authorization header of each request.
The web app automatically uses the session-token cookie. No extra setup is required.
Workspaces
Workspaces (teams). One OAuth token can access every workspace available to the user: their own plus ACCEPTED TeamMember memberships. The active workspace is stored in ApiKey.activeAccountId. Switching persists and affects all MCP clients using this key on their next request. Access is checked on every request. If membership is lost, middleware silently falls back to the accountId issued at OAuth without returning 401. Switching also resets preferredCompanyId because it belongs to the previous workspace.
List accessible workspaces
/api/v1/workspacesReturns every workspace (accountId) accessible to the current user: their own plus ACCEPTED TeamMember memberships. isCurrent: true marks the workspace currently used by the API key, including the activeAccountId override.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/workspacesSuccessful response
Switch the API key’s active workspace
/api/v1/workspaces/switchUpdates ApiKey.activeAccountId. The change persists and applies to ALL subsequent requests using this key, including other MCP clients. accountId=null clears the override and restores the token’s accountId. Also resets preferredCompanyId to null because it belongs to the previous workspace. API key authentication only.
Request body
accountIdstringrequiredWorkspace UUID to switch to. null clears the active override and restores the accountId issued at OAuth.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED403application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/workspaces/switchSuccessful response
Companies
Manage companies
List companies
/api/v1/companiesReturns the user’s companies with products, competitors, and keywords.
Query parameters
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
sortBystring= createdAtcreatedAtupdatedAtnamelastUsedAtsortOrderstring= descSort order
ascdescsearchstringSearch query (case-insensitive)
categoryIdstring (uuid)Filter by category
countrystringFilter by country
createdAtFromstring (date-time)Creation date range start (ISO 8601)
createdAtTostring (date-time)Creation date range end (ISO 8601)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/companiesSuccessful response
Create company
/api/v1/companiesCreates a company. The limit depends on the subscription plan.
Request body
namestringrequireddescriptionstringurlstringcategoryIdstringcountrystringISO 3166-1 alpha-2 (‘AE’). Legacy names (‘russia’) are accepted and normalized. Prefer regionTargets; this field is legacy.
synonymsstring[]Synonyms/alternative names (maximum 20)
regionTargetsobject[]Measurement countries and cities. COMPLETE state: old targets are recreated. The primary target sets the country and language for query generation.
defaultLanguageIdstringGenerated query language (GET /api/v1/geo/languages).
defaultResponseLanguageIdstringLanguage in which the AI model should respond.
defaultLocalestringBCP-47, e.g. ‘ar-AE’.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/companiesSuccessful response
Get company
/api/v1/companies/{id}Returns full company details, including products, competitors, and keywords.
Query parameters
idstring (uuid)requiredCompany ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/companies/{id}Successful response
Update company
/api/v1/companies/{id}Partially updates a company. Send only the fields to change. Regional targeting: regionTargets define measurement countries and cities. The primary target determines the country and language for query generation (POST /api/v1/queries/autogenerate). Get countryId / cityId from GET /api/v1/geo/countries and /api/v1/geo/cities, and defaultLanguageId from /api/v1/geo/languages. regionTargets in the body represents the COMPLETE state: existing targets are recreated. isAutoGenerationEnabled is deprecated: enabling it (true) is IGNORED. This flag belonged to the removed scheduler that generated queries and immediately queued paid polling.
Query parameters
idstring (uuid)requiredCompany ID
Request body
namestringdescriptionstringurlstringcategoryIdstringcountrystringISO 3166-1 alpha-2 (‘AE’). Legacy names (‘russia’) are accepted and normalized. Prefer regionTargets; this field is legacy.
synonymsstring[]isAutoGenerationEnabledbooleanDEPRECATED and IGNORED when true. This flag belonged to the removed scheduler that combined query generation and paid polling. To generate without polling, use POST /api/v1/queries/autogenerate.
regionTargetsobject[]Measurement countries and cities. COMPLETE state: old targets are recreated. The primary target sets the country and language for query generation.
defaultLanguageIdstringGenerated query language (GET /api/v1/geo/languages).
defaultResponseLanguageIdstringLanguage in which the AI model should respond.
defaultLocalestringBCP-47, e.g. ‘ar-AE’.
autogenQueryTypesstring[]Query types for generation. Defaults to commercial, informational, comparative, reputational. Removing comparative excludes comparative queries (‘X vs Y’) from generated suggestions.
autogenQueriesPerRunintegerResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/companies/{id}Successful response
Archive company
/api/v1/companies/{id}Archives a company. Data is retained, but the company is hidden from lists.
Query parameters
idstring (uuid)requiredCompany ID
Responses
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/companies/{id}Successfully deleted
List industries
/api/v1/companies/categoriesValid categoryId values for company creation and updates.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/companies/categoriesSuccessful response
Products
Manage products
List products
/api/v1/productsReturns products with their associated companies, keywords, and competitors.
Query parameters
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
sortBystring= createdAtcreatedAtupdatedAtnamesortOrderstring= descSort order
ascdesccompanyIdstring (uuid)Filter by company
searchstringSearch query (case-insensitive)
createdAtFromstring (date-time)Creation date range start (ISO 8601)
createdAtTostring (date-time)Creation date range end (ISO 8601)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/productsSuccessful response
Create product
/api/v1/productsCreates a product associated with a company.
Request body
namestringrequiredcompanyIdstringrequireddescriptionstringurlstringResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/productsSuccessful response
Get product
/api/v1/products/{id}Returns full product details, including keywords and competitors.
Query parameters
idstring (uuid)requiredProduct ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/products/{id}Successful response
Update product
/api/v1/products/{id}Partially updates a product.
Query parameters
idstring (uuid)requiredProduct ID
Request body
namestringdescriptionstringurlstringResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/products/{id}Successful response
Archive product
/api/v1/products/{id}Archives a product. Data is retained, but the product is hidden from lists.
Query parameters
idstring (uuid)requiredProduct ID
Responses
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/products/{id}Successfully deleted
Competitors
Manage competitors
List competitors
/api/v1/competitorsReturns competitors with their associated companies, products, and keywords.
Query parameters
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
sortBystring= createdAtcreatedAtupdatedAtnamesortOrderstring= descSort order
ascdesccompanyIdstring (uuid)Filter by company
productIdstring (uuid)Filter by product
searchstringSearch query (case-insensitive)
createdAtFromstring (date-time)Creation date range start (ISO 8601)
createdAtTostring (date-time)Creation date range end (ISO 8601)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/competitorsSuccessful response
Create competitor
/api/v1/competitorsCreates a competitor associated with a company or a specific product.
Request body
namestringrequiredcompanyIdstringrequiredproductIdstringurlstringResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/competitorsSuccessful response
Get competitor
/api/v1/competitors/{id}Returns full competitor details with keywords.
Query parameters
idstring (uuid)requiredCompetitor ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/competitors/{id}Successful response
Update competitor
/api/v1/competitors/{id}Updates a competitor’s name and/or URL.
Query parameters
idstring (uuid)requiredCompetitor ID
Request body
namestringurlstringResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/competitors/{id}Successful response
Archive competitor
/api/v1/competitors/{id}Archives a competitor. Data is retained, but the competitor is hidden from lists.
Query parameters
idstring (uuid)requiredCompetitor ID
Responses
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/competitors/{id}Successfully deleted
Keywords
Intents (keywords): create, rename, archive/delete, restore, and bulk attach/detach to companies, products, or competitors
List intents
/api/v1/keywordsReturns intents (keywords) in the current workspace. Filter by one target: companyId | productId | competitorId. state controls archive filtering: active (default), archived, or all.
Query parameters
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
sortBystring= createdAtcreatedAtnamesortOrderstring= descSort order
ascdescstatestring= activeLifecycle filter: active (not archived, default), archived (archived only), or all.
activearchivedallsearchstringCase-insensitive substring search on name.
companyIdstring (uuid)Only intents actively associated with this company.
productIdstring (uuid)Only intents actively associated with this product.
competitorIdstring (uuid)Only intents actively associated with this competitor.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/keywordsSuccessful response
Create or reuse an intent
/api/v1/keywordsFind-or-create by (name, userId). Existing intents are reused and restored if archived. Optional attach: { companyId | productId | competitorId }, exactly one, associates the intent with a target in the same transaction.
Request body
namestringrequiredattachobjectTarget for attach/detach. Must contain EXACTLY ONE of the fields.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/keywordsSuccessful response
Get an intent
/api/v1/keywords/{id}Returns an intent with active associations to companies, products, and competitors.
Query parameters
idstring (uuid)requiredResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/keywords/{id}Successful response
Rename an intent
/api/v1/keywords/{id}Only name can be edited. Archived intents cannot be renamed; restore them first.
Query parameters
idstring (uuid)requiredRequest body
namestringrequiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/keywords/{id}Successful response
Archive or delete an intent
/api/v1/keywords/{id}By default, archives (soft-deletes) the intent and all its associations; reversible through POST /restore. ?permanent=true deletes the intent from the database and requires it to be archived or have archived associations. ?dryRun=true returns an impact report without performing the operation.
Query parameters
idstring (uuid)requiredpermanentboolean= falseIf true, permanently deletes from the database. Requires an archived state.
dryRunboolean= falseIf true, returns a report without side effects.
Responses
204Successfully deleted
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/keywords/{id}Successful response
Restore an archived intent
/api/v1/keywords/{id}/restoreClears archivedAt on the keyword and its archived associations whose parent entities (company / product / competitor) still exist. Associations to deleted targets remain archived.
Query parameters
idstring (uuid)requiredResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/keywords/{id}/restoreSuccessful response
Attach intents in bulk
/api/v1/keywords/attachFor each name, finds or creates by (name, userId), then ensures an active association with the target. Restores archived associations. Target requires EXACTLY ONE of companyId / productId / competitorId.
Request body
targetobjectrequiredTarget for attach/detach. Must contain EXACTLY ONE of the fields.
namesstring[]requiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/keywords/attachSuccessful response
Detach intents in bulk
/api/v1/keywords/detachArchives active keyword↔target associations. The intent itself remains and can be associated with other targets. Target requires EXACTLY ONE of companyId / productId / competitorId.
Request body
targetobjectrequiredTarget for attach/detach. Must contain EXACTLY ONE of the fields.
keywordIdsstring[]requiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/keywords/detachSuccessful response
Queries
Manage queries to AI assistants
List queries
/api/v1/queriesReturns queries to AI assistants with response counts. Supports advanced filters for sentiment, clusters, regions, favorites, search scope, and sentiment metric ranges. Read polling status from queue.status and answersCount. providers contains the AI models actually queried. For individual run details, use GET /api/v1/queries/queue.
Query parameters
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
sortBystring= createdAtcreatedAttextupdatedAtsortOrderstring= descSort order
ascdesccompanyIdstring (uuid)Filter by company
productIdstring (uuid)Filter by product
typestringQuery type (general, comparative, negative, etc.). Supports arrays: ?type=comparative&type=neutral
originstringQuery origin. Supports arrays: ?origin=manual&origin=auto
manualautohasAnswersstringWhether responses exist
truefalselanguagestringQuery language (ru, en, etc.). Supports arrays: ?language=ru&language=en
searchTextstringSearch query text
providerstringFilter by the response’s AI provider
sourceIdstringFilter by response source ID. Supports arrays: ?sourceId=id1&sourceId=id2
labelSlugstringFilter by cluster/label slug
regionstringQuery region. Supports arrays: ?region=RU®ion=US
isFavoritestringFavorite queries only
truefalsesentimentstringFilter by mention sentiment in responses
positiveneutralnegativesearchFieldstring= querysearchText scope: query text, responses, or sources
queryanswersourceslabelFilterModestring= orCluster filter logic: any (or) or all (and)
orandlabelstringCluster slug. Supports arrays: ?label=slug1&label=slug2
createdAtFromstring (date-time)Creation date range start (ISO 8601)
createdAtTostring (date-time)Creation date range end (ISO 8601)
showArchivedstringInclude archived queries (default: false)
truefalseResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/queriesSuccessful response
Create query
/api/v1/queriesCreates a query and, by default, immediately queues polling. Paid: each answer received from each AI model costs FoxCoin (prices in GET /api/v1/billing/balance). Polling five models costs five answers. Send dispatch: false to create a query without spending FoxCoin. Choose models using providers (slugs from GET /api/v1/sources). If omitted, account defaults are used; an unconfigured account uses only ChatGPT. For bulk creation with clusters, use POST /api/v1/queries/setup. Set geography through region (ISO 3166-1 alpha-2) and language; if region is omitted, the company country is used. geoOverride and resolvedGeoSnapshot are READ-ONLY snapshots computed by the server for clustered queries with geographic targets. They are not accepted in POST bodies (strict validation: unknown field → 400). Check the response’s dispatch field: dispatched=false with a nonempty error means the query was created but polling did not start.
Request body
textstringrequiredcompanyIdstringrequiredproductIdstringtypestring= neutralLegacy values negative and general are accepted: negative → reputational, general → neutral.
neutralcommercialinformationalcomparativereputationalbrandedlanguagestring= ruISO 639-1 response language code (ru, en, ar, hi, vi, ms, ...). Sets the required AI response language by adding an explicit instruction using its directory name. Defaults to ru.
regionstringQuery country, ISO 3166-1 alpha-2 (AE, SA, RU). Defaults to the company’s primary regionTarget, then RU. Legacy names (‘russia’) are accepted and normalized. Does not geographically target answers; used for filtering and analytics.
providersstring[]AI models to poll. If omitted, uses account defaults; an unconfigured account uses only ChatGPT.
dispatchboolean= truefalse: create a query WITHOUT queueing paid polling.
labelsstring[]Cluster names: created or reused by slug.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED402application/jsonInsufficient FoxCoin
HTTP_402404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queriesSuccessful response
Get query
/api/v1/queries/{id}Returns a query with AI responses and detected mentions.
Query parameters
idstring (uuid)requiredQuery ID
includeAnswersstring= trueInclude responses with mentions (default: true)
truefalseResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/queries/{id}Successful response
Archive query
/api/v1/queries/{id}Archives a query. Data is retained and can be restored.
Query parameters
idstring (uuid)requiredQuery ID
Responses
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/{id}Successfully deleted
Update a query
/api/v1/queries/{id}Changes a query’s text, type, language, region, product, favorite status, and clusters. Changing the text does NOT poll AI models again: existing responses remain attached. To poll again, create a new query. Strict body validation: unknown field → 400.
Query parameters
idstring (uuid)requiredRequest body
textstringtypestringneutralcommercialinformationalcomparativereputationalbrandedlanguagestringregionstringISO 3166-1 alpha-2.
productIdstringnull: detach from the product.
isFavoritebooleanlabelsstring[]COMPLETE cluster list: associations are rebuilt.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/{id}Successful response
List queued runs
/api/v1/queries/queueQuery polling state: one run for each query–AI model pair. Distinguishes still polling, failed, and paused for insufficient funds, which cannot be determined from response counts alone.
Query parameters
statusstring= queued,onHold,failedComma-separated status groups. All three by default.
companyIdstring (uuid)Limit to one company. If omitted, includes all account companies.
queryIdstring (uuid)Runs for one query
providerstringFilter by AI model
chatgptgeminiperplexitygrokdeepseekgigachatyandex_alicealice_chatgoogle_ai_modeincludeArchivedboolean= falseInclude runs for archived queries
limitinteger= 50Page size
offsetinteger= 0Offset
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/queries/queueSuccessful response
Queue summary and estimated cost
/api/v1/queries/queue/summaryRun counts, current queue cost, and FoxCoin balance in one request. Polling continues while queuedTotal > 0. onHold > 0 means insufficient funds: these runs do not resume automatically after a top-up.
Query parameters
companyIdstring (uuid)Limit to one company
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/queries/queue/summarySuccessful response
Create queries in bulk with selected AI models
/api/v1/queries/setupCreates clusters and queries in one transaction and immediately queues polling. Use providers to select AI models explicitly; if omitted, account defaults are used. To create one query, use POST /api/v1/queries, which also accepts providers. Paid: each answer received from each model costs FoxCoin (see GET /api/v1/billing/balance). Maximum 500 queries per call.
Request body
companyIdstringIf omitted, uses the key’s preferredCompanyId (see GET /api/v1/context)
clusterIdstringExisting cluster for geographic inheritance; applies to all clusters entries without their own clusterId
providersstring[]AI models to poll (slugs from GET /api/v1/sources). If omitted, account defaults are used; an unconfigured account uses ChatGPT. Selecting models through providers is also supported by POST /api/v1/queries.
clustersobject[]requiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED402application/jsonInsufficient FoxCoin
HTTP_402404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/setupSuccessful response
Resume queued runs
/api/v1/queries/queue/resumeResumes paused runs. **Why.** When FoxCoin is insufficient, a run enters ON_HOLD_NO_FUNDS. Workers do not pick up these runs, and topping up does NOT resume them. They remain paused until the scheduler moves them to CANCELLED after 45 days. Resuming is always explicit through this method. **How it happens.** Create queries with insufficient balance. Funds are checked both at queueing and execution, so some runs may be paused even if a query partially completed. Check `GET /api/v1/queries/queue/summary` → `onHold`, or the query’s `queue.status` = `on_hold_no_funds`. **402 is not a permanent rejection:** the balance does not cover the entire batch. Top up or retry with `force: true`: affordable runs will execute and the rest will pause again.
Request body
runIdsstring[]Select individual run IDs
scopestringAll paused runs
onHoldcompanyIdstringLimit scope to one company
forceboolean= falseResume even if the balance cannot cover the entire batch
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED402application/jsonInsufficient FoxCoin for the entire batch
HTTP_402404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/queue/resumeSuccessful response
Cancel queued runs
/api/v1/queries/queue/cancelCancels runs that have not started: waiting (PENDING, RETRYING) and paused runs. RUNNING runs are never changed: a worker already owns them, and cancellation would introduce a race. **When to use.** Stop unwanted bulk polling before FoxCoin is charged. Charges occur when responses arrive, so canceled runs cost nothing. Also useful for clearing paused runs you do not intend to fund. Cancellation is reversible: requeue a canceled run through `POST /api/v1/queries/queue/resume` with its `runId`.
Request body
runIdsstring[]queryIdsstring[]All cancellable runs for these queries
scopestringonHold: paused runs only; queued: active queue only
onHoldqueuedcompanyIdstringLimit scope to one company
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/queue/cancelSuccessful response
Query autogeneration
Generate query suggestions as drafts and approve them. Generation (1 FoxCoin per query) and paid AI polling (10 FoxCoin per answer) are separate steps.
Generate query suggestions without polling AI models
/api/v1/queries/autogenerateThe service generates queries and saves them as DRAFTS. AI models are NOT polled. Replaces isAutoGenerationEnabled, which inseparably combined generation and paid polling. These steps are now separate: polling starts only through POST /api/v1/query-drafts/approve. Cost: 1 FoxCoin for EACH generated query, charged for delivered drafts. Polling is charged separately: 10 FoxCoin per answer (query × model). Language and country: without language/region, uses company regional settings (regionTargets, PUT /api/v1/companies/{id}), then ru/RU. For multiple countries, send targets: one task per country, with the official language as default (AE → ar, IN → hi). Types: without types, uses Company.autogenQueryTypes, defaulting to commercial, informational, comparative, reputational. Comparative queries (‘X vs Y’) are generated only when comparative is selected AND the company has competitors. Returns 202 immediately by default and generates in the background. Read progress through GET at the same URL using clientToken. The short form (region/language/city/includeDistricts) and targets are mutually exclusive. Combining them returns 400 because a separate country’s city cannot be specified outside targets.
Request body
companyIdstringIf omitted, uses the key’s preferredCompanyId.
productIdstringcountintegerrequiredQueries to generate PER target. 1 FoxCoin per query.
typesstring[]Generated query types; count is divided equally between them. If omitted, uses Company.autogenQueryTypes, which includes comparative by default.
clustersstring[]Topics used to group queries.
userWishesstringnamestringTask name, visible in the UI and GET response.
languagestringISO 639-1. Defaults to company language. Only WITHOUT targets.
regionstringISO 3166-1 alpha-2. Defaults to the company’s primary country (regionTargets), then RU. Legacy names (‘russia’) accepted. Only WITHOUT targets.
citystringOnly WITHOUT targets.
includeDistrictsbooleanOnly WITHOUT targets.
targetsobject[]Multiple-country measurement: one task per country. Cost is the sum of all target counts. MUTUALLY EXCLUSIVE with the short form: region / language / city / includeDistricts alongside targets → 400. Inside targets, each country has its own city and language.
waitboolean= falsetrue: wait for generation to finish. For small batches only; 100+ queries take minutes.
clientTokenstringCustom task token used to retrieve progress later.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED402application/jsonInsufficient FoxCoin: required and balance in the error body
HTTP_402404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED503application/jsonQuery generation is not configured on the server
HTTP_503/api/v1/queries/autogenerateSuccessful response
Query generation task status
/api/v1/queries/autogenerateProgress of tasks started through POST /api/v1/queries/autogenerate. Poll until status = OK, then read drafts using GET /api/v1/query-drafts. Drafts from a RUNNING task cannot be approved intentionally, to avoid approving an incomplete batch.
Query parameters
runIdstring (uuid)Specific task.
clientTokenstringTask identified by the client token returned by POST.
limitinteger= 20Number of recent tasks to return.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/autogenerateSuccessful response
Stop a query generation task
/api/v1/queries/autogenerate/cancelCancellation stops unstarted batches; you pay only for drafts already delivered. The run becomes CANCELLED. Generated drafts remain available for approval.
Request body
runIdstringrequiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/queries/autogenerate/cancelSuccessful response
List query drafts
/api/v1/query-draftsStoring a draft is free and does not trigger polling. It becomes a query only through POST /api/v1/query-drafts/approve.
Query parameters
statusstringPENDING: awaiting a decision. All statuses by default.
PENDINGAPPROVEDREJECTEDEXPIREDcompanyIdstring (uuid)Filter by company.
typestringFilter by query type.
neutralcommercialinformationalcomparativereputationalbrandedpageinteger= 1Page number, starting at 1.
limitinteger= 50Page size.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/query-draftsSuccessful response
Approve drafts and run queries
/api/v1/query-drafts/approvePAID STEP: approved drafts become queries and are sent to the selected AI models at 10 FoxCoin per answer (query × model). 50 drafts × 3 models = 150 answers = 1,500 FoxCoin. First call with dryRun: true and show the estimate to the user. Idempotent: repeated calls with the same draftIds neither duplicate queries nor poll them again. Drafts from a still-running generation task are skipped (skippedRunning); wait for status = OK.
Request body
draftIdsstring[]requiredprovidersstring[]requiredAI models to poll. Each multiplies the cost.
dryRunbooleantrue: estimate only; nothing is created or charged.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED402application/jsonInsufficient FoxCoin: required and balance in the error body
HTTP_402404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/query-drafts/approveSuccessful response
Reject drafts
/api/v1/query-drafts/rejectSoft rejection: drafts remain in the database as REJECTED for billing audits. No polling occurs. Generation FoxCoin is not refunded because the queries have already been generated.
Request body
draftIdsstring[]requiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/query-drafts/rejectSuccessful response
AI answers
AI responses in bulk: links, mentions, and sentiment.
Retrieve AI responses in bulk
/api/v1/answersReplaces a GET /api/v1/queries/{id} loop: returns up to 200 answers per page with links, mentions, and sentiment. links contains parsed citations from ANY AI model. Do not confuse it with raw answer.sources: that is scraper payload, populated only for Search with Alice, and is not a citation list. brandDomainCited indicates whether the company’s website domain was cited. Mention fields: position is the CHARACTER OFFSET in the response. The array is sorted by it, so the order in which a brand is named is the mention’s RANK in the array, not its position value. sentiment (1 / 0 / -1) and sentimentScore (-1..1) come from the ENTIRE response, so all mentions within one response share them. sentimentScore = null if sentiment has not been calculated. isOurs = false identifies a competitor. Repeat array parameters: ?companyId=a&companyId=b.
Query parameters
companyIdstring[]Companies (multiple allowed).
productIdstring[]Products (multiple allowed).
queryIdstring[]Only answers to these queries.
sourceIdstring[]AI model IDs (GET /api/v1/sources).
providerstring[]AI model slugs.
typestring[]Type of the query that produced the answer.
labelstring[]Cluster slugs.
regionstring[]Query region, ISO 3166-1 alpha-2. Legacy names are also matched.
languagestring[]Query language.
createdAtFromstring (date-time)ANSWER creation date, from (ISO 8601).
createdAtTostring (date-time)ANSWER creation date, to (ISO 8601).
hasLinksbooleantrue: only answers with links; false: only answers without links.
mentionsOursbooleantrue: only answers mentioning the company’s brand.
showArchivedboolean= falsetrue: include answers to archived queries.
includestring= content,tonalityComma-separated expansions: content, links, mentions, tonality.
limitinteger= 50Page size.
offsetinteger= 0Offset.
sortBystring= createdAtSort field.
createdAtdatesortOrderstring= descSort direction.
ascdescResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/answersSuccessful response
Geo
Country, region, city, and language directories.
List countries
/api/v1/geo/countriesDirectory IDs are used for company and cluster regionTargets and defaultLanguageId; iso2 is used for the query and generation region field.
Query parameters
qstringSearch by name.
continentstringFilter by continent.
EUROPEASIANORTH_AMERICASOUTH_AMERICAAFRICAOCEANIAANTARCTICAlimitinteger= 250Maximum records.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/geo/countriesSuccessful response
List a country’s regions
/api/v1/geo/regionsRegions (states, provinces) of a specific country. Requires countryId or countryIso2.
Query parameters
countryIso2stringTwo-letter country code.
countryIdstring (uuid)Country UUID.
qstringSearch by name.
limitinteger= 100Maximum records.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/geo/regionsSuccessful response
List a country’s cities
/api/v1/geo/citiesCities of a specific country. Requires countryId or countryIso2. Use cityId in company regionTargets and cluster targets.
Query parameters
countryIso2stringTwo-letter country code.
countryIdstring (uuid)Country UUID.
regionIdstring (uuid)Region UUID.
qstringSearch by name.
limitinteger= 50Maximum records.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/geo/citiesSuccessful response
List languages
/api/v1/geo/languagesDirectory IDs are used for company and cluster regionTargets and defaultLanguageId; iso2 is used for the query and generation region field.
Query parameters
qstringSearch by name or code.
limitinteger= 200Maximum records.
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/geo/languagesSuccessful response
Query Labels
Query labels/clusters: list with an optional company filter; create with regional targeting
List query clusters
/api/v1/query-labelsReturns query labels/clusters in the current workspace with query counts. companyId limits results to clusters containing this company’s queries and calculates queryCount for that company. lite=true returns { items: [{ id, name, slug, queryCount }] } without statistics or sampleQueries.
Query parameters
companyIdstring (uuid)Company filter: only clusters containing this company’s queries; queryCount counts its queries only.
litestringlite=true returns a lightweight { items: [{ id, name, slug, queryCount }] } response without statistics.
truefalseoffsetinteger= 0Pagination offset
limitinteger= 20Records per page
qstringCase-insensitive substring search on the label name.
sortstring= queryCount:descSort in field:direction format.
queryCount:descqueryCount:ascname:ascname:desccreatedAt:desccreatedAt:asclastUsedAt:desclastUsedAt:aschasQueriesstringwith: clusters with queries only; without: empty clusters.
withwithoutminCountintegerMinimum queries per cluster.
maxCountintegerMaximum queries per cluster.
createdFromstring (date-time)Labels created on or after this date.
createdTostring (date-time)Labels created on or before this date.
lastUsedFromstring (date-time)Labels with lastUsedAt on or after this date.
lastUsedTostring (date-time)Labels with lastUsedAt on or before this date.
includestringinclude=targets also loads cluster geographic targets (country/city).
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/query-labelsSuccessful response
Create or update a regional query cluster
/api/v1/query-labelsFind-or-create by (slug, userId). If the slug exists, updates the cluster name and geographic settings, recreating its targets. Optional companyId/productId are accepted but are not currently persisted on QueryLabel.
Request body
namestringrequiredslugstringdescriptionstringcompanyIdstringproductIdstringdefaultLanguageIdstringdefaultLocalestringdefaultResponseLanguageIdstringgeoScopestringGLOBALCOUNTRYREGIONCITYinjectLocationModestringNONEAPPEND_PARENSAPPEND_NATURALPREPENDAI_REWRITEautogenStrategystringSHAREDPER_TARGETPER_TARGET_LOCALIZEDtargetsobject[]Responses
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED409application/jsonConflict: resource already exists
CONFLICT429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/query-labelsInput validation error
Mentions
View brand mentions
List mentions
/api/v1/mentionsReturns brand mentions in AI answers with full context.
Query parameters
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
sortBystring= createdAtcreatedAtpositionsentimentsortOrderstring= descSort order
ascdesctimeRangestringTime range
24h7d30d90dallcreatedAtFromstring (date-time)Creation date range start (ISO 8601)
createdAtTostring (date-time)Creation date range end (ISO 8601)
companyIdstring (uuid)Filter by company
productIdstring (uuid)Filter by product
competitorIdstring (uuid)Filter by competitor
answerIdstring (uuid)Filter by a specific response
typestringMention type
companyproductkeywordcompetitorsentimentstringSentiment
positiveneutralnegativesearchstringSearch query (case-insensitive)
isOursstringOnly our mentions (true) or competitor mentions (false)
truefalseResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/mentionsSuccessful response
Analytics
Analytics: competitors, sentiment, links, and brand visibility
Competitor analytics
/api/v1/analytics/competitorsComprehensive comparison of your company and competitors by mentions in AI assistants. Supports cluster slug, AI provider, and period filters.
Query parameters
timeRangestring= 30dTime range
24h7d30dallfromstring (date-time)Custom range start (ISO 8601)
tostring (date-time)Custom range end (ISO 8601)
companyIdstring (uuid)Company ID
productIdstring (uuid)Product ID
sourceIdstring[]AI provider IDs
labelIdstring[]Cluster/label IDs
labelSlugstringCluster slug. Array: ?labelSlug=slug1&labelSlug=slug2
labelFilterModestring= orLabel filter mode
orandincludeDemostringInclude demo data
truefalseResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/competitorsSuccessful response
Mentions preview
/api/v1/analytics/competitors/previewReturns individual AI answers with mentions for detailed analysis. Supports clusters, demo data, custom periods, and label filter modes. companyId is required to avoid combining all account companies. If omitted, the key’s preferredCompanyId is used (see GET /api/v1/context).
Query parameters
sidestringrequiredWhose side: our company or a competitor
ourcompetitorcompetitorNamestringCompetitor name (if side=competitor)
mentionTypestring= bothMention type
brandlinkbothoffsetinteger= 0Pagination offset
limitinteger= 20Records per page
timeRangestring24h7d30dallcompanyIdstring (uuid)productIdstring (uuid)sourceIdstring[]labelIdstring[]includeMentionsstringInclude mentions in the response
truefalseincludeDemostringInclude demo data
truefalselabelFilterModestring= orCluster filter logic
orandfromstring (date-time)Period start (ISO 8601)
tostring (date-time)Period end (ISO 8601)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/competitors/previewSuccessful response
Tonality analytics
/api/v1/analytics/tonalityComplete sentiment analysis of AI answers: quality metrics, timeline, problematic and best answers.
Query parameters
timeRangestring= 30d24h7d30d90dcompanyIdstring (uuid)productIdstring (uuid)queryTypestringQuery type
neutralcomparativenegativesentimentstringFilter by sentiment
positiveneutralnegativesourceIdstring[]AI providers
labelSlugstring[]Cluster/label slugs
labelFilterModestring= ororandfromstring (date-time)tostring (date-time)includeDemostringtruefalseResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/tonalitySuccessful response
Links analytics
/api/v1/analytics/linksLink analytics from AI answers: top domains, citations by provider, and timeline. Supports sentiment, cluster, query type, Impact/Overall Score threshold filters, and custom periods. companyId is required to avoid combining all account companies. If omitted, the key’s preferredCompanyId is used (see GET /api/v1/context).
Query parameters
timeRangestring24h7d30dallcompanyIdstring (uuid)productIdstring (uuid)includeDemostringtruefalselabelSlugstring[]sortDomainsBystringDomain sorting
sentimentstringFilter by sentiment
positiveneutralnegativeminImpactnumberMinimum Impact Score
minOverallnumberMinimum Overall Score
presetstringFilter preset
queryTypestringQuery type
neutralnegativecomparativelabelstringCluster slug
labelFilterModestring= orFilter logic
orandfromstring (date-time)Period start
tostring (date-time)Period end
chartOnlystringChart data only
truefalsecitationModestringCitation mode
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/linksSuccessful response
Top domains
/api/v1/analytics/links/top-domainsReturns the most cited domains in AI answers. Supports sentiment, query type, Impact/Overall Score thresholds, and demo data. companyId is required to avoid combining all account companies. If omitted, the key’s preferredCompanyId is used (see GET /api/v1/context).
Query parameters
timeRangestring24h7d30dallcompanyIdstring (uuid)productIdstring (uuid)limitinteger= 10Number of domains
includeDemostringInclude demo data
truefalsesentimentstringFilter by sentiment
positiveneutralnegativeminImpactnumberMinimum Impact Score
minOverallnumberMinimum Overall Score
queryTypestringQuery type
neutralnegativecomparativeResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/links/top-domainsSuccessful response
Brand visibility
/api/v1/analytics/brand-visibilityBrand visibility timeline compared with competitors, with configurable granularity. Supports clusters by ID and slug, AI providers, and filter logic.
Query parameters
granularitystring= dayTimeline granularity
dayweekmonthtimeRangestring24h7d30dallcompanyIdstring (uuid)productIdstring (uuid)includeDemostringtruefalsefromstring (date-time)tostring (date-time)labelIdstringCluster ID. Array: ?labelId=id1&labelId=id2
labelSlugstringCluster slug
labelFilterModestring= orFilter logic
orandsourceIdstringAI source ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/brand-visibilitySuccessful response
Citation timeline
/api/v1/analytics/links/citation-timelineDaily share of answers citing us versus competitors. Based on daily rollups, so only overall citation mode is supported: rollups do not distinguish URL citations from domain citations.
Query parameters
companyIdstring (uuid)Company. If omitted, the key’s preferredCompanyId is used
productIdstringProduct
timeRangestring24h | 7d | 30d | 90d | all
granularitystringTrend breakdown
tzstringTime zone
sourceIdstring[]Sources
labelSlugstring[]Clusters
labelFilterModestringAND | OR
includeDemobooleanInclude demo data
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/analytics/links/citation-timelineSuccessful response
Companies and products for filters
/api/v1/analytics/companies-productsAccount companies with their products for the company → product selector. companyId is NOT required: omitting it returns all companies, which is the purpose of this method.
Query parameters
companyIdstring (uuid)Limit to one company
includeDemobooleanInclude demo data
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/companies-productsSuccessful response
Links
Domains and links from AI answers
Domains and links
/api/v1/linksTwo-level table of domains and links from AI answers with sorting and filtering. companyId is required to avoid combining all account companies. If omitted, the key’s preferredCompanyId is used (see GET /api/v1/context).
Query parameters
pageinteger= 1Page number
pageSizeinteger= 50Page size
sortBystring= lastMentionedlastMentionedmentionCountanswerCountourMentionCountcompetitorMentionCountdomaintrustRankdomainLinkssortDirstring= descascdescsearchstringSearch query (case-insensitive)
searchFieldstringSearch field
domainurltitletimeRangestring24h7d30dfromstring (date-time)tostring (date-time)companyIdstring (uuid)productIdstring (uuid)sentimentstringpositiveneutralnegativequeryTypestringneutralnegativecomparativeproviderstring[]AI providers
activestringActive links only
truefalsedomainsOnlystringDomains only (no child links)
truefalsedomainstringChild links for a specific domain
labelstring[]Clusters/labels
includeDemostringtruefalseResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/linksSuccessful response
Filter options
/api/v1/links/filter-optionsReturns available provider and label filters for the links table. companyId is required to avoid combining all account companies. If omitted, the key’s preferredCompanyId is used (see GET /api/v1/context).
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/links/filter-optionsSuccessful response
Advertising
Advertising data from AI answers
Advertising data
/api/v1/advertisingAnalytics for advertising and promotional blocks in AI answers. Supports pagination, domain/URL search, cluster, promotion type and period filters, and sorting. companyId is required to avoid combining all account companies. If omitted, the key’s preferredCompanyId is used (see GET /api/v1/context).
Query parameters
timeRangestring24h7d30dallcompanyIdstring (uuid)productIdstring (uuid)includeDemostringtruefalsepageinteger= 1Page number
pageSizeinteger= 50Page size
searchstringSearch by domain or URL
searchFieldstringSearch field
domainurltitlelabelstringCluster slug. Array: ?label=slug1&label=slug2
promoTypestringPromotion block type
sortBystringSort field
sortDirstringSort direction
ascdescfromstring (date-time)Period start (ISO 8601)
tostring (date-time)Period end (ISO 8601)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/advertisingSuccessful response
Preview advertising blocks
/api/v1/advertising/previewDetails for the /api/v1/advertising summary: which promotions appeared and in which answers.
Query parameters
domainstringrequiredPromotion domain. REQUIRED; otherwise 400
companyIdstring (uuid)Company. If omitted, the key’s preferredCompanyId is used
productIdstringProduct
promoTypestringours | competitor | other
ourscompetitorothertimeRangestring24h | 7d | 30d | 90d | all
labelstring[]Clusters
labelFilterModestringAND | OR
limitinteger= 201..50
offsetinteger= 0Offset
includeDemobooleanInclude demo data
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/advertising/previewSuccessful response
Content Factory
Content factory: tasks, tags, enrichment, outline and article generation, insight detection
List tasks
/api/v1/factory/tasksReturns content factory tasks with filtering, pagination, and sorting.
Query parameters
companyIdstring (uuid)Filter by company
statusstring[]Filter by status (multiple values: ?status=TODO&status=IN_PROGRESS)
typestring[]Filter by task type (multiple values allowed)
prioritystring[]Filter by priority (multiple values allowed)
searchstringSearch task titles and descriptions
tagIdstring (uuid)Filter by tag
aiGeneratedbooleanAI-generated tasks only
sortBystring= createdAtcreatedAtupdatedAtprioritystatuspositionsortOrderstring= descSort order
ascdescoffsetinteger= 0Pagination offset
limitinteger= 20Records per page
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/factory/tasksSuccessful response
Create task
/api/v1/factory/tasksCreates a content factory task.
Request body
titlestringrequiredTask title
companyIdstringrequiredCompany ID
typestringrequiredTask type
NEW_ARTICLEOPTIMIZE_PAGECREATE_FAQCOMPARISONGUIDECASE_STUDYprioritystring= MEDIUMPriority
CRITICALHIGHMEDIUMLOWdescriptionstringTask description
targetKeywordsstring[]Target keywords (maximum 20)
targetProvidersstring[]Target AI providers
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasksSuccessful response
Get task
/api/v1/factory/tasks/{id}Returns full content factory task details.
Query parameters
idstring (uuid)requiredTask ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/factory/tasks/{id}Successful response
Update task
/api/v1/factory/tasks/{id}Partially updates a content factory task.
Query parameters
idstring (uuid)requiredTask ID
Request body
statusstringIDEABACKLOGTODOIN_PROGRESSREVIEWDONEDISMISSEDprioritystringCRITICALHIGHMEDIUMLOWtitlestringdescriptionstringtagIdsstring[]Array of tag IDs to attach
targetKeywordsstring[]targetProvidersstring[]dueDatestringTask deadline
metadataobjectCustom task metadata
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasks/{id}Successful response
Archive task
/api/v1/factory/tasks/{id}Archives a task. Data is retained and its status becomes DISMISSED.
Query parameters
idstring (uuid)requiredTask ID
Responses
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasks/{id}Successfully deleted
Enrich task
/api/v1/factory/tasks/{id}/enrichRAG search across the source database, competitor analysis, and AI recommendations.
Query parameters
idstring (uuid)requiredTask ID
Request body
topicstringrequiredTopic for enrichment
descriptionstringAdditional description
keywordsstring[]Keywords for RAG search
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasks/{id}/enrichSuccessful response
Generate plan
/api/v1/factory/tasks/{id}/planGenerates an article outline from enriched data: structure, headings, key points, and tone of voice.
Query parameters
idstring (uuid)requiredTask ID
Request body
promptstringAdditional instructions for outline generation
topicIdstringSelected topic ID (from suggest topics)
topicTitlestringTopic title
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasks/{id}/planSuccessful response
Generate article
/api/v1/factory/tasks/{id}/articleGenerates an article from an outline using SSE streaming. Content-Type: text/event-stream.
Query parameters
idstring (uuid)requiredTask ID
Request body
planIdstringOutline ID for article generation
articleLengthstring= mediumArticle length: short (~1,000 words), medium (~2,000), long (~3,500)
shortmediumlongResponses
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasks/{id}/articleUnauthorized: missing or invalid token
Content versions
/api/v1/factory/tasks/{id}/versionsReturns content versions (outlines, articles, briefs) for a task.
Query parameters
idstring (uuid)requiredTask ID
typestringFilter by content type
planarticlebriefplanIdstringFilter by outline ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/factory/tasks/{id}/versionsSuccessful response
Task analytics
/api/v1/factory/tasks/{id}/analyticsReturns task analytics: enrichment, generation, and publication statistics.
Query parameters
idstring (uuid)requiredTask ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/factory/tasks/{id}/analyticsSuccessful response
Suggest topics
/api/v1/factory/tasks/{id}/topicsGenerates 10 topics from task data.
Query parameters
idstring (uuid)requiredTask ID
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/tasks/{id}/topicsSuccessful response
List publications
/api/v1/factory/publicationsReturns content factory publications with pagination.
Query parameters
companyIdstring (uuid)Filter by company
offsetinteger= 0Pagination offset
limitinteger= 20Records per page
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/factory/publicationsSuccessful response
Detect insights
/api/v1/factory/insightsRuns detectors (15 types): content gaps, competitor wins, white space, reputation risks, and more.
Request body
companyIdstringrequiredCompany ID
insightTypestringInsight type (if omitted, runs all detectors)
CONTENT_GAPCOMPETITOR_WINWHITE_SPACEREPUTATION_RISKKEYWORD_OPPORTUNITYTRENDING_TOPICPROVIDER_BIASSEASONAL_OPPORTUNITYFAQ_OPPORTUNITYCOMPARISON_OPPORTUNITYGUIDE_OPPORTUNITYCASE_STUDY_OPPORTUNITYOPTIMIZATION_NEEDEDAUTHORITY_BUILDINGlimitintegerMaximum insights
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/insightsSuccessful response
Factory settings
/api/v1/factory/settingsReturns the user’s current content factory settings.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/factory/settingsSuccessful response
Update settings
/api/v1/factory/settingsUpdates content factory settings using deep merge.
Request body
settingsobjectrequiredSettings object to deep-merge with current settings
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/settingsSuccessful response
Get the brand card
/api/v1/factory/brand-cardReads the brand card: a tree of company Markdown documents used as knowledge for content generation. Three modes: without extra parameters, returns the entire card as Markdown (manifest → core files → linked files → remaining files; ```private blocks removed; approximately 12,000-character limit). mode=index returns the manifest and files with path, id, isCore, and outgoing links (the link graph). path=... returns one file: content with [Name](brandcard://id) links preserved verbatim, plus links resolving each reference to a path.
Query parameters
companyIdstring (uuid)requiredCompany ID
modestringindex: return the manifest and file list instead of the full card
indexpathstringFile path from the index (e.g. "main / settings.md"); returns one file. Case-insensitive
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/factory/brand-cardSuccessful response
Create or update a brand card file
/api/v1/factory/brand-cardCreates or fully overwrites a brand card file by path. Missing folders are created automatically; .md is added if no extension is supplied. To reference another card file, insert [Name](brandcard://<id from index>) in Markdown. References use IDs, survive moves and renames, and increase the target file’s generation priority. Preserve existing brandcard:// links verbatim when editing. Wrap personal notes and options in a ```private block so they are not sent to AI models.
Request body
companyIdstringrequiredCompany ID
pathstringrequiredFile path with segments separated by "/", e.g. "products / pricing.md"
contentstringrequiredComplete file Markdown (replaces current content)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/brand-cardSuccessful response
Delete a brand card file or folder
/api/v1/factory/brand-cardDeletes a brand card file or folder by path; folders are deleted recursively. Protected files (instruction.md, README.md, core files) cannot be deleted; edit them through POST. After file deletion, references become dangling: removed from links in the index, returned with path=null when reading a file.
Query parameters
companyIdstring (uuid)requiredCompany ID
pathstringrequiredFile or folder path (as shown in the index)
Responses
204Successfully deleted
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/factory/brand-cardSuccessful response
Balance and spending
FoxCoin balance and transaction history
FoxCoin balance and pricing
/api/v1/billing/balanceBalance, turnover, and operation prices. The wallet is shared by the account: team members spend the owner’s balance. Prices are returned here to avoid hardcoding them in integrations.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/billing/balanceSuccessful response
Transaction history
/api/v1/billing/transactionsWallet transaction log. For response charges, query identifies the query being charged.
Query parameters
typestringFilter by operation type
ANSWER_CHARGEQUERY_GENERATIONBRAND_CARD_GENERATIONTASK_ENRICHMENTARTICLE_GENERATIONCONTENT_PLANTOPIC_SUGGESTIONFACT_CHECKTOPUPBONUSREFUNDMANUAL_ADJUSTMENTSUBSCRIPTION_CREDITAPI_CALL_FREEfromstring (date-time)Window start, ISO date (inclusive)
tostring (date-time)Window end, ISO date (inclusive)
limitinteger= 50Page size
offsetinteger= 0Offset
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/billing/transactionsSuccessful response
Reference data
Reference data and key context
List AI models
/api/v1/sourcesAvailable AI assistants and account defaults. value is accepted by providers in POST /api/v1/queries/setup. Names outside this list are silently discarded when queueing.
Query parameters
includeUnpollableboolean= falseInclude claude (legacy queue; not polled in this pipeline)
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/sourcesSuccessful response
Get API key context
/api/v1/contextStart an integration here: the key’s owning account, permissions, accessible companies and products, and default company.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/contextSuccessful response
AI traffic
Website visits from AI answers (Yandex Metrika)
AI traffic
/api/v1/analytics/metrika/ai-trafficWebsite visits from AI answers: visits from each model and changes over time. Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
timeRangestring24h | 7d | 30d | 90d | all
fromstringPeriod start, ISO date
tostringPeriod end, ISO date
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/ai-trafficSuccessful response
Visitors from AI models
/api/v1/analytics/metrika/visitorsAI-sourced visits and on-site behavior: page depth, goals, and returning visits. Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
timeRangestring24h | 7d | 30d | 90d | all
fromstringPeriod start, ISO date
tostringPeriod end, ISO date
hasGoalsbooleanOnly visits with completed goals
includeSyntheticbooleanInclude synthetic traffic
pvMinintegerMinimum page views
pvMaxintegerMaximum page views
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/visitorsSuccessful response
AI traffic funnel
/api/v1/analytics/metrika/traffic-funnelThe path from an AI answer click to a conversion. Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
timeRangestring24h | 7d | 30d | 90d | all
fromstringPeriod start, ISO date
tostringPeriod end, ISO date
hasGoalsbooleanOnly visits with completed goals
includeSyntheticbooleanInclude synthetic traffic
pvMinintegerMinimum page views
pvMaxintegerMaximum page views
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/traffic-funnelSuccessful response
Mentions and traffic correlation
/api/v1/analytics/metrika/correlationCompares brand mention trends with actual visit trends: does increased visibility lead to more traffic? Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
companyIdstring (uuid)Company. If omitted, the key’s preferredCompanyId is used
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
timeRangestring24h | 7d | 30d | 90d | all
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/correlationSuccessful response
Metrika goals
/api/v1/analytics/metrika/goalsCounter goal directory explaining the hasGoals parameter used by other methods. Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
includeInactivebooleanInclude inactive goals
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/goalsSuccessful response
Synthetic traffic summary
/api/v1/analytics/metrika/synthetic/summaryShare of bot and nonorganic visits to prevent distortion of AI traffic analysis. Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
timeRangestring24h | 7d | 30d | 90d | all
fromstringPeriod start, ISO date
tostringPeriod end, ISO date
filterstringClassification filter
hasGoalsbooleanOnly visits with completed goals
pvMinintegerMinimum page views
pvMaxintegerMaximum page views
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/synthetic/summarySuccessful response
List synthetic visits
/api/v1/analytics/metrika/synthetic/listPaginated summary details: individual visits with synthetic traffic indicators. Account-scoped: another account’s integrationId is ignored. Empty results usually mean Metrika is not connected; check /api/v1/integrations/metrika/status.
Query parameters
integrationIdstring (uuid)Metrika counter. If omitted, all connected account counters
timeRangestring24h | 7d | 30d | 90d | all
fromstringPeriod start, ISO date
tostringPeriod end, ISO date
filterstringClassification filter
qstringSearch
qScopestringSearch scope
hasRevenuebooleanWith revenue only
returningOnlybooleanReturning visitors only
pageintegerPage
pageSizeintegerPage size
sortBystringSort field
sortOrderstringasc | desc
hasGoalsbooleanOnly visits with completed goals
pvMinintegerMinimum page views
pvMaxintegerMaximum page views
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/analytics/metrika/synthetic/listSuccessful response
Connected counters
/api/v1/integrations/metrika/listStart working with AI traffic here: returns integrationId for the other methods in this section.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/integrations/metrika/listSuccessful response
Integration status
/api/v1/integrations/metrika/statusWhether Metrika is connected, when it last synced, and whether access has expired. Explains empty results from this section’s methods.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/integrations/metrika/statusSuccessful response
Commerce
Product cards in AI answers
Commerce analytics
/api/v1/analytics/commerceProduct cards shown by AI models alongside their answers. view=summary: share of answers with cards and trends by model; sellers: top sellers and domains; brands: our brand’s cards versus competitors; cards: paginated list.
Query parameters
viewstring= summarysummary | sellers | brands | cards
summarysellersbrandscardscompanyIdstring (uuid)Company. If omitted, the key’s preferredCompanyId is used
productIdstring[]Multiple values allowed
timeRangestring24h | 7d | 30d | 90d | all
granularitystringTrend breakdown
tzstringTime zone
labelIdstring[]Clusters
labelSlugstring[]Cluster slugs
labelFilterModestringAND | OR
sourceIdstring[]Sources
queryTypestring[]Query types
includeDemobooleanInclude demo data
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/analytics/commerceSuccessful response
Tracked products
/api/v1/commerce/productsProduct catalog for matching cards in responses. Without it, Commerce shows sellers and domains but cannot compare our products against competitors.
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/commerce/productsSuccessful response
Add a product
/api/v1/commerce/productsResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/commerce/productsSuccessful response
Monitoring
Recurring query polling on a schedule
List monitored queries
/api/v1/favorite-queriesQueries scheduled for recurring polling.
Query parameters
searchstringSearch text
activebooleanEnabled only
Responses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED/api/v1/favorite-queriesSuccessful response
Start monitoring a query
/api/v1/favorite-queriesRegular POST /api/v1/queries polls AI models ONCE. Recurring polling is a separate entity created here. Creating a record does not start polling. Set the schedule in a second step through POST /api/v1/favorite-queries/{id}/assignments. Every scheduled poll is paid: 10 FoxCoin per answer from EACH model. A 60-minute interval across three models means 72 answers per day. With insufficient funds, runs pause and do not resume automatically (POST /api/v1/queries/queue/resume).
Request body
textstringrequiredtypestringrequiredcompanyIdstringproductIdstringlanguagestring= ruregionstring= RUisActiveboolean= truetagsstring[]Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/favorite-queriesSuccessful response
Get a monitoring entry
/api/v1/favorite-queries/{id}Query parameters
idstring (uuid)requiredResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/favorite-queries/{id}Successful response
Update a monitoring entry
/api/v1/favorite-queries/{id}Text, company, tags, isActive. Set isActive: false to stop polling without deleting the record.
Query parameters
idstring (uuid)requiredResponses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/favorite-queries/{id}Successful response
Stop monitoring a query
/api/v1/favorite-queries/{id}Deletes the record and schedule: no further polling occurs. Existing answers and mentions remain; they belong to the query, not the subscription.
Query parameters
idstring (uuid)requiredResponses
204Successfully deleted
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/favorite-queries/{id}Successful response
Get the polling schedule
/api/v1/favorite-queries/{id}/assignmentsQuery parameters
idstring (uuid)requiredResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND/api/v1/favorite-queries/{id}/assignmentsSuccessful response
Set the polling schedule
/api/v1/favorite-queries/{id}/assignmentsThis is where recurring polling starts: a record without a schedule does nothing. Each record has one schedule; calling again replaces it. Every scheduled poll is paid: 10 FoxCoin per answer from EACH model. A 60-minute interval across three models means 72 answers per day. With insufficient funds, runs pause and do not resume automatically (POST /api/v1/queries/queue/resume).
Query parameters
idstring (uuid)requiredRequest body
providersstring[]requiredList: GET /api/v1/sources
frequencyMinutesintegerrequiredPolling interval
isEnabledboolean= truePause without deleting the schedule
timezonestring= Europe/MoscowTime zone used to interpret daysOfWeek and hoursWindow
daysOfWeekinteger[]1..7; empty means every day
hoursWindowobjectHours outside which polling does not run
modelobjectAI model → model variant mapping
Responses
200Successful response
400application/jsonInput validation error
VALIDATION_ERROR401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/favorite-queries/{id}/assignmentsSuccessful response
Run a query now
/api/v1/favorite-queries/{id}/run-nowExtra polling run without waiting for or shifting the schedule. Standard charges apply.
Query parameters
idstring (uuid)requiredResponses
200Successful response
401application/jsonUnauthorized: missing or invalid token
UNAUTHORIZED404application/jsonResource not found
NOT_FOUND429application/jsonRate limit exceeded (IP: 120 req/min, per user: 60 req/min)
RATE_LIMIT_EXCEEDED/api/v1/favorite-queries/{id}/run-nowSuccessful response