01. Overview
FullMention tracks how AI assistants (such as OpenAI's ChatGPT and Google Gemini) recommend brands, websites, products, services, platforms, and related entities for real user-style recommendation queries.
The API is built around AI recommendation snapshots. Rather than forcing you to poll and track simple keywords one-by-one, you attach descriptive tags to your keywords, trigger asynchronous batch runs for matching scopes, and pull the consolidated, structured findings.
02. Authentication
Authenticate your API requests by sending your API key as a Bearer token in the standard HTTP Authorization header.
Authorization: Bearer fm_live_YOUR_API_KEY
Content-Type: application/json Live Keys
fm_live_xxxxxxxxx
Live keys execute production queries, consume real account credits, and return live data. During private beta, invitations are required to access live mode.
Test Keys
fm_test_xxxxxxxxx
Test keys let you integrate sandbox environments. Sandbox execution uses mock fixtures, does not charge Stripe accounts, and is isolated.
03. Core Concepts
Keyword
A keyword represents a search query intent in a specific geographical market context. Includes fields such as keyword, countryCode, languageCode, and location.
Tags
Strings used to label and filter keywords (e.g. client:acme, market:dk). Created dynamically when attached to keywords. Used to define execution scopes for runs.
Run
An asynchronous background job submitted to execute FullMention's recommendation engine for a filtered set of keywords. Runs are processed using provider batch pipelines to reduce cost.
Result Snapshot
The latest completed AI recommendation result for a keyword and engine. The API is snapshot-first; to capture historic timelines, integrations should fetch latest results and archive downstream.
Method Version
Every result snapshot includes a methodVersion field (e.g. "rec_snapshot_v1"). This identifies the internal prompt and extraction strategy without exposing prompts. If the version changes, results and extraction characteristics might also evolve.
04. Idempotency
To prevent duplicate creation of resources (such as duplicate runs or keywords) due to network retries, FullMention supports idempotency.
Send an Idempotency-Key header containing a unique UUID key with any mutation request (POST, PATCH, or DELETE).
curl -X POST "https://api.fullmention.com/v1/runs" \
-H "Authorization: Bearer fm_live_xxx" \
-H "Idempotency-Key: 3f6f6b8d-6f10-4bcf-9f4d-7a0a9c9e2c2a" \
-H "Content-Type: application/json" \
-d '{"tags": ["client:acme"]}' 05. Quota & Rate Limits
Quota & Credits Math
Every successful API response includes custom quota tracking headers. Quota represents monthly execution credits.
Cost Logic:
- 1 Successful Engine Execution = 1 Base Credit. A selected engine executed for a keyword only costs 1 credit if it succeeds and produces recommendation snapshot data. Failed, empty, or API provider-error executions are not charged.
- Optional OpenAI Web Fanout = +1 Fanout Credit. If web-search fanout is enabled and produces sources, it costs an additional credit. If fanout fails or is empty, only the base credit is charged.
Rate Limits
Rate limits protect API throughput volume. These are distinct from quota limits. Standard headers:
| Resource Path | Default Limits |
|---|---|
| /keywords | 60 requests/minute |
| /tags | 120 requests/minute |
| /runs | 10 requests/minute |
| /results | 60 requests/minute |
Request & Run Caps (V1)
06. Test Mode & Sandbox
FullMention provides a robust test-key integration mode. Requests initiated with a test key (fm_test_...) operate inside an isolated sandbox environment:
- Demo execution: Runs are simulated or fixture-backed (returns `executionMode: "demo"` in payloads) instead of submitting live jobs.
- Free sandbox quota: Sandbox operations do not consume live plan credits or incur payment charges.
- Public Demo Dataset: Read-only access to preset keywords and results for quick onboarding.
- Writable Sandbox: Sandbox users can write, edit, delete, and trigger runs, isolated to their test key. Sandbox data may be reset nightly.
07. Tag Filtering
List endpoints that accept tag filters use OR matching by default:
This returns keywords carrying either the client:acme tag OR the market:dk tag.
To request AND matching, supply the tagMode=and parameter:
This matches only keywords that hold BOTH tags simultaneously.
08. Keywords Reference
Create, retrieve, update, and soft-delete tracked search queries.
/keywords
List all keywords created in your account. Supports cursor pagination.
Query Parameters
| Name | Type | Description |
|---|---|---|
| tags | string | Comma-separated tags scope filter. |
| tagMode | string | Match logic: and or or. |
| limit | number | Max records per page. Defaults to 100. |
| cursor | string | Cursor offset from meta.nextCursor. |
curl "https://api.fullmention.com/v1/keywords?tags=client:acme&limit=1" \
-H "Authorization: Bearer fm_live_xxx" /keywords
Add one or more keywords. Creating keywords is idempotent; duplicate intents in the same market return the existing record.
curl -X POST "https://api.fullmention.com/v1/keywords" \
-H "Authorization: Bearer fm_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"keywords": [
{
"keyword": "seo tool",
"country": "Denmark",
"countryCode": "DK",
"language": "Danish",
"languageCode": "da",
"location": "Copenhagen",
"engines": ["openai"],
"tags": ["client:acme", "market:dk"]
}
]
}' /keywords/:keywordId
Update specific fields or tags. Changing intent details affects future runs.
curl -X PATCH "https://api.fullmention.com/v1/keywords/kw_12345" \
-H "Authorization: Bearer fm_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"keyword": "seo software",
"tags": ["client:acme", "priority:high"]
}' /keywords/:keywordId
Soft-deactivates a keyword, hiding its historic results and de-scheduling it from future runs.
curl -X DELETE "https://api.fullmention.com/v1/keywords/kw_12345" \
-H "Authorization: Bearer fm_live_xxx" 10. Runs Reference
Submit cost estimates and trigger asynchronous double-engine processing jobs.
/runs/estimate
Calculate keyword scopes and credit metrics for a tag filter combination without starting a job.
curl -X POST "https://api.fullmention.com/v1/runs/estimate" \
-H "Authorization: Bearer fm_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"tags": ["client:acme", "market:dk"],
"tagMode": "or",
"options": {
"fanout": true
}
}' /runs
Start an asynchronous batch execution. Only one active run with overlapping scope is permitted. Returns 409 Conflict if a matching run is processing.
curl -X POST "https://api.fullmention.com/v1/runs" \
-H "Authorization: Bearer fm_live_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: run_req_12345" \
-d '{
"tags": ["client:acme", "market:dk"],
"tagMode": "or",
"options": {
"fanout": true
}
}' /runs
List historical runs created in your workspace.
curl "https://api.fullmention.com/v1/runs?status=success&limit=1" \
-H "Authorization: Bearer fm_live_xxx" /runs/:runId
Check status, timeline stamps, and results counters of a particular run.
curl "https://api.fullmention.com/v1/runs/run_555" \
-H "Authorization: Bearer fm_live_xxx" 11. Results Reference
Fetch processed structured findings and full web source attribution references.
/results/latest
Get the latest completed snapshot records. OpenAI results include a small preview of web-search sources (fanoutSourcesPreview) for dashboard visual utility; to obtain the full list of web links, use the sub-resource endpoint.
curl "https://api.fullmention.com/v1/results/latest?tags=client:acme&engine=openai&limit=1" \
-H "Authorization: Bearer fm_live_xxx" /results/:resultId/fanout-sources
Fetch complete, paginated lists of evolved web search sources referenced by OpenAI batch runs. Returns 422 fanout_not_enabled if the source run opted out of fanout.
curl "https://api.fullmention.com/v1/results/res_123/fanout-sources?limit=1" \
-H "Authorization: Bearer fm_live_xxx" 12. Webhooks Reference
Subscribe to automated completion events to bypass heavy API polling loops.
Configure HTTP endpoint endpoints to consume push notification hooks when asynchronous jobs succeed, fail, or credit balances deplete.
Supported Event Types
run.completed- Run finished and results are ready.run.failed- Run encountered unexpected fatal pipeline exceptions.quota.low- Remaining monthly credit allowance fell below threshold boundaries.
{
"id": "evt_123",
"type": "run.completed",
"createdAt": "2026-05-13T12:18:22Z",
"data": {
"runId": "run_555",
"status": "success",
"failureSummary": {
"failedEngineExecutions": 3,
"emptyEngineExecutions": 2
}
}
} 13. Recommendation Object
Each snapshot result contains an array of normalized recommendation objects structured sequentially according to extracted recommendation ranking.
| Field | Type | Description |
|---|---|---|
| rank | number | Extraction order sequence rank, beginning at 1. |
| name | string | Captured Brand, Product, Platform, or Vendor name. |
| type | string |
One of: brand, product, service, website, tool, platform, provider, category, marketplace, or local_provider.
|
| description | string | Brief context statement regarding the recommendation. |
| popularProductsOrVariations | string[] | Identified plans, sub-products, or key featured features. |
| onlineAvailability | string[] | Extracted signup page URLs, retailers, or directories. |
| relatedEntities | string[] | Alternatives or related brands extracted concurrently. |
| websites | string[] | Normalized official domains compiled by mapping signals. |
14. Fanout Source Object
Fanout records represent external web publications, citations, reviews, and links analyzed by web-search-enabled engines to compile recommendation results.
| Field | Type | Description |
|---|---|---|
| rank | number | Observation index order inside the returned fanout array. |
| id | string | Unique row ID assigned in paginated listings. |
| url | string | Exact target URL with tracking parameters stripped where possible. |
| domain | string | Normalized clean root publisher domain (e.g. stripe.com). |
| title | string | null | Document title when captured. |
| query | string | null | Underlying engine search query triggered to surface this source. |
| sourceType | string | Observation origin origin. Defaults to web_search. |
15. Errors Reference
API failures return standard HTTP status code bounds accompanied by descriptive structured error envelopes.
{
"error": {
"code": "quota_exceeded",
"message": "Insufficient quota to execute this run.",
"requestId": "req_abc123"
}
} Common Error Codes
16. Recommended Integration Flow
Maximize execution efficiency and avoid unnecessary resource consumption by building your applications around this asynchronous pipeline:
Add Tracked Keywords
Post keyword intents categorized using filters (e.g. client:acme, market:dk).
Estimate Run Cost
Before initiating jobs, query the estimate endpoint to ensure matching keyword counts and credit capacities align.
Trigger Batch Job
Post keyword tags to start asynchronous processing. Returns a run ID immediately.
Poll or Receive Webhooks
Poll the run status endpoint with reasonable backoff, or subscribe endpoint handlers to run.completed webhooks.
Fetch Structured Snapshots
Once successfully completed, query the latest snapshots endpoint to retrieve structured rankings and competitor mappings.