POST /v1/widget/verify

Checks an API key + domain + calculator, and returns everything the widget needs to render.

This is what the embed script calls on every load — you'd only call it directly if you're building your own integration instead of using the standard embed snippet. Rate limited to 30 requests/minute per IP.

Request

curl -X POST https://exactcalcs.com/v1/widget/verify \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "sk_live_...",
    "domain": "https://yoursite.com",
    "calcId": "bmi"
  }'
FieldTypeNotes
apiKeystring, requiredFrom your dashboard.
domainstring, requiredThe page's own origin. Checked against your registered domains.
calcIdstring, optionalOne of GET /v1/calculators's IDs. Omit it and you get a bare allow/deny with no config or webhook data.

Response — allowed

{
  "allowed": true,
  "config": {
    "theme": { "preset": "aurora", "primary": "#2563eb" },
    "fields": { "hidden": ["notes"] }
  },
  "values": { "weight": 82, "heightCm": 178 }
}

config is whatever you saved in the Widget Customizer for that calculator — theme, hidden fields, locked units. values only appears on the extra plan, and only when the calculator has a webhook configured: it's the live data your own webhook returned, merged in as field pre-fills.

Response — blocked

{ "allowed": false, "error": "Domain not registered for this key" }

See Errors & rate limits for the full list of error values and what each one means.