FoxCue API: Brands and brand kits and Offerings and Calls to action and more
Request examples, parameters, scopes and response statuses for FoxCue API brands and brand kits and offerings and calls to action and more.
These operations are copied from the live OpenAPI schema at GET /api/v1/openapi.json (2026-10-28, 297 operations). Each example request is built from that operation's schema: required fields, and optional fields when the object is small. Response bodies are not in that schema. Where the JSON shape is known, it is listed below with an example. Shared errors are on Limits and errors.
Send Authorization: Bearer <workspace API key>. Base URL: https://app.foxcue.com/api/v1.
Brands and brand kits
GET /projects
List projects in this workspace
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | |
script_id | query | no | string | |
collection_id | query | no | string | |
scope_type | query | no | string | |
scope_id | query | no | string | |
kind | query | no | string | |
limit | query | no | string | |
offset | query | no | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/projects?project_id=example&script_id=example&collection_id=example&scope_type=example&scope_id=example&kind=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON array of these fields. limit is 1–100 (default 50) and offset starts at 0. The array has no total.
| Field | Type |
|---|---|
id | string |
org_id | string |
name | string |
slug | string |
domain | string |
description | string |
created_at | string |
updated_at | string |
styles_seeded | number |
accent_color | string |
logo_url | string |
brand_kit_json | string |
brand_kit_revision | number |
brand_kit_updated_at | string |
[
{
"id": "id",
"org_id": "workspace_id",
"name": "example",
"slug": "example",
"domain": "https://example.com",
"description": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"styles_seeded": 0,
"accent_color": "example",
"logo_url": "https://example.com",
"brand_kit_json": "example",
"brand_kit_revision": 0,
"brand_kit_updated_at": "2026-10-28T00:00:00.000Z"
}
]| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /projects
Create projects
Scope: brands:write.
Example request
{
"name": "example"
}Required fields: name.
curl -X POST "https://app.foxcue.com/api/v1/projects" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
name | string |
slug | string |
domain | string |
description | string |
created_at | string |
updated_at | string |
styles_seeded | number |
accent_color | string |
logo_url | string |
brand_kit_json | string |
brand_kit_revision | number |
brand_kit_updated_at | string |
{
"id": "id",
"org_id": "workspace_id",
"name": "example",
"slug": "example",
"domain": "https://example.com",
"description": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"styles_seeded": 0,
"accent_color": "example",
"logo_url": "https://example.com",
"brand_kit_json": "example",
"brand_kit_revision": 0,
"brand_kit_updated_at": "2026-10-28T00:00:00.000Z"
}| Status | Meaning |
|---|---|
201 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
GET /projects/{id}
Get projects
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/projects/example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
name | string |
slug | string |
domain | string |
description | string |
created_at | string |
updated_at | string |
styles_seeded | number |
accent_color | string |
logo_url | string |
brand_kit_json | string |
brand_kit_revision | number |
brand_kit_updated_at | string |
{
"id": "id",
"org_id": "workspace_id",
"name": "example",
"slug": "example",
"domain": "https://example.com",
"description": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"styles_seeded": 0,
"accent_color": "example",
"logo_url": "https://example.com",
"brand_kit_json": "example",
"brand_kit_revision": 0,
"brand_kit_updated_at": "2026-10-28T00:00:00.000Z"
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
PATCH /projects/{id}
Update projects
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"name": "example"
}curl -X PATCH "https://app.foxcue.com/api/v1/projects/example" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
name | string |
slug | string |
domain | string |
description | string |
created_at | string |
updated_at | string |
styles_seeded | number |
accent_color | string |
logo_url | string |
brand_kit_json | string |
brand_kit_revision | number |
brand_kit_updated_at | string |
{
"id": "id",
"org_id": "workspace_id",
"name": "example",
"slug": "example",
"domain": "https://example.com",
"description": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"styles_seeded": 0,
"accent_color": "example",
"logo_url": "https://example.com",
"brand_kit_json": "example",
"brand_kit_revision": 0,
"brand_kit_updated_at": "2026-10-28T00:00:00.000Z"
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
DELETE /projects/{id}
Delete projects
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X DELETE "https://app.foxcue.com/api/v1/projects/example" \
-H "Authorization: Bearer <workspace API key>"Response
Success returns no JSON body.
| Status | Meaning |
|---|---|
204 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
Offerings
GET /offerings
List offerings in this workspace
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | |
script_id | query | no | string | |
collection_id | query | no | string | |
scope_type | query | no | string | |
scope_id | query | no | string | |
kind | query | no | string | |
limit | query | no | string | |
offset | query | no | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/offerings?project_id=example&script_id=example&collection_id=example&scope_type=example&scope_id=example&kind=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON array of these fields. limit is 1–100 (default 50) and offset starts at 0. The array has no total.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
problem | string |
solution | string |
proof | string |
cta | string |
active | number |
created_at | string |
updated_at | string |
[
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"problem": "example",
"solution": "example",
"proof": "example",
"cta": "example",
"active": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z"
}
]| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /offerings
Create offerings
Scope: brands:write.
Example request
{
"project_id": "example",
"name": "example",
"active": 0
}Required fields: project_id, name.
curl -X POST "https://app.foxcue.com/api/v1/offerings" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
problem | string |
solution | string |
proof | string |
cta | string |
active | number |
created_at | string |
updated_at | string |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"problem": "example",
"solution": "example",
"proof": "example",
"cta": "example",
"active": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z"
}| Status | Meaning |
|---|---|
201 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
GET /offerings/{id}
Get offerings
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/offerings/example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
problem | string |
solution | string |
proof | string |
cta | string |
active | number |
created_at | string |
updated_at | string |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"problem": "example",
"solution": "example",
"proof": "example",
"cta": "example",
"active": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z"
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
PATCH /offerings/{id}
Update offerings
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"name": "example",
"active": 0
}curl -X PATCH "https://app.foxcue.com/api/v1/offerings/example" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
problem | string |
solution | string |
proof | string |
cta | string |
active | number |
created_at | string |
updated_at | string |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"problem": "example",
"solution": "example",
"proof": "example",
"cta": "example",
"active": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z"
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
DELETE /offerings/{id}
Delete offerings
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X DELETE "https://app.foxcue.com/api/v1/offerings/example" \
-H "Authorization: Bearer <workspace API key>"Response
Success returns no JSON body.
| Status | Meaning |
|---|---|
204 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
Calls to action
GET /ctas
List ctas in this workspace
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | |
script_id | query | no | string | |
collection_id | query | no | string | |
scope_type | query | no | string | |
scope_id | query | no | string | |
kind | query | no | string | |
limit | query | no | string | |
offset | query | no | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/ctas?project_id=example&script_id=example&collection_id=example&scope_type=example&scope_id=example&kind=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON array of these fields. limit is 1–100 (default 50) and offset starts at 0. The array has no total.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
text | string |
created_at | string |
updated_at | string |
is_default | number |
[
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"text": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"is_default": 0
}
]| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /ctas
Create ctas
Scope: brands:write.
Example request
{
"project_id": "example",
"name": "example",
"text": "example"
}Required fields: project_id, name, text.
curl -X POST "https://app.foxcue.com/api/v1/ctas" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
text | string |
created_at | string |
updated_at | string |
is_default | number |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"text": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"is_default": 0
}| Status | Meaning |
|---|---|
201 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
GET /ctas/{id}
Get ctas
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/ctas/example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
text | string |
created_at | string |
updated_at | string |
is_default | number |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"text": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"is_default": 0
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
PATCH /ctas/{id}
Update ctas
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"name": "example",
"text": "example"
}curl -X PATCH "https://app.foxcue.com/api/v1/ctas/example" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
name | string |
text | string |
created_at | string |
updated_at | string |
is_default | number |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"name": "example",
"text": "example",
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"is_default": 0
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
DELETE /ctas/{id}
Delete ctas
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X DELETE "https://app.foxcue.com/api/v1/ctas/example" \
-H "Authorization: Bearer <workspace API key>"Response
Success returns no JSON body.
| Status | Meaning |
|---|---|
204 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
Writing styles
GET /styles
List styles in this workspace
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | |
script_id | query | no | string | |
collection_id | query | no | string | |
scope_type | query | no | string | |
scope_id | query | no | string | |
kind | query | no | string | |
limit | query | no | string | |
offset | query | no | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/styles?project_id=example&script_id=example&collection_id=example&scope_type=example&scope_id=example&kind=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON array of these fields. limit is 1–100 (default 50) and offset starts at 0. The array has no total.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
collection_id | string |
name | string |
tone | string |
format | string |
length_target | string |
structure | string |
brand_voice | string |
dos | string |
donts | string |
cta | string |
examples | string |
is_default | number |
created_at | string |
updated_at | string |
system_key | string |
[
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"collection_id": "id",
"name": "example",
"tone": "example",
"format": "example",
"length_target": "example",
"structure": "example",
"brand_voice": "example",
"dos": "example",
"donts": "example",
"cta": "example",
"examples": "example",
"is_default": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"system_key": "example"
}
]| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /styles
Create styles
Scope: brands:write.
Example request
{
"project_id": "example",
"name": "example"
}Required fields: project_id, name.
curl -X POST "https://app.foxcue.com/api/v1/styles" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
collection_id | string |
name | string |
tone | string |
format | string |
length_target | string |
structure | string |
brand_voice | string |
dos | string |
donts | string |
cta | string |
examples | string |
is_default | number |
created_at | string |
updated_at | string |
system_key | string |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"collection_id": "id",
"name": "example",
"tone": "example",
"format": "example",
"length_target": "example",
"structure": "example",
"brand_voice": "example",
"dos": "example",
"donts": "example",
"cta": "example",
"examples": "example",
"is_default": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"system_key": "example"
}| Status | Meaning |
|---|---|
201 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
GET /styles/{id}
Get styles
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/styles/example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
collection_id | string |
name | string |
tone | string |
format | string |
length_target | string |
structure | string |
brand_voice | string |
dos | string |
donts | string |
cta | string |
examples | string |
is_default | number |
created_at | string |
updated_at | string |
system_key | string |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"collection_id": "id",
"name": "example",
"tone": "example",
"format": "example",
"length_target": "example",
"structure": "example",
"brand_voice": "example",
"dos": "example",
"donts": "example",
"cta": "example",
"examples": "example",
"is_default": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"system_key": "example"
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
PATCH /styles/{id}
Update styles
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"name": "example"
}curl -X PATCH "https://app.foxcue.com/api/v1/styles/example" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | string |
org_id | string |
project_id | string |
collection_id | string |
name | string |
tone | string |
format | string |
length_target | string |
structure | string |
brand_voice | string |
dos | string |
donts | string |
cta | string |
examples | string |
is_default | number |
created_at | string |
updated_at | string |
system_key | string |
{
"id": "id",
"org_id": "workspace_id",
"project_id": "id",
"collection_id": "id",
"name": "example",
"tone": "example",
"format": "example",
"length_target": "example",
"structure": "example",
"brand_voice": "example",
"dos": "example",
"donts": "example",
"cta": "example",
"examples": "example",
"is_default": 0,
"created_at": "2026-10-28T00:00:00.000Z",
"updated_at": "2026-10-28T00:00:00.000Z",
"system_key": "example"
}| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
DELETE /styles/{id}
Delete styles
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X DELETE "https://app.foxcue.com/api/v1/styles/example" \
-H "Authorization: Bearer <workspace API key>"Response
Success returns no JSON body.
| Status | Meaning |
|---|---|
204 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
Brands and brand kits
GET /projects/{id}/brand-kit
Read saved brand kit, revision and imported/manual provenance
Scope: brands:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/projects/example/brand-kit" \
-H "Authorization: Bearer <workspace API key>"Response
| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
PATCH /projects/{id}/brand-kit
Save the brand kit with a revision check: send kit (the whole kit) or changes (only the fields to change; house or guidelines null turns them off). A stale expected_revision returns 409
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"kit": {
"schema_version": 1,
"background_color": "#112233",
"text_color": "#112233",
"accent_color": "#112233",
"secondary_color": "#112233",
"title_font": "example",
"body_font": "example",
"logo_asset_id": "example",
"tone_of_voice": "example",
"audience": "example",
"positioning": "example",
"product_facts": "example",
"preferred_terms": "example",
"avoided_terms": "example",
"sources": [
{
"type": "website",
"url": "example",
"label": "example",
"imported_at": "example"
}
],
"house": {
"background": "plain",
"step_chip": true,
"caption": "boxed"
},
"guidelines": {
"do": [
"example"
],
"dont": [
"example"
],
"examples": [
{
"asset_id": "example",
"note": "example"
}
]
}
},
"changes": {
"background_color": "#112233",
"text_color": "#112233",
"accent_color": "#112233"
},
"expected_revision": 0,
"remove_legacy_logo": true
}Required fields: expected_revision.
curl -X PATCH "https://app.foxcue.com/api/v1/projects/example/brand-kit" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /projects/{id}/brand-kit/import-website
Import editable website candidate; does not approve it
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"url": "example"
}Required fields: url.
curl -X POST "https://app.foxcue.com/api/v1/projects/example/brand-kit/import-website" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /projects/{id}/brand-kit/import-logo
Copy public raster logo into owned workspace media
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"url": "example"
}Required fields: url.
curl -X POST "https://app.foxcue.com/api/v1/projects/example/brand-kit/import-logo" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
| Status | Meaning |
|---|---|
201 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
POST /projects/{id}/brand-kit/import-image
Import raster brand candidate; does not approve it
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
Body is raw bytes (image/png), not JSON.
curl -X POST "https://app.foxcue.com/api/v1/projects/example/brand-kit/import-image" \
-H "Authorization: Bearer <workspace API key>" \
--data-binary @fileResponse
| Status | Meaning |
|---|---|
201 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |
Calls to action
POST /ctas/{id}/default
Make this call to action the brand default; the previous default is cleared
Scope: brands:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X POST "https://app.foxcue.com/api/v1/ctas/example/default" \
-H "Authorization: Bearer <workspace API key>"Response
| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid request |
401 | Invalid, expired or revoked key |
403 | Missing scope |
404 | Resource not found in workspace |
409 | Revision or idempotency conflict |
429 | Rate or active-job limit exceeded |