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"}
      }
    ]
  }'

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.

Limits