Docs
API reference
Using WooCommerce? You don't need the API: the AnswerEng for WooCommerce plugin does all of this for you. The API is for connecting other platforms or building your own reporting.
Authentication
Every request needs your API key in the x-api-key header. Get a free key from the sign-up form; it arrives by email. Keep it secret, and send it only from your server, never from a browser.
curl https://api.answereng.io/stores \
-H "x-api-key: YOUR_API_KEY"
Stores and store keys
A store is one catalog that AnswerEng measures. You name it with a store key of your choice, such as your shop's domain (shop.example.com). Your first catalog push with a new store key creates the store. Your plan sets how many stores you can have: one on Free and Starter, three on Pro.
Send your catalog
POST/catalog
Sends your whole catalog. Each push replaces the store's previous catalog, so always send every product you want measured. Up to 5,000 products per push.
curl -X POST https://api.answereng.io/catalog \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"store_key": "shop.example.com",
"brand_names": ["Acme Outdoor"],
"competitors": ["Merrell", "Salomon"],
"products": [
{
"sku": "ACME-TRAIL-2",
"title": "Acme Trail 2 Hiking Boot",
"description": "Waterproof leather hiking boot with Vibram sole.",
"price": 139.99,
"category": "hiking-boots",
"attributes": {"waterproof": "yes", "weight_g": "540"}
}
]
}'
| Field | Type | Notes |
|---|---|---|
store_key | string | Required. |
brand_names | string[] | Required, at least one. Your brand as shoppers know it. |
competitors | string[] | Optional. Used for share of voice. |
products | object[] | Required, at least one. |
products[].sku | string | Required. Unique within the store. |
products[].title | string | Required. |
products[].description | string | Optional. A short description works best. |
products[].price | number | Optional. |
products[].category | string | Optional. Questions are written per category. |
products[].attributes | object | Optional. String keys and string values. |
Returns 200 with {"store_id": 42}. After a store's first push, AnswerEng writes its buying questions in the background. Sampling then runs on your plan's schedule: every four weeks on Free, weekly on Starter and Pro.
List your stores
GET/stores
[
{"store_key": "shop.example.com", "latest_run_at": "2026-09-28T06:00:12+00:00"}
]
latest_run_at is null until the store's first sampling run completes.
Get a store's results
GET/stores/{store_key}/summary
Results from the latest completed run. Every rate is a fraction from 0 to 1, with low and high giving its 95% confidence interval.
{
"store_key": "shop.example.com",
"latest_run": {"run_id": 36, "started_at": "2026-09-28T06:00:12+00:00", "status": "complete", "coverage": 1.0},
"visibility": {"rate": 0.42, "low": 0.35, "high": 0.49},
"share_of_voice": {
"__store__": {"rate": 0.42, "low": 0.35, "high": 0.49},
"Merrell": {"rate": 0.44, "low": 0.37, "high": 0.51}
},
"engine_breakdown": {
"perplexity:sonar": {"rate": 0.47, "low": 0.36, "high": 0.58},
"bedrock:mistral.mistral-large-2402-v1:0": {"rate": 0.39, "low": 0.29, "high": 0.50}
},
"visibility_trend": [
{"run_id": 35, "started_at": "2026-09-21T06:00:09+00:00", "rate": 0.38, "low": 0.31, "high": 0.45}
]
}
share_of_voice has one entry for your store, keyed __store__, and one per competitor. engine_breakdown is keyed engine:model, where the engine is perplexity or bedrock (Claude, Llama, and Mistral run on Amazon Bedrock). Model IDs can change as engines are updated.
Before the first run completes, latest_run and visibility are null and the other fields are empty. visibility_trend covers up to the last eight runs, oldest first.
Get drafted fixes
GET/stores/{store_key}/fixes
Fixes drafted for questions where your products were missing, newest first, up to 100. kind is copy, schema, qa, or attribute; priority is high, medium, or low; engine is the engine whose answer missed you. Add ?status= with suggested (the default), approved, rejected, or refused.
[
{
"fix_id": 118,
"kind": "copy",
"content": "Waterproof, wide-fit leather hiking boot…",
"status": "suggested",
"priority": "high",
"reasons": ["The description doesn't mention wide fit."],
"prompt_text": "waterproof hiking boots for wide feet",
"engine": "perplexity"
}
]
Rotate your API key
POST/keys/rotate
Emails a new key to your account address and returns 202. The current key stops working shortly afterwards, so update your integration with the new key as soon as it arrives. If you've lost your key, email support@answereng.io from your account address instead.
Errors
Errors return JSON with an error or message field.
| Status | Meaning |
|---|---|
403 | Missing, invalid, or inactive API key; a plan limit was reached; or the store key belongs to another account. |
404 | Unknown store. A store exists only after its first catalog push. |
422 | The request body failed validation. The response lists each problem. |
429 | Rate limit or daily quota reached. |
500, 503, 504 | Temporary failure. AnswerEng's database pauses when idle, so the first request after a quiet period can fail. Retry after a few seconds. |
Limits
- 5 requests per second per key, with bursts up to 10.
- 1,000 requests per day per key.
- 5,000 products per catalog push.
Questions? hello@answereng.io