REST API
The Maneuvr public API gives you programmatic access to everything in your workspace -- competitors, events, battlecards, digests, runs, deal outcomes, and webhooks.
Full documentation is at maneuvr.app/docs/api. The OpenAPI spec is available at /api/v1/openapi.json.
API availability
REST API access (including webhooks) is available on the Business plan. API key management is available on all paid plans for personal use.
Authentication
All API requests require a bearer token. Two token types are supported:
- User JWT -- your Supabase session token, for personal access
- API key -- scoped, expiring keys for automated or external access (recommended for production use)
Pass the token in the Authorization header:
Authorization: Bearer <token>
API keys
Create and manage API keys in Settings > API Keys.
Each key has:
- A scope (read and/or write per resource)
- An optional expiry date
- A display name
Keys are shown once at creation -- copy and save it before closing the dialog. If you lose a key, revoke it and create a new one.
To revoke: go to Settings > API Keys, find the key, and click Revoke.
Resources
| Resource | Endpoint | Notes |
|---|---|---|
| Competitors | /api/v1/entities | List, create, get, update, archive |
| Events | /api/v1/events | List, get, ingest (POST /ingest) |
| Battlecards | /api/v1/battlecards | Get, regenerate |
| Digests | /api/v1/digests | List, get |
| Runs | /api/v1/runs | List, get, trigger |
| Webhooks | /api/v1/webhooks | Create, list, get, delete |
| Deal outcomes | /api/v1/deal-outcomes | List, create, delete |
Pushing events in
Use the event ingest endpoint to push competitive signals from external sources into Maneuvr:
POST /api/v1/events/ingest
Requires write:events scope. Useful for piping in signals from your CRM, call recording tool, or other intelligence sources.
Idempotency
Write operations support the Idempotency-Key header. Pass a unique key per request and Maneuvr will return the same response if the request is replayed -- no duplicate records created. This is useful for retrying failed requests safely.
Idempotency-Key: <your-unique-key>
Rate limiting
Rate limit headers are returned on every response:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 94
X-RateLimit-Reset: 1718000000
If you exceed the limit, you'll receive a 429 Too Many Requests response. Implement exponential backoff on retry.
Pagination
List endpoints use cursor-based pagination. Pass the after cursor from the previous response to get the next page.
GET /api/v1/events?after=<cursor>&limit=50
Response format
All responses follow a consistent envelope:
{
"data": { ... },
"meta": { "cursor": "...", "total": 120 }
}
Errors return a consistent structure with a code and message.
Deal outcomes API
Log deal outcomes from external systems using POST /api/v1/deal-outcomes. Requires write:deal_outcomes scope.
{
"competitor_id": "uuid",
"outcome": "lost",
"reason_codes": ["price", "missing_feature"],
"segment": "mid_market",
"close_date": "2026-06-01",
"deal_size": 24000,
"currency": "USD",
"notes": "They went with Competitor X because of the Salesforce integration."
}
Invalid reason codes return a 422 with field-level error detail. See the Win-Loss section for the full reason code list.