Skip to main content

API Reference

All API requests are routed through the gateway at api.crowai.dev (prod) or dev.api.crowai.dev (dev). Requests require either a session cookie or an API key (crow_...). The gateway injects X-Organization-Id and Authorization: Bearer <JWT> headers before forwarding to internal services.

Base URL: https://api.crowai.dev/api/v1

Authentication​

Include the better-auth.session_token cookie (set automatically by the auth client on .crowai.dev). The gateway validates the session and retrieves a JWT.

API Key​

Pass the key in one of these headers:

  • X-API-Key: crow_...
  • Authorization: Bearer crow_...
  • ApiKey: crow_...

The gateway resolves the organization from the key owner's user record.

Auth Service​

Sign Up​

POST /api/v1/auth/sign-up/email

Body:

{
"name": "string",
"email": "string (business domain only)",
"password": "string"
}

Consumer email domains (gmail.com, yahoo.com, outlook.com, hotmail.com, etc.) are rejected.

Sign In​

POST /api/v1/auth/sign-in/email

Body:

{
"email": "string",
"password": "string"
}

Get Session​

GET /api/v1/auth/get-session

Returns the current session including activeOrganizationId.

Get JWT​

GET /api/v1/auth/token

Returns a signed JWT for the authenticated session. Used internally by the gateway.

JWKS​

GET /api/v1/auth/jwks

Public endpoint. Returns the JSON Web Key Set for JWT verification.

Create Organization​

POST /api/v1/auth/organization/create

Body:

{
"name": "string",
"slug": "string"
}

Triggers sync to org service and user service.

Set Active Organization​

POST /api/v1/auth/organization/set-active

Body:

{
"organizationId": "string (Better Auth org ID)"
}

Create API Key​

POST /api/v1/auth/api-key/create

Returns a crow_-prefixed API key.

Verify API Key (Internal)​

POST /api/v1/auth/api-key/verify

Requires X-Service-API-Key header. Returns key metadata including userId.


Users​

Get Current User​

GET /api/v1/users/me

Get User by ID​

GET /api/v1/users/{id}

Get User Permissions​

GET /api/v1/users/{id}/permissions

Response:

{
"chat": { "enabled": true, "components": [], "lookbackWindow": 30 },
"interactions": { "enabled": true },
"patterns": { "enabled": true },
"teamManagement": { "enabled": true },
"apiKeyManagement": { "enabled": true }
}

List Users in Organization​

GET /api/v1/users/by-organization/{organizationId}

Search Users by Email​

GET /api/v1/users/search-email?q={prefix}

Update Profile​

PATCH /api/v1/users/{id}/profile

Body:

{
"name": "string",
"profilePictureUrl": "string"
}

Upload Profile Picture​

POST /api/v1/users/{id}/profile-picture

Multipart form data with image file. Stored in R2.


Organizations​

Get Organization​

GET /api/v1/organizations/{id}

Get Organization Members​

GET /api/v1/organizations/{id}/members

Get Organization Context​

GET /api/v1/organizations/{id}/context

Returns the latest AI-generated organizational context summary.

Trigger Context Generation​

POST /api/v1/organizations/{id}/context/trigger

Enqueues an async context generation job.

Invite Member​

POST /api/v1/organizations/{organizationId}/members

Body:

{
"email": "string",
"role": "member | admin"
}

Products​

Create Crawler Job​

POST /api/v1/products/crawler-jobs

Body:

{
"sourceType": "url",
"sourceValue": "https://example.com/products"
}

SSRF protection blocks private IPs, loopback, link-local, and internal CROW hostnames.

Get Crawler Job​

GET /api/v1/products/crawler-jobs/{id}

List Crawler Jobs​

GET /api/v1/products/crawler-jobs/organization/{orgId}

List Products​

GET /api/v1/products/organization/{orgId}

Query params: page, limit

Get Product​

GET /api/v1/products/{id}

Search Products​

GET /api/v1/products/search?q={query}&type={semantic|fts|hybrid}
ParamDescription
qSearch query
typesemantic (Vectorize), fts (full-text), hybrid (both)

Get Product Image (Public)​

GET /api/v1/products/images/{key}

