WeInc API reference
REST API for WeInc, the AI website builder: manage clients, website projects, templates, plans, analytics, and webhooks programmatically. Authentication: `Authorization: Bearer wk_...` (self-serve API key from https://my.we.inc/agency/api on the free plan). Rate limit: 100 requests per minute per credential. Every response carries `RateLimit-Policy`, `RateLimit`, `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`; a 429 carries `Retry-After`. Versioning: the version is in the URL path (/api/v1). Breaking changes ship in a new path version; a retiring version sends `Deprecation` and `Sunset` headers at least 12 months ahead. Policy: https://my.we.inc/developers/versioning MCP server (Streamable HTTP) for AI agents: https://my.we.inc/api/mcp, manifest at https://my.we.inc/.well-known/mcp. Test mode: a key created with test: true (wk_test_...) reaches only the sandbox projects it creates; their store checkout runs in Stripe test mode, they publish with noindex and their webhooks carry test: true. AI turns still cost real credits, inside the key's own monthly cap (default 200). Headless build (no browser): create a client, activate it, create a project, run AI turns, deploy, load products and cap credits, all over this API. Walkthrough: https://my.we.inc/docs/api/headless
Version 1.0.0. Machine-readable OpenAPI document: /api/v1/docs. Overview and other ways to integrate: /docs/api.
Base URL
https://my.we.inc/api/v1
Authentication
Every request needs an organization API key, created in your WeInc dashboard. Send it as a bearer token:
curl https://my.we.inc/api/v1/projects \ -H "Authorization: Bearer wk_your_key_here"
Requests without a valid key return 401. Keys are scoped to one organization and see only that organization's data.
Errors
Every failure returns a JSON object with a single error field holding a human-readable message. The field is always present on an error response.
{ "error": "Unauthorized" }| Status | Meaning |
|---|---|
| 400 | The request was malformed or a field failed validation. |
| 401 | Missing or invalid API key. |
| 403 | The key is valid but lacks the permission this endpoint needs. |
| 404 | No such record, or it belongs to another organization. |
| 415 | Content-Type must be application/json on writes. |
| 429 | Rate limit exceeded. See Rate limits below. |
| 500 | Something failed on our side. Safe to retry. |
Pagination
List endpoints paginate with limit and offset query parameters. limit defaults to 50 and caps at 100; offset defaults to 0. Each list response also returns total, the number of records matching the query, so a client knows when to stop: keep requesting while offset + limit < total.
curl "https://my.we.inc/api/v1/projects?limit=25&offset=50" \
-H "Authorization: Bearer wk_your_key_here"
{ "projects": [ … ], "total": 137 }Rate limits
100 requests per minute per credential. Exceeding it returns 429 with a Retry-After header giving the seconds to wait.
Endpoints
- get /clients
- post /clients
- get /clients/{clientId}
- patch /clients/{clientId}
- get /projects
- post /projects
- get /projects/{projectId}
- patch /projects/{projectId}
- delete /projects/{projectId}
- get /templates
- post /templates
- get /templates/{templateId}
- patch /templates/{templateId}
- delete /templates/{templateId}
- get /plans
- post /plans
- get /plans/{planId}
- patch /plans/{planId}
- get /analytics
- get /webhooks
- post /webhooks
- get /webhooks/{webhookId}
- patch /webhooks/{webhookId}
- delete /webhooks/{webhookId}
- post /projects/{projectId}/chat
- get /projects/{projectId}/turns/{turnId}
- get /projects/{projectId}/deploy
- post /projects/{projectId}/deploy
- get /projects/{projectId}/products
- post /projects/{projectId}/products
- patch /projects/{projectId}/products
- delete /projects/{projectId}/products
- post /clients/{clientId}/activate
- get /usage
- get /projects/{projectId}/store/orders
- get /projects/{projectId}/store/orders/{orderId}
- post /projects/{projectId}/store/orders/{orderId}/cancel
- get /projects/{projectId}/store/customers
- get /projects/{projectId}/files
- patch /projects/{projectId}/files
- put /projects/{projectId}/files
- post /projects/{projectId}/estimate
- get /projects/{projectId}/export
- post /projects/{projectId}/transfer
- get /projects/{projectId}/cloud/roles
- put /projects/{projectId}/cloud/roles/{role}
- delete /projects/{projectId}/cloud/roles/{role}
- post /projects/{projectId}/cloud/roles/{role}/members
- delete /projects/{projectId}/cloud/roles/{role}/members/{userId}
- get /projects/{projectId}/domains
- post /projects/{projectId}/domains
- delete /projects/{projectId}/domains
- get /projects/{projectId}/store/connect
- post /projects/{projectId}/store/connect
- get /projects/{projectId}/store/discounts
- post /projects/{projectId}/store/discounts
- patch /projects/{projectId}/store/discounts/{itemId}
- delete /projects/{projectId}/store/discounts/{itemId}
- get /projects/{projectId}/store/shipping-rates
- post /projects/{projectId}/store/shipping-rates
- patch /projects/{projectId}/store/shipping-rates/{itemId}
- delete /projects/{projectId}/store/shipping-rates/{itemId}
- get /projects/{projectId}/store/settings
- patch /projects/{projectId}/store/settings
get /clients
List clients
Responses
- 200 Client list
- 401 Unauthorized
- 403 Forbidden
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/clients" \ -H "Authorization: Bearer wk_your_key_here"
post /clients
Create a client
Request body
| Field | Type | Notes |
|---|---|---|
| string (email) | ||
| name | string | |
| company | string | |
| plan_id | string (uuid) |
Responses
- 201 Client created
- 400 Validation error
- 401 Unauthorized
- 403 Forbidden
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/clients" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /clients/{clientId}
Get client details
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| clientId* | path | string (uuid) |
Responses
- 200 Client details
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/clients/{clientId}" \
-H "Authorization: Bearer wk_your_key_here"patch /clients/{clientId}
Update a client
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| clientId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| company | string | |
| status | "invited" | "active" | "suspended" | "churned" | |
| plan_id | string (uuid) | |
| monthly_credit_cap | integer (nullable) | Monthly AI credit limit for this client (null removes it). Enforced before each AI turn with a 402 `client_credit_cap`. |
Responses
- 200 Client updated
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/clients/{clientId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects
List projects
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| limit | query | integer | Number of records to return (max 100) |
| offset | query | integer | Number of records to skip |
| client_id | query | string (uuid) | Filter by client ID |
| q | query | string | Case-insensitive partial match on the project name |
| status | query | string | Filter by status |
Responses
- 200 Project list
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects" \ -H "Authorization: Bearer wk_your_key_here"
post /projects
Create a project for a client
Request body
| Field | Type | Notes |
|---|---|---|
| client_email | string (email) | |
| name | string | |
| description | string | |
| template_id | string (uuid) | Clone files from an org template |
Responses
- 201 Project created
- 400 Validation error
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects/{projectId}
Get project details
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Responses
- 200 Project details
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}" \
-H "Authorization: Bearer wk_your_key_here"patch /projects/{projectId}
Update a project
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| description | string | |
| status | string |
Responses
- 200 Project updated
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/projects/{projectId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}
Delete a project
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Responses
- 200 Project deleted
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}" \
-H "Authorization: Bearer wk_your_key_here"get /templates
List org templates
Responses
- 200 Template list
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/templates" \ -H "Authorization: Bearer wk_your_key_here"
post /templates
Create a template
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| description | string | |
| category | string | |
| source_project_id | string (uuid) | Snapshot files from an existing project |
| is_public | boolean |
Responses
- 201 Template created
- 400 Validation error
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/templates" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /templates/{templateId}
Get template details
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| templateId* | path | string (uuid) |
Responses
- 200 Template details
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/templates/{templateId}" \
-H "Authorization: Bearer wk_your_key_here"patch /templates/{templateId}
Update a template
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| templateId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| description | string | |
| category | string | |
| thumbnail_url | string (uri) | |
| is_public | boolean | |
| is_featured | boolean |
Responses
- 200 Template updated
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/templates/{templateId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /templates/{templateId}
Delete a template
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| templateId* | path | string (uuid) |
Responses
- 200 Template deleted
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/templates/{templateId}" \
-H "Authorization: Bearer wk_your_key_here"get /plans
List client plans
Responses
- 200 Plan list
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/plans" \ -H "Authorization: Bearer wk_your_key_here"
post /plans
Create a client plan
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| description | string | |
| price | number | |
| interval | "monthly" | "yearly" | |
| max_sites | integer | |
| max_ai_messages_daily | integer | |
| can_export_code | boolean | |
| can_use_custom_domain | boolean |
Responses
- 201 Plan created
- 400 Validation error
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/plans" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /plans/{planId}
Get plan details
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| planId* | path | string (uuid) |
Responses
- 200 Plan details
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/plans/{planId}" \
-H "Authorization: Bearer wk_your_key_here"patch /plans/{planId}
Update a plan
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| planId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| description | string | |
| price | number | |
| interval | "monthly" | "yearly" | |
| max_sites | integer | |
| max_ai_messages_daily | integer | |
| can_export_code | boolean | |
| can_use_custom_domain | boolean | |
| is_default | boolean | |
| is_active | boolean | |
| sort_order | integer |
Responses
- 200 Plan updated
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/plans/{planId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /analytics
Get aggregated analytics
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| days | query | integer | Number of days to look back |
| project_id | query | string (uuid) | Filter analytics for a specific project |
Responses
- 200 Analytics data
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/analytics" \ -H "Authorization: Bearer wk_your_key_here"
get /webhooks
List webhook endpoints
Responses
- 200 Webhook list
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/webhooks" \ -H "Authorization: Bearer wk_your_key_here"
post /webhooks
Register a webhook endpoint
The webhook secret is returned only in the creation response. Store it securely to verify webhook signatures.
Request body
| Field | Type | Notes |
|---|---|---|
| url | string (uri) | |
| events | "client.created" | "client.updated" | "plan.created" | "store.order.created" | "store.order.paid" | "store.order.canceled" | "product.low_stock" | "deploy.succeeded" | "deploy.failed" | "turn.completed" | "turn.failed"[] |
Responses
- 201 Webhook created (includes secret)
- 400 Validation error
- 401 Unauthorized
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/webhooks" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /webhooks/{webhookId}
Get webhook details
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| webhookId* | path | string (uuid) |
Responses
- 200 Webhook details
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/webhooks/{webhookId}" \
-H "Authorization: Bearer wk_your_key_here"patch /webhooks/{webhookId}
Update a webhook
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| webhookId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| url | string (uri) | |
| events | "client.created" | "client.updated" | "plan.created" | "store.order.created" | "store.order.paid" | "store.order.canceled" | "product.low_stock" | "deploy.succeeded" | "deploy.failed" | "turn.completed" | "turn.failed"[] | |
| is_active | boolean |
Responses
- 200 Webhook updated
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/webhooks/{webhookId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /webhooks/{webhookId}
Delete a webhook
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| webhookId* | path | string (uuid) |
Responses
- 200 Webhook deleted
- 401 Unauthorized
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/webhooks/{webhookId}" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/chat
Run an AI turn
Send a build or change instruction to the AI for one project, exactly as the builder chat does (same prompts, same credit charge, files saved on our servers). With `async: true` returns 202 + turnId immediately; poll GET /projects/{projectId}/turns/{turnId}. With `wait: true` holds up to ~85s and returns the finished turn, else 202. Without either, streams the raw builder output as text. An org API key needs `write` and may only act on its clients' projects. 402 codes: `insufficient_credits`, `org_credit_cap`, `client_credit_cap`, `needs_trial`.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| message | string | The instruction. Send this OR messages. |
| messages | object[] | |
| async | boolean | |
| wait | boolean | |
| conversationId | string (uuid) | Continue a specific conversation. |
| newConversation | boolean | Start a new conversation instead of continuing the latest. |
| mode | "build" | "chat" | chat = answer only, no file changes. |
| imageAssetUrl | string (uri) |
Responses
- 200 Finished turn (wait) or a text stream (default)
- 202 Turn running; poll the returned URL
- 400 BadRequest
- 401 Unauthorized
- 402 Out of credits or over a cap
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/chat" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects/{projectId}/turns/{turnId}
Get an AI turn
Poll a turn started with POST /projects/{projectId}/chat. `status` moves from running to completed or failed; a completed turn carries the AI's summary, the files it changed and the credits it settled at. Kept for 3 days.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| turnId* | path | string |
Responses
- 200 The turn
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/turns/{turnId}" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/deploy
Get deploy status
Poll a deploy started with POST /projects/{projectId}/deploy. Each poll advances the job; when the build completes this call publishes it and returns `ready` with the live `url`. Errors carry `stage` (install, build, publish, timeout) and a message.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| job* | query | string |
Responses
- 200 Job status
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/deploy" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/deploy
Deploy a project
Build the project's current files on our build service and publish it to its live URL (and its connected custom domain). Returns 202 with a jobId; poll GET /projects/{projectId}/deploy?job=… every 3-5 seconds until status is `ready` (with `url`) or `error`.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| basePath | string | Vite base path; omit for root. |
Responses
- 202 Build started
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 Nothing built yet (run an AI turn first)
- 429 RateLimited
- 503 Server building is switched off
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/deploy" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects/{projectId}/products
List store products
Every product in the project's store, any status, with its variants (prices in cents, stock counts).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Responses
- 200 Products
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/products" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/products
Bulk upsert store products
Create or update up to 200 products in one call. Each product matches an existing one by handle (given or derived from the title), then by any variant SKU; variants match by SKU, then title. Returns one result per item (created, updated or error with the reason); one bad item never fails the rest.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| products | object[] |
Responses
- 200 Per-item results
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/products" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'patch /projects/{projectId}/products
Update stock levels
Set absolute stock counts for up to 500 variants, each named by sku or variant_id. Setting a count turns stock tracking on unless track_inventory is false. Returns one result per update.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| inventory | object[] |
Responses
- 200 Per-update results
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/projects/{projectId}/products" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}/products
Delete store products
Delete products (and their variants) by id or handle, up to 200 per call. Returns which ids were deleted and which were not found.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| ids | string[] | |
| handles | string[] |
Responses
- 200 Result
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}/products" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'post /clients/{clientId}/activate
Send a client invitation
Send (or re-send) the client's invitation email. The client signs in or signs up, verifies their email and accepts; only then is their account linked to your organization and can you create projects for them. Accounts are never created or linked on the client's behalf. The response is the same whether or not the address already has a WeInc account; poll GET /clients/{clientId} until status is active.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| clientId* | path | string (uuid) |
Responses
- 200 Invitation state
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 Client is suspended or churned
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/clients/{clientId}/activate" \
-H "Authorization: Bearer wk_your_key_here"get /usage
Get AI credit usage
AI credits used by your clients on your organization's projects, per client and per project, over a date range (default: this UTC month so far, at most 366 days). Each client also shows its monthly_credit_cap. Set or clear a cap with PATCH /clients/{clientId} { monthly_credit_cap }.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| clientId | query | string (uuid) | |
| from | query | string (date-time) | |
| to | query | string (date-time) |
Responses
- 200 Usage report
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/usage" \ -H "Authorization: Bearer wk_your_key_here"
get /projects/{projectId}/store/orders
List store orders
The client site's storefront orders, newest first, with line items. Filter by status and a created_at range; page with limit (max 100) and offset. Amounts are in minor units (cents). Not the same as GET /orders, which lists your organization's own plan sales.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| status | query | "pending" | "paid" | "fulfilled" | "canceled" | "refunded" | |
| from | query | string (date-time) | |
| to | query | string (date-time) | |
| limit | query | integer | |
| offset | query | integer |
Responses
- 200 Orders
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/orders" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/store/orders/{orderId}
Get a store order
One storefront order with its line items, customer, shipping address and totals (cents).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| orderId* | path | string (uuid) |
Responses
- 200 Order
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/orders/{orderId}" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/store/orders/{orderId}/cancel
Cancel an unpaid store order
Cancel a pending (unpaid) order, such as a bank debit that will not complete, and send store.order.canceled. Paid orders cannot be canceled through the API (409 order_paid); the store owner handles those in their own Stripe dashboard.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| orderId* | path | string (uuid) |
Responses
- 200 Canceled
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 Paid or already canceled
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/store/orders/{orderId}/cancel" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/store/customers
List store customers
The site's shoppers, one per email, with order count and total spent (cents). Filter by exact email; page with limit (max 100) and offset.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| query | string | ||
| limit | query | integer | |
| offset | query | integer |
Responses
- 200 Customers
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/customers" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/files
List project files
The project's source files as paths and sizes. ?path=src/App.tsx returns one file's content; ?include=content returns every file with its content.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) | |
| path | query | string | |
| include | query | "content" |
Responses
- 200 Files
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/files" \
-H "Authorization: Bearer wk_your_key_here"patch /projects/{projectId}/files
Write project files
Write or delete source files without an AI turn, so no credits are used. Body { files: { path: content | null } } (null deletes); other files are untouched. Up to 200 files and 1 MB per file per call. The current files are saved first as a restorable snapshot (snapshotId). The builder's own save guards apply. Deploy afterwards to go live. Org API key with write permission.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| files | object | |
| message | string |
Responses
- 200 Saved
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/projects/{projectId}/files" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'put /projects/{projectId}/files
Replace project files
Same as PATCH /projects/{projectId}/files (writes the listed files, deletes those set to null, keeps the rest); offered for clients that only send PUT.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| files | object |
Responses
- 200 Saved
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X PUT "https://my.we.inc/api/v1/projects/{projectId}/files" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'post /projects/{projectId}/estimate
Estimate an AI turn's credits
A credit range (low/typical/high = 25th/50th/90th percentile) for the next AI turn on this project, from what similar turns actually settled at: this project's own edits when it has at least 5, otherwise recent turns across the platform (first builds: first turns of new projects). It is an estimate, not a quote. upfrontHold is what must be available when a turn starts.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| message | string |
Responses
- 200 Estimate
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/estimate" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects/{projectId}/export
Export a project
One JSON document with the project's source files, store products, orders and customers (up to 10,000 each) and the rows of its WeInc Cloud database tables (up to 200 rows per table, 50 tables; `truncated` marks a cut). Internal, account and credential tables and secret-looking columns (password, hash, secret, token…) are left out.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Responses
- 200 Export
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/export" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/transfer
Transfer a project to another client
Move the project, with its conversations, history, store and Cloud backend, to another of your clients who has an account and isn't removed, suspended or churned. Connected-service credentials, purchases and credit history stay with the old owner (reconnect integrations after a transfer). Org API key with write permission.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string (uuid) |
Request body
| Field | Type | Notes |
|---|---|---|
| toClientId | string (uuid) |
Responses
- 200 Moved
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
- 503 Migration pending
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/transfer" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects/{projectId}/cloud/roles
List site roles
The generated site's roles (e.g. staff, manager), each with per-table permissions and member user ids. WeInc Cloud enforces them on every data call; a site with no roles behaves exactly as before.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Responses
- 200 Roles
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 The project has no active WeInc Cloud backend yet
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/cloud/roles" \
-H "Authorization: Bearer wk_your_key_here"put /projects/{projectId}/cloud/roles/{role}
Create or replace a site role
Define a role and its per-table permissions (read, insert, update, delete). On a table with any role permissions, a role's read/update/delete reach every member's rows, and only roles with insert (or a site admin) may add rows; everyone keeps their own rows. Optional write rules per table: columns (fields the role may write) and values ({ field: [allowed values] }); a write must fit the rules of one role that grants it, and a refused write gets 403. The reserved role "member" holds rules only, for everyone without a granting role. Up to 20 roles per site, 100 tables per role.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| role* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| tables | object |
Responses
- 200 Saved
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 The project has no active WeInc Cloud backend yet
- 429 RateLimited
Example request
curl -X PUT "https://my.we.inc/api/v1/projects/{projectId}/cloud/roles/{role}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}/cloud/roles/{role}
Delete a site role
Remove a role, its table permissions and every member's assignment. Tables left without role permissions return to the default rules.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| role* | path | string |
Responses
- 200 Deleted
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 The project has no active WeInc Cloud backend yet
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}/cloud/roles/{role}" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/cloud/roles/{role}/members
Give a site member a role
Assign an existing role to someone who signed up on the generated site, by email or by site user id. The account must already exist on the site.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| role* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| string | ||
| user_id | string |
Responses
- 200 Assigned
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 The project has no active WeInc Cloud backend yet
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/cloud/roles/{role}/members" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}/cloud/roles/{role}/members/{userId}
Take a role from a site member
Remove a role from one site member. Their own rows stay theirs; only the role's wider access is gone.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| role* | path | string | |
| userId* | path | string |
Responses
- 200 Removed
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 The project has no active WeInc Cloud backend yet
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}/cloud/roles/{role}/members/{userId}" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/domains
List project domains
The project's custom domains and its subdomain, each with its verification status and the DNS records the domain owner must add.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Responses
- 200 Domains
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/domains" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/domains
Connect a domain
Connect a custom domain ({ domain }) or a subdomain ({ subdomain }). Returns the DNS records to add. A root domain needs wwwFallback: true to connect its www form. When your org API key adds it to one of your clients' projects, your client settings decide whether custom domains are allowed (no WeInc plan needed), up to 100 custom domains per organization. Sandbox projects cannot have domains.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| domain | string | |
| subdomain | string | |
| wwwFallback | boolean |
Responses
- 200 Connected
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 Needs a choice or not allowed for this project
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/domains" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}/domains
Remove a domain
Remove a custom domain or subdomain from the project (?domain=www.example.com), including its routing and Cloudflare hostname cleanup, exactly as the builder does. Live org keys only, for your clients' projects; test keys cannot add or remove domains.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| domain* | query | string |
Responses
- 200 Removed
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}/domains" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/store/connect
Get Stripe payments status
The store's Stripe account status, refreshed from Stripe: whether onboarding is complete and charges are enabled.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Responses
- 200 Status
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/connect" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/store/connect
Start Stripe payments onboarding
Returns a Stripe-hosted onboarding link (url) for the merchant. This is the one manual step in a headless store: the merchant opens it and completes Stripe's form; no WeInc login is needed. Links expire within minutes, so create one when the merchant is ready. Sandbox projects onboard in Stripe test mode.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| store_name | string | |
| return_url | string | |
| refresh_url | string |
Responses
- 200 Onboarding link
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 409 Sandbox project and test mode unavailable
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/store/connect" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'get /projects/{projectId}/store/discounts
List discount codes
Every discount code of the project's store, as the builder's Store panel shows them. Money is in minor units (cents).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Responses
- 200 discount codes
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/discounts" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/store/discounts
Create a discount code
Create a discount code with the same fields and validation as the builder's Store panel. Money is in minor units (cents).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| code | string | |
| type | "percent" | "fixed" | "free_shipping" | |
| value | integer | Percent (0-100) or cents |
| min_subtotal | integer | |
| usage_limit | integer (nullable) | |
| starts_at | string (nullable) | |
| ends_at | string (nullable) | |
| active | boolean |
Responses
- 201 Created
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/store/discounts" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'patch /projects/{projectId}/store/discounts/{itemId}
Update a discount code
Change any of a discount code's fields; the rest stay as they are. Validated like creation.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| itemId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| code | string | |
| type | "percent" | "fixed" | "free_shipping" | |
| value | integer | Percent (0-100) or cents |
| min_subtotal | integer | |
| usage_limit | integer (nullable) | |
| starts_at | string (nullable) | |
| ends_at | string (nullable) | |
| active | boolean |
Responses
- 200 Updated
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/projects/{projectId}/store/discounts/{itemId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}/store/discounts/{itemId}
Delete a discount code
Remove a discount code from the store. Orders already placed keep the amounts they were charged.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| itemId* | path | string |
Responses
- 200 Deleted
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}/store/discounts/{itemId}" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/store/shipping-rates
List shipping rates
Every shipping rate of the project's store, as the builder's Store panel shows them. Money is in minor units (cents).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Responses
- 200 shipping rates
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/shipping-rates" \
-H "Authorization: Bearer wk_your_key_here"post /projects/{projectId}/store/shipping-rates
Create a shipping rate
Create a shipping rate with the same fields and validation as the builder's Store panel. Money is in minor units (cents).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| price | integer | cents |
| min_subtotal | integer (nullable) | |
| max_subtotal | integer (nullable) | |
| active | boolean | |
| position | integer |
Responses
- 201 Created
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X POST "https://my.we.inc/api/v1/projects/{projectId}/store/shipping-rates" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'patch /projects/{projectId}/store/shipping-rates/{itemId}
Update a shipping rate
Change any of a shipping rate's fields; the rest stay as they are. Validated like creation.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| itemId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| name | string | |
| price | integer | cents |
| min_subtotal | integer (nullable) | |
| max_subtotal | integer (nullable) | |
| active | boolean | |
| position | integer |
Responses
- 200 Updated
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/projects/{projectId}/store/shipping-rates/{itemId}" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'delete /projects/{projectId}/store/shipping-rates/{itemId}
Delete a shipping rate
Remove a shipping rate from the store. Orders already placed keep the amounts they were charged.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string | |
| itemId* | path | string |
Responses
- 200 Deleted
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X DELETE "https://my.we.inc/api/v1/projects/{projectId}/store/shipping-rates/{itemId}" \
-H "Authorization: Bearer wk_your_key_here"get /projects/{projectId}/store/settings
Get store settings
Currency, automatic tax, whether checkout is open, and the Stripe account status (null settings when the store has never been set up).
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Responses
- 200 Settings
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X GET "https://my.we.inc/api/v1/projects/{projectId}/store/settings" \
-H "Authorization: Bearer wk_your_key_here"patch /projects/{projectId}/store/settings
Update store settings
Set currency (an ISO 4217 code Stripe supports; on a store with products it needs confirm_currency_change: true, because prices are relabelled, not converted), tax_enabled (Stripe automatic tax) and checkout_open (true = active, false = disabled), or store_status directly.
Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
| projectId* | path | string |
Request body
| Field | Type | Notes |
|---|---|---|
| currency | string | |
| confirm_currency_change | boolean | |
| tax_enabled | boolean | |
| checkout_open | boolean | |
| store_status | "draft" | "active" | "disabled" |
Responses
- 200 Settings
- 400 BadRequest
- 401 Unauthorized
- 403 Forbidden
- 404 NotFound
- 429 RateLimited
Example request
curl -X PATCH "https://my.we.inc/api/v1/projects/{projectId}/store/settings" \
-H "Authorization: Bearer wk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ … }'Object reference
Error
| Field | Type | Notes |
|---|---|---|
| error | string |
Client
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| string (email) | ||
| name | string (nullable) | |
| company | string (nullable) | |
| status | "invited" | "active" | "suspended" | "churned" | |
| plan_id | string (nullable) | |
| payment_status | "none" | "active" | "past_due" | "canceled" | |
| created_at | string (date-time) |
Project
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| user_id | string (uuid) | |
| org_id | string (uuid, nullable) | |
| org_client_id | string (uuid, nullable) | The agency client this project belongs to, if any |
| name | string | |
| description | string (nullable) | |
| status | "active" | "archived" | |
| template | string (nullable) | |
| tags | string[] | |
| starred | boolean | |
| is_public | boolean | |
| subdomain | string (nullable) | |
| custom_domain | string (nullable) | |
| custom_domain_status | string (nullable) | |
| published_url | string (nullable) | The live website address. Null until the project is published. |
| last_published_at | string (date-time, nullable) | |
| preview_image_url | string (nullable) | |
| created_at | string (date-time) | |
| updated_at | string (date-time) | |
| last_opened_at | string (date-time, nullable) |
Template
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| org_id | string (uuid) | |
| name | string | |
| description | string (nullable) | |
| category | string | |
| thumbnail_url | string (nullable) | |
| is_public | boolean | |
| is_featured | boolean | |
| created_at | string (date-time) |
Plan
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| name | string | |
| description | string (nullable) | |
| price | number | |
| interval | "monthly" | "yearly" | |
| max_sites | integer | |
| max_ai_messages_daily | integer | |
| can_export_code | boolean | |
| can_use_custom_domain | boolean | |
| is_active | boolean | |
| created_at | string (date-time) |
Analytics
| Field | Type | Notes |
|---|---|---|
| totalViews | integer | |
| uniqueVisitors | integer | |
| topPages | object[] | |
| topReferrers | object[] | |
| dailyViews | object[] | |
| deviceBreakdown | object[] |
Webhook
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| url | string (uri) | |
| events | string[] | |
| is_active | boolean | |
| created_at | string (date-time) |