https://app.evoriqa.com/api/v1/reseller/clients/{workspaceId}/limitsSet a client's limit overrides
Sets per-client overrides — each field nullable to inherit the plan value, optional to leave unchanged. Per-client API access is **not** settable here: it follows the organization's API-access decision (set by a platform admin), so no `apiAccess` field is accepted. A submitted `aiDisclosure*` field lands on the client's compliance timeline. The change is audited on the client. Rejected 422, in handler order, when: a plan-owned field (chatbots, team seats, knowledge sources, billed amount) is edited on a client with a live BYO Stripe subscription (the message names the plan); a limit is set below the client's current usage (the message names each count); a chatbot or team-seat override exceeds the client's own plan default (team seats are additionally capped at 50); or a knowledge-source override would overdraw the org's pooled source allocation (the message names the remaining headroom). Reseller endpoints additionally require the key to live on the organization owner's own (primary) workspace — any other workspace returns 403.
Requires scope reseller:write
Access is gated — enable it before your first call
The API is off by default. A request succeeds only when all three switches are on: the platform master switch (off by default), your organisation’s API toggle, and your plan or client entitlement. Any one off returns 403 API access is not enabled for this workspace.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
| workspaceId | path | string uuid | Required | — | The client workspace's id. |
Request body
Content type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
| maxChatbots | integer 1–100000, or null | Optional | Chatbot cap; null inherits the plan. |
| maxTeamMembers | integer 1–50, or null | Optional | Seat cap; null inherits. Capped at 50 (the resold-client seat ceiling). |
| maxKnowledgeSources | integer 1–1000000, or null | Optional | Source cap; null inherits. |
| agentHourlyCostCents | integer 0–1000000, or null | Optional | ROI cost rate override; null inherits. |
| aiDisclosureEnabled | boolean or null | Optional | AI-disclosure toggle; null inherits. |
| aiDisclosureText | string up to 300 chars, or null | Optional | AI-disclosure text; null inherits. |
| monthlyBilledCents | integer 0–100000000, or null | Optional | What you bill this client per month, in cents — powers the margin column; an edit re-arms the margin-erosion alert. null clears it (margin shows an em dash again). |
Request
curl -X POST "https://app.evoriqa.com/api/v1/reseller/clients/{workspaceId}/limits" \
-H "x-api-key: $EVORIQA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "maxChatbots": 5, "maxKnowledgeSources": 20 }'const res = await fetch("https://app.evoriqa.com/api/v1/reseller/clients/{workspaceId}/limits", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.EVORIQA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"maxChatbots": 5,
"maxKnowledgeSources": 20
}),
});
const responseBody = await res.json();import os
import requests
res = requests.post(
"https://app.evoriqa.com/api/v1/reseller/clients/{workspaceId}/limits",
headers={"Authorization": f"Bearer {os.environ['EVORIQA_API_KEY']}"},
json={
"maxChatbots": 5,
"maxKnowledgeSources": 20
},
)
body = res.json()Response
{
"success": true,
"data": {
"workspaceId": "d4c3b2a1-0f9e-4d8c-8b7a-6f5e4d3c2b1a"
}
}