https://app.evoriqa.com/api/v1/reseller/brandUpdate the brand
Updates white-label styling and sender identity. Requires an active reseller plan — a plan-less org returns 403. Logo upload is not in v1; set `logoUrl` instead. Landing-page settings are managed only in the dashboard: a body naming any `landing…` field is refused with 422 (`error.message`, and `error.details._`, is "Landing page settings are managed in the dashboard.") and nothing in it is applied. 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.
Request body
Content type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
| appName | string 1–120 chars | Optional | White-label product name. |
| logoUrl | string up to 2000 chars, uri, or null | Optional | Logo URL (http/https). |
| primaryColor | string matches ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ | Optional | Brand colour. |
| emailFromName | string 1–120 chars | Optional | Sender display name. No line breaks or the address delimiters " < > , (header-injection guard). |
| emailReplyTo | string up to 200 chars, email, or null | Optional | Reply-to address. |
| supportUrl | string up to 2000 chars, uri, or null | Optional | Support link shown to clients (http/https). |
| showPoweredBy | boolean | Optional | Show the “powered by” footer. |
| selfServeSignup | boolean | Optional | Let visitors sign themselves up as clients on the org's custom domain. Takes effect only while that domain is live; a live domain is invite-only until this is on. |
| selfServePlan | string one of free · starter · pro | Optional | Platform plan a self-serve client's workspace starts on. A paid default is credit-metered from the reseller's pool and stays unfunded until credits are allocated — no subscription is created at sign-up. |
| selfServeKnowledgeSources | integer 1–1000000, or null | Optional | Knowledge-source limit each self-serve sign-up gets; null = the plan default. Each sign-up reserves it from the org's source pool, and sign-ups close when the pool can't fund it. |
Request
curl -X PUT "https://app.evoriqa.com/api/v1/reseller/brand" \
-H "x-api-key: $EVORIQA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "appName": "AcmeBot", "primaryColor": "#0f62fe", "selfServeSignup": true, "selfServePlan": "free" }'const res = await fetch("https://app.evoriqa.com/api/v1/reseller/brand", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.EVORIQA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"appName": "AcmeBot",
"primaryColor": "#0f62fe",
"selfServeSignup": true,
"selfServePlan": "free"
}),
});
const responseBody = await res.json();import os
import requests
res = requests.put(
"https://app.evoriqa.com/api/v1/reseller/brand",
headers={"Authorization": f"Bearer {os.environ['EVORIQA_API_KEY']}"},
json={
"appName": "AcmeBot",
"primaryColor": "#0f62fe",
"selfServeSignup": True,
"selfServePlan": "free"
},
)
body = res.json()Response
{
"success": true,
"data": {
"appName": "AcmeBot",
"logoUrl": "https://cdn.acme.com/logo.png",
"primaryColor": "#0f62fe",
"emailFromName": "Acme Support",
"emailReplyTo": "support@acme.com",
"supportUrl": "https://acme.com/support",
"showPoweredBy": false,
"isCustom": true,
"selfServeSignup": false,
"selfServePlan": "free",
"selfServeKnowledgeSources": null
}
}