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

ResourceEndpointNotes
Competitors/api/v1/entitiesList, create, get, update, archive
Events/api/v1/eventsList, get, ingest (POST /ingest)
Battlecards/api/v1/battlecardsGet, regenerate
Digests/api/v1/digestsList, get
Runs/api/v1/runsList, get, trigger
Webhooks/api/v1/webhooksCreate, list, get, delete
Deal outcomes/api/v1/deal-outcomesList, 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.