Build on Weav
The Weav Developer Platform helps you integrate AI-powered customer support directly into your product stack. Use the API to manage agents, conversations, messages, customers, companies, and training data in your workspace, with predictable, organization-scoped behavior that’s built for production integrations. Authentication is token-based and ability-scoped. Endpoints are versioned under/v1, return consistent JSON structures, and include clear error signaling—making it easier to handle retries, validation issues, and long-term maintenance as your integration grows.
Webhooks complement the API by delivering real-time events to your systems when conversations, customers, agents, or training data change. Together, the API and webhooks give you the complete integration loop: send commands into Weav and react to updates from Weav in near real time.
What you can build
- Sync conversations and customer records with your CRM
- Trigger automations from live support events
- Manage AI agents and training data programmatically
- Build internal tooling for support operations and analytics
How API + webhooks work together
How API + webhooks work together
- Your app calls the Weav API to create or update resources.
- Weav emits webhook events as those resources change.
- Your backend processes events and updates your downstream systems.
Integration best practices
Integration best practices
- Use idempotent handlers for webhook processing
- Retry safely on transient failures
- Log request IDs and event IDs for traceability
Authentication
The Weav External API uses Bearer token authentication with workspace-scoped API keys. All external endpoints are versioned under/v1 and require a valid token in the Authorization header.
Your API key inherits your workspace context. Requests can only access resources within that workspace.
Get an API Key
You can create API keys in the Weav dashboard:- Go to Settings → API Tokens
- Click Create API token
- Enter a name (and optional expiration)
- Create the token
- Copy the token immediately and store it securely
⚠️ Important
The plain-text token is shown only once at creation time.
If you lose it, delete the token and create a new one.
Use the Key in Requests
Example usingcurl:
Common Authentication Failures
401 — Unauthenticated
Usually means the token is missing, malformed, or invalid.403 — Insufficient Token Ability
The token is valid but does not include the ability required for the HTTP method.Authentication Best Practices
- Store API keys in a secure secrets manager (never in frontend code)
- Set expirations where possible
- Rotate keys regularly
- Delete unused keys immediately
- Send requests server-to-server over HTTPS only
Error handling
The Weav External API uses predictable HTTP status codes and machine-readable error codes for most authorization and business-rule failures. For client integrations, treat all non-2xx responses as failures, branch first on HTTP status, then on the error code when available. Most endpoint failures use a standard JSON envelope witherror and optional code. Validation failures use Laravel’s validation shape (message + errors). A small number of endpoint-specific business-state responses may return custom payloads, so clients should handle both patterns safely.
Error response formats
Standard API error envelope
error(string): human-readable messagecode(string, optional): machine-readable identifiererrors(object, optional): additional context/details
Validation errors (422)
Use this format when payload/query/path validation fails.Endpoint-specific business-state error example (422)
Some flows can return a custom shape such as:Treat this as a non-retryable business-state error unless your app changes input/state before retrying.
HTTP status codes to handle
| Status | Meaning | Typical cause | Retry guidance |
|---|---|---|---|
| 400 | Bad request / business rule failure | Invalid assignment type, invalid type/code path | Usually no |
| 401 | Unauthenticated | Missing/invalid bearer token | No (fix auth) |
| 403 | Forbidden | Missing token ability or prohibited operation | No (fix permissions/input) |
| 404 | Not found | Resource missing or outside workspace scope | No (fix ID/scope) |
| 422 | Validation/business-state failure | Invalid fields, unsupported state | No (fix payload/state) |
| 500 | Server error | Internal processing/creation failure | Sometimes (with backoff) |
Common error codes
| Code | Status | Description |
|---|---|---|
UNAUTHENTICATED | 401 | Request is not authenticated |
INSUFFICIENT_TOKEN_ABILITY | 403 | Token lacks required ability (external-api:read or external-api:write) |
FORBIDDEN | 403 | Operation blocked by business rule (for example protected agent operations) |
RESOURCE_NOT_FOUND | 404 | Resource doesn’t exist in current workspace scope |
INVALID_SENDER | 400 | Invalid message sender reference |
INVALID_ASSIGNEE | 400 | Invalid assignee reference |
INVALID_ASSIGNEE_TYPE | 400 | Assignee type violates conversation/channel rules |
INVALID_TYPE | 400 | Unsupported training data type |
INVALID_AGENT | 400 | Agent missing or outside current workspace |
URL_DISCOVERY_REQUIRED | 422 | URL training must use URL process endpoint |
NO_URLS_PROVIDED | 422 | URL process request had no valid URLs |
PROCESSING_FAILED | 500 | URL/training processing failed server-side |
CREATION_FAILED | 500 | Resource creation failed server-side |
Best practices
- Log status, code, and response body for all non-2xx responses.
- Treat 4xx as request/integration issues, 5xx as transient/system issues.
- Only retry idempotent operations, with exponential backoff and jitter.
- Surface validation details from
errorsdirectly in developer tooling.