No authentication required. Serves images from R2.

Get AI Descriptions​

GET /api/v1/products/{id}/ai-descriptions

Returns vision model-generated image captions and extracted features.


Interactions​

List Interactions​

GET /api/v1/interactions/organization/{orgId}

Query params: page, limit, sourceType (web, cctv, social), q (search)

Get Interaction Summary​

GET /api/v1/interactions/organization/{orgId}/summary

Response:

{
"web": 150,
"cctv": 42,
"social": 18,
"total": 210
}

Analyze Interactions​

POST /api/v1/interactions/organization/{orgId}/analyze

AI-generated analysis including summary, insights, anomalies, and recommendations. Uses Workers Container for longer processing.


Patterns​

List Pattern Results​

GET /api/v1/patterns/results/organization/{orgId}

Query params: period (daily, weekly, monthly, yearly)

List Patterns​

GET /api/v1/patterns/organization/{orgId}

Trigger Analysis​

POST /api/v1/patterns/analyze

Ad-hoc pattern analysis for the caller's organization.


Chat​

Create Session​

POST /api/v1/chat/sessions

Send Message​

POST /api/v1/chat/messages

Body:

{
"sessionId": "string",
"content": "string"
}

Response is streamed. The AI agent may call tools (search_products, get_interactions, get_patterns) before generating a response.

Get Message History​

GET /api/v1/chat/history?sessionId={id}

List Sessions​

GET /api/v1/chat/sessions

Delete Session​

DELETE /api/v1/chat/sessions/{id}

Q&A​

Ask a Question​

POST /api/v1/qna/query

Body:

{
"question": "string",
"history": [
{ "role": "user", "content": "string" },
{ "role": "assistant", "content": "string" }
]
}

RAG-based answer generation using Vectorize document retrieval and Workers AI.


Billing​

Get Plans​

GET /api/v1/billing/plans

Create Checkout Session​

POST /api/v1/billing/checkout/session

Body:

{
"builderId": "string"
}

Returns a Stripe checkout URL.

Get Subscription​

GET /api/v1/billing/subscriptions/{organizationId}

Stripe Webhook​

POST /api/v1/billing/webhook

Public endpoint (no auth). Stripe signature verification via Stripe-Signature header. Handles checkout.session.completed, checkout.session.expired, and payment_intent.payment_failed events.


Analytics​

Create Event​

POST /api/v1/analytics/events

Body:

{
"event_type": "string",
"source": "string",
"metadata": {}
}

List Events​

GET /api/v1/analytics/events

Query params: page, limit

Get Summary​

GET /api/v1/analytics/summary

Aggregated event counts by type.


Notifications​

Send Email​

POST /api/v1/notifications/send

Body:

{
"to": "string",
"template": "string",
"data": {}
}

CCTV​

Submit Frame​

POST /api/v1/cctv/frames

Body: Multipart with base64-encoded frame image.

Create Session​

POST /api/v1/cctv/sessions

WebSocket Connection​

GET /api/v1/cctv/ws

Upgrade to WebSocket for real-time frame streaming via Durable Object.

List Cameras​

GET /api/v1/cctv/cameras/{orgId}

List Sessions​

GET /api/v1/cctv/sessions

Get Session Results​

GET /api/v1/cctv/sessions/{id}/results

MCP​

MCP Protocol Endpoint​

POST /api/v1/mcp
GET /api/v1/mcp

Implements the Model Context Protocol JSON-RPC specification. Authenticated via API key. Available tools: query interactions, query patterns, search products.


Error Responses​

All services return errors in a consistent format:

{
"error": "Error message"
}
StatusMeaning
400Invalid request parameters
401Unauthorized (missing or invalid auth)
403Forbidden (BOLA check failed)
404Resource not found
429Rate limited
500Internal server error

Validation errors (Zod) are sanitized to "Invalid request parameters" without leaking schema details.

Rate Limiting​

The gateway applies per-IP rate limiting:

  • Standard routes: Default rate limit
  • Auth routes: Stricter limit (sign-in, sign-up, API key verification)

Health Checks​

All services expose health endpoints that bypass authentication:

GET /api/v1/{service}/health
GET /api/v1/{service}/ready