Arrowsterr API
Build on your AI visibility data.
Pull your AI visibility, prompts and Content Plan into your own dashboards, sheets and tools. Plain REST and JSON, with webhooks the moment something changes.
https://app.arrowsterr.com/api/v1
base URL
On Pro, Agency and Enterprise. Works with Zapier, Make, n8n and your own code.
curl "https://app.arrowsterr.com/api/v1/visibility?brand_id=BRAND_ID&days=30" \
-H "X-API-Key: aw_live_your_key"const res = await fetch("https://app.arrowsterr.com/api/v1/visibility?brand_id=BRAND_ID&days=30", {
headers: { "X-API-Key": process.env.ARROWSTERR_KEY },
});
const { brand, days } = await res.json();
console.log(brand.name, days.at(-1).visibility);import os, requests
r = requests.get(
"https://app.arrowsterr.com/api/v1/visibility",
params={"brand_id": "BRAND_ID", "days": 30},
headers={"X-API-Key": os.environ["ARROWSTERR_KEY"]},
)
for day in r.json()["days"]:
print(day["day"], day["visibility"])Up and running in 5 minutes.
Watch a key go from Settings to a live chart. Click any step to jump to it.
- An admin creates a key in Settings → Integrations. Copy it right away, it's shown once.
- Send it on every call in the
X-API-Keyheader, or asAuthorization: Bearer. Test it with/me. - Call
/brandsto get your brand ids. - Pull
/visibilityfor each brand into your dashboard, or subscribe to webhooks and let the data come to you.
{
"brand": { "id": "1c15ea32-…", "name": "Acme", "domain": "acme.com" },
"days": [
{
"day": "2026-10-11",
"answers": 120,
"visibility": 46.7,
"engines": ["ChatGPT", "Perplexity", "Gemini", "Claude", "AI Overview"],
"competitors": [
{ "name": "Rival A", "visibility": 38.3 },
{ "name": "Rival B", "visibility": 27.5 }
]
}
]
}aw_live_8fK2pXr4…QzCopy
$
$
{
"workspace": {
"id": "ws_4c1e…",
"name": "Acme Agency",
"plan": "scale"
}
}
$
{ "brands": [
{ "id": "b_123", "name": "Acme", "domain": "acme.com" },
{ "id": "b_456", "name": "Globex", "domain": "globex.io" }
] }
$
{ "days": [ { "day": "2026-10-05", "visibility": 38.0 }, … 7 days ] }
Endpoints.
Every path starts with https://app.arrowsterr.com/api/v1. Every reply is JSON.
| Method | Path | What it returns |
|---|---|---|
| GET | /me | The workspace your key belongs to, with its plan. Good for testing a connection. |
| GET | /brands | Every brand in the workspace, with its id and domain. |
| GET | /visibility?brand_id=…&days=30 | AI visibility by day for one brand, with the answers checked, the AI models and the top 10 competitors. Up to 365 days. |
| GET | /prompts?brand_id=… | The prompts a brand tracks, grouped by topic. |
| GET | /calendar?brand_id=… | The Content Plan: keyword, stage, volume, difficulty, status, due date and live URL for each piece. |
| GET | /topic-bank?brand_id=… | Saved keyword ideas with volume, difficulty, intent and funnel stage. |
| GET | /webhooks | Your webhook subscriptions, and the events you can subscribe to. |
| POST | /webhooks | Subscribe a URL to an event. Send { "url": "https://…", "event": "daily.result" }, or "*" for every event. |
| DELETE | /webhooks/{id} | Stop a subscription. |
| GET | /samples/{event} | A sample payload for an event, to map fields before the first real one arrives. |
Webhooks.
Get a POST to your URL when something happens. Zapier subscribes on its own when you build a Zap with Arrowsterr.
| Event | When it fires |
|---|---|
| daily.result | Every day, after a brand's AI answers are checked: its visibility and the change since the last check. |
| visibility.alert | When a brand's visibility moves by your alert size, or a competitor overtakes it. |
| brief.ready | When a content brief is ready. |
| post.published | When a draft is published to your CMS. |
curl -X POST "https://app.arrowsterr.com/api/v1/webhooks" \
-H "X-API-Key: aw_live_your_key" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/hooks/arrowsterr", "event": "visibility.alert" }'{
"event": "visibility.alert",
"brand": { "id": "b_123", "name": "Acme", "domain": "acme.com" },
"day": "2026-10-10",
"visibility": 34,
"previous": 41,
"change": -7,
"reasons": ["AI visibility fell 7 points", "Rival A overtook you"]
}Errors and limits.
Check the header, and that the key wasn't revoked in Settings → Integrations.
402 means the workspace is read-only, often a lapsed payment. 403 means the plan doesn't include the API.
The brand id isn't in this workspace. Get ids from /brands.
Data updates once a day after the checks run, so polling more than hourly won't get you anything new. Webhooks are the faster path.
Questions.
Which plans include the API?
Pro, Agency and Enterprise. Each workspace can have as many keys as it needs, and up to 50 webhooks.
Can my AI assistant use the API?
Yes, and there's an easier way. The Arrowsterr MCP server lets Claude, ChatGPT and Cursor read the same data with a sign-in button, no code needed.
How fresh is the data?
AI answers are checked every day. The daily.result webhook fires as soon as each brand's check finishes.
Can I white label it for clients?
Yes. Pull the numbers into your own client dashboards. For ready-made reports, use Client Reports in the app with your agency's logo and colors.
Start today
Get your first API key today.
Start a free trial, then upgrade to Pro to create your first API key.