FoxCue API: Strategy, keywords and citation checks
Request examples, parameters, scopes and response statuses for FoxCue API strategy, keywords and citation checks.
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.
Strategy, keywords and citation checks
GET /strategy/silos
List strategy silos; optional project_id
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | minLength 1 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos?project_id=example" \
-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 |
POST /strategy/silos
Create an audience/workflow strategy silo
Scope: strategy:write.
Example request
{
"project_id": "example",
"name": "example",
"objective": "example",
"audience": "example",
"geography": "example",
"language": "example"
}Required fields: project_id, name, objective.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos" \
-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 |
GET /strategy/silos/{id}
Read silo and source IDs; source metadata additionally requires knowledge:read, source bodies use Knowledge GET
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example" \
-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 /strategy/silos/{id}
Update silo with revision check
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"name": "example",
"objective": "example",
"audience": "example",
"geography": "example",
"language": "example",
"expected_revision": 0,
"status": "active"
}Required fields: expected_revision.
curl -X PATCH "https://app.foxcue.com/api/v1/strategy/silos/example" \
-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 |
PUT /strategy/silos/{id}/sources
Replace only manually owned silo sources with revision CAS; preserve connection subscriptions
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"source_ids": [
"example"
],
"expected_revision": 0
}Required fields: source_ids, expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/silos/example/sources" \
-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 |
GET /strategy/silos/{id}/coverage
Read factual audience/workflow topic coverage (not demand scores)
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/coverage" \
-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 |
GET /strategy/topics
List topics in required silo_id
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
silo_id | query | yes | string | minLength 1 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/topics?silo_id=example" \
-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 |
POST /strategy/topics
Create a silo topic
Scope: strategy:write.
Example request
{
"silo_id": "example",
"title": "example",
"question": "example",
"industry_id": "example",
"workflow_id": "example",
"audience_role_id": "example"
}Required fields: silo_id, title, question.
curl -X POST "https://app.foxcue.com/api/v1/strategy/topics" \
-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 |
GET /strategy/topics/{id}
Read topic, targets, evidence and briefs
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/topics/example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
topic | JSON |
targets | JSON |
evidence | JSON |
briefs | JSON |
{
"topic": "example",
"targets": "example",
"evidence": "example",
"briefs": "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 /strategy/topics/{id}
Update topic with revision check
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0,
"industry_id": "example",
"workflow_id": "example",
"audience_role_id": "example"
}Required fields: expected_revision.
curl -X PATCH "https://app.foxcue.com/api/v1/strategy/topics/example" \
-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 /strategy/topics/{id}/targets
Add a manually supplied or suggested query target
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"text": "example",
"platform": "google",
"locale": "example",
"origin": "manual"
}Required fields: text.
curl -X POST "https://app.foxcue.com/api/v1/strategy/topics/example/targets" \
-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 /strategy/topics/{id}/evidence
Add evidence with metric/unit/method provenance
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"title": "example",
"kind": "search",
"notes": "example",
"url": "example"
}Required fields: title.
curl -X POST "https://app.foxcue.com/api/v1/strategy/topics/example/evidence" \
-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 /strategy/topics/{id}/briefs
Create a revisioned content brief
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"title": "example",
"primary_question": "example",
"answer_requirements": [
{
"approval_id": "example",
"target_id": "example",
"topic_id": "example",
"source_id": "example",
"source_revision": 1,
"question": "example",
"entities": [
"example"
],
"required_answers": [
"example"
]
}
],
"article_lineage": {
"project_id": "example",
"source": {
"id": "example",
"title": "example",
"revision": 0,
"revision_id": "example",
"page_id": "example"
},
"targets": [
{
"id": "example",
"text": "example",
"platform": "example",
"locale": "example",
"topic_id": "example"
}
],
"topic_ids": [
"example"
],
"target_hash": "example"
},
"planning_silo_id": "example"
}Required fields: title, primary_question.
curl -X POST "https://app.foxcue.com/api/v1/strategy/topics/example/briefs" \
-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 |
GET /strategy/briefs/{id}
Read content brief and review state
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/briefs/example" \
-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 /strategy/briefs/{id}
Revise a content brief
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0,
"answer_requirements": [
{
"approval_id": "example",
"target_id": "example",
"topic_id": "example",
"source_id": "example",
"source_revision": 1,
"question": "example",
"entities": [
"example"
],
"required_answers": [
"example"
]
}
],
"article_lineage": {
"project_id": "example",
"source": {
"id": "example",
"title": "example",
"revision": 0,
"revision_id": "example",
"page_id": "example"
},
"targets": [
{
"id": "example",
"text": "example",
"platform": "example",
"locale": "example",
"topic_id": "example"
}
],
"topic_ids": [
"example"
],
"target_hash": "example"
},
"planning_silo_id": "example"
}Required fields: expected_revision.
curl -X PATCH "https://app.foxcue.com/api/v1/strategy/briefs/example" \
-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 |
GET /strategy/briefs/{id}/context
Preview selected generation context and its hash
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/briefs/example/context" \
-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 |
POST /strategy/briefs/{id}/content
Create one draft from a reviewed brief/context hash; body idempotency_key required
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0,
"context_hash": "example-value",
"idempotency_key": "example-"
}Required fields: expected_revision, context_hash, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/briefs/example/content" \
-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 |
|---|---|
script_id | JSON |
script_url | string |
context_snapshot_id | JSON |
{
"script_id": "id",
"script_url": "https://example.com",
"context_snapshot_id": "id"
}| 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 /strategy/dimensions
List shared brand dimensions and workflow parents
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/dimensions?project_id=example" \
-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 |
POST /strategy/dimensions
Create or reuse a shared industry/workflow/audience role/journey stage
Scope: strategy:write.
Example request
{
"project_id": "example",
"kind": "industry",
"name": "example"
}Required fields: project_id, kind, name.
curl -X POST "https://app.foxcue.com/api/v1/strategy/dimensions" \
-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 |
GET /strategy/totals
Count distinct canonical brand intents and existing script deliverables
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/totals?project_id=example" \
-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 |
PUT /strategy/silos/{id}/scope
Replace typed scope with explicit workflow descendant inclusion and revision guard
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"industry_ids": [
"example"
],
"workflow_ids": [
"example"
],
"audience_role_ids": [
"example"
],
"include_workflow_descendants": true,
"expected_revision": 0
}Required fields: industry_ids, workflow_ids, audience_role_ids, include_workflow_descendants, expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/silos/example/scope" \
-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 |
PUT /strategy/topics/{id}/silos/{siloId}
Link an existing canonical topic to another same-brand silo
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string | |
siloId | path | yes | string |
Example request
{
"expected_revision": 0
}Required fields: expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/topics/example/silos/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 |
|---|---|
topic | JSON |
targets | JSON |
evidence | JSON |
briefs | JSON |
{
"topic": "example",
"targets": "example",
"evidence": "example",
"briefs": "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 /strategy/topics/{id}/silos/{siloId}
Archive a topic membership; retain authored brief and legacy lineage
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string | |
siloId | path | yes | string |
Example request
{
"expected_revision": 0
}Required fields: expected_revision.
curl -X DELETE "https://app.foxcue.com/api/v1/strategy/topics/example/silos/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 |
|---|---|
topic | JSON |
targets | JSON |
evidence | JSON |
briefs | JSON |
{
"topic": "example",
"targets": "example",
"evidence": "example",
"briefs": "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 |
PUT /strategy/workflows/{id}/parent
Set or clear one same-brand workflow parent with cycle and revision checks
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"parent_id": "example",
"expected_revision": 0
}Required fields: parent_id, expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/workflows/example/parent" \
-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 /strategy/silos/{id}/source-links
Add source links with origin and revision CAS
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"document_ids": [
"example"
],
"origin": "manual",
"connection_id": "example",
"expected_revision": 0
}Required fields: document_ids, origin, expected_revision.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/source-links" \
-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 /strategy/silos/{id}/source-exclusions
Exclude one connection source so future refresh does not restore it
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"document_id": "example",
"connection_id": "example",
"expected_revision": 0
}Required fields: document_id, connection_id, expected_revision.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/source-exclusions" \
-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 /strategy/silos/{id}/source-unlink
Unlink one canonical source from this silo with revision CAS; preserve documents, other silos and automatic-owner exclusions
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"document_id": "example",
"expected_revision": 0
}Required fields: document_id, expected_revision.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/source-unlink" \
-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 |
GET /strategy/growth/workspace
Read scoped page discovery, approved targets and sampled citation evidence; knowledge/performance access is revalidated
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | yes | string | minLength 1; maxLength 100 |
source_id | query | no | string | minLength 1; maxLength 100 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/growth/workspace?project_id=example&silo_id=example&source_id=example" \
-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 |
GET /strategy/growth/history
Read captured answers and exact source/video citation history for approved targets
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | yes | string | minLength 1; maxLength 100 |
source_id | query | no | string | minLength 1; maxLength 100 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/growth/history?project_id=example&silo_id=example&source_id=example" \
-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 |
POST /strategy/growth/discover
Discover proposed keywords and buyer questions from current public sources; additionally requires knowledge:read and generation:write
Scope: strategy:write.
Example request
{
"project_id": "example",
"silo_id": "example",
"source_id": "example",
"idempotency_key": "example-",
"expected_source_revision": 1
}Required fields: project_id, silo_id, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/growth/discover" \
-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 /strategy/growth/approve
Explicitly approve edited discovery candidates or dismiss them with source revision and idempotency preconditions
Scope: strategy:write.
Example request
{
"project_id": "example",
"silo_id": "example",
"source_id": "example",
"discovery_id": "example",
"idempotency_key": "example-",
"expected_source_revision": 1,
"locale": "example",
"candidates": [
{
"id": "example",
"action": "approve",
"text": "example",
"question": "example",
"entities": [
"example"
],
"required_answers": [
"example"
]
}
]
}Required fields: project_id, silo_id, discovery_id, idempotency_key, candidates.
curl -X POST "https://app.foxcue.com/api/v1/strategy/growth/approve" \
-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 /strategy/growth/checks
Run bounded paid AI citation checks on approved targets; preserve the same idempotency key after uncertain acknowledgment
Scope: performance:write.
Example request
{
"project_id": "example",
"silo_id": "example",
"source_id": "example",
"idempotency_key": "example-",
"target_ids": [
"example"
],
"engines": [
"chatgpt"
],
"max_cost_usd": 0.01
}Required fields: project_id, silo_id, idempotency_key, target_ids, engines.
curl -X POST "https://app.foxcue.com/api/v1/strategy/growth/checks" \
-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 /strategy/growth/schedules
Schedule approved-target checks under an explicit cadence and finite spend budget
Scope: performance:write.
Example request
{
"project_id": "example",
"silo_id": "example",
"source_id": "example",
"idempotency_key": "example-",
"target_ids": [
"example"
],
"engines": [
"chatgpt"
],
"cadence_hours": 24,
"max_cost_usd": 0.01,
"budget_usd": 0.01
}Required fields: project_id, silo_id, idempotency_key, target_ids, engines, cadence_hours, max_cost_usd, budget_usd.
curl -X POST "https://app.foxcue.com/api/v1/strategy/growth/schedules" \
-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 |
PATCH /strategy/growth/schedules/{id}
Pause or resume a scoped citation schedule
Scope: performance:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"project_id": "example",
"silo_id": "example",
"source_id": "example",
"paused": true
}Required fields: project_id, silo_id, paused.
curl -X PATCH "https://app.foxcue.com/api/v1/strategy/growth/schedules/example" \
-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 |
GET /strategy/articles/{sourceId}/silos
Read actual article silo memberships; also requires knowledge:read
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
sourceId | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/articles/example/silos" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
source_id | JSON |
project_id | JSON |
page_scope_id | JSON |
silos | JSON |
{
"source_id": "id",
"project_id": "id",
"page_scope_id": "id",
"silos": "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 |
GET /strategy/silos/{siloId}/articles/{sourceId}
Read current public article and authored keyword targets; also requires knowledge:read
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
sourceId | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/articles/example" \
-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 |
POST /strategy/silos/{siloId}/articles/{sourceId}/keywords
Save a manual article keyword and explicit topic/page association; also requires strategy:read and knowledge:read. No demand measurement is implied
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
sourceId | path | yes | string |
Example request
{
"text": "example",
"platform": "google",
"locale": "example",
"topic_id": "example",
"expected_source_revision": 0,
"idempotency_key": "example-"
}Required fields: text, expected_source_revision, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/articles/example/keywords" \
-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 |
DELETE /strategy/silos/{siloId}/articles/{sourceId}/keywords/{targetId}
Archive this article keyword association with current target hash; retain target/topic history. Also requires strategy:read and knowledge:read
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
sourceId | path | yes | string | |
targetId | path | yes | string |
Example request
{
"expected_target_hash": "example-value"
}Required fields: expected_target_hash.
curl -X DELETE "https://app.foxcue.com/api/v1/strategy/silos/example/articles/example/keywords/example" \
-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 |
GET /strategy/silos/{siloId}/articles/{sourceId}/decision-plan
Read latest authorized article-focused video ideas for the selected target set; also requires knowledge:read
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
sourceId | path | yes | string | |
target_ids | query | no | string | maxLength 20199 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/articles/example/decision-plan?target_ids=example" \
-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 |
GET /strategy/silos/{siloId}/opportunities
List current authorized video ideas across latest page/keyword and question scopes. Also requires knowledge:read. Pagination counts scope plans, not candidates
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
limit | query | no | integer | minimum 1; maximum 20 |
include_earlier | query | no | ||
offset | query | no | integer | minimum 0; maximum 100000 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/opportunities?limit=example&include_earlier=example&offset=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
items | array |
plans | JSON |
has_more | boolean |
limit | number |
offset | number |
{
"items": [],
"plans": "example",
"has_more": false,
"limit": 0,
"offset": 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 /strategy/silos/{siloId}/opportunities/find
Find video opportunities for explicit active silo questions or an exact article/keyword revision. Also requires strategy:read, knowledge:read and generation:write. Uses the configured bounded model budget
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string |
Example request
{
"input": {
"silo_id": "example",
"current": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"comparison": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"capacity_minutes": 1,
"max_videos": 1,
"policy_version": "example",
"idempotency_key": "example-",
"discovery_mode": "silo_gaps",
"max_suggestions": 1,
"topic_ids": [
"example"
]
},
"format_limits": {
"educational": 0,
"walkthrough": 0,
"demo": 0,
"comparison": 0,
"short": 0
}
}Required fields: input.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/opportunities/find" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
| Status | Meaning |
|---|---|
202 | 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 /strategy/videos/capabilities
Discover authored video stages, formats, declaration proof and retention boundaries
Scope: strategy:read.
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/videos/capabilities" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
canonical_identity | boolean |
stages | JSON |
formats | JSON |
publication_providers | array |
publication_declarations | string |
automatic_publishing | boolean |
provider_history | string |
authored_history | string |
private_analytics_access | string |
{
"canonical_identity": false,
"stages": "example",
"formats": "example",
"publication_providers": [],
"publication_declarations": "example",
"automatic_publishing": false,
"provider_history": "example",
"authored_history": "example",
"private_analytics_access": "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 |
GET /strategy/videos
List canonical authored deliverables; silo and intent filters never clone a video
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | minLength 1; maxLength 100 |
silo_id | query | no | string | minLength 1; maxLength 100 |
topic_id | query | no | string | minLength 1; maxLength 100 |
stage | query | no | string | one of planned, scripting, production, ready_to_publish, published, archived |
format | query | no | string | one of educational, walkthrough, demo, comparison, short |
published | query | no | string | one of true, false |
q | query | no | string | maxLength 200 |
limit | query | no | integer | minimum 1; maximum 100 |
offset | query | no | integer | minimum 0; maximum 100000 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/videos?project_id=example&silo_id=example&topic_id=example&stage=example&format=example&published=example" \
-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 |
POST /strategy/videos
Plan one intentional video format with existing intent/silo IDs and a stable body request key
Scope: strategy:write.
Example request
{
"project_id": "example",
"planning_silo_id": "example",
"topic_ids": [
"example"
],
"silo_ids": [
"example"
],
"label": "example",
"format": "educational",
"idempotency_key": "example-"
}Required fields: project_id, planning_silo_id, topic_ids, silo_ids, format, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/videos" \
-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 /strategy/videos/intake-publication
Atomically classify a new authored video and record its user-reported YouTube URL/date; duplicate or invalid declarations leave no planned item
Scope: strategy:write.
Example request
{
"project_id": "example",
"planning_silo_id": "example",
"topic_ids": [
"example"
],
"silo_ids": [
"example"
],
"label": "example",
"format": "educational",
"idempotency_key": "example-",
"url": "example",
"published_at": "example"
}Required fields: project_id, planning_silo_id, topic_ids, silo_ids, format, idempotency_key, url, published_at.
curl -X POST "https://app.foxcue.com/api/v1/strategy/videos/intake-publication" \
-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 |
GET /strategy/videos/{id}
Read authored identity, typed lineage and transition history; provider proof additionally requires performance:read
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/videos/example" \
-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 /strategy/videos/{id}/stage
Change production stage using revision and reason; render completion alone cannot publish
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"stage": "planned",
"expected_revision": 0,
"reason": "example"
}Required fields: stage, expected_revision, reason.
curl -X PATCH "https://app.foxcue.com/api/v1/strategy/videos/example/stage" \
-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 |
PUT /strategy/videos/{id}/classification
Revise authored label and intent/silo associations with CAS; archived associations retain history
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"planning_silo_id": "example",
"topic_ids": [
"example"
],
"silo_ids": [
"example"
],
"label": "example",
"expected_revision": 0
}Required fields: planning_silo_id, topic_ids, silo_ids, expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/videos/example/classification" \
-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 |
PUT /strategy/videos/{id}/lineage
Attach existing same-brand brief/script/video-output IDs without copying production work
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"brief_ids": [
"example"
],
"script_ids": [
"example"
],
"output_ids": [
"example"
],
"expected_revision": 0
}Required fields: expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/videos/example/lineage" \
-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 /strategy/videos/{id}/publications
Declare a supported YouTube URL and publication date as user-reported with revision and request key; never uploads
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"url": "example",
"published_at": "example",
"expected_revision": 0,
"idempotency_key": "example-"
}Required fields: url, published_at, expected_revision, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/videos/example/publications" \
-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 /strategy/publications/{id}/adopt
Classify visible imported Performance inventory; additionally requires performance:read; provider metadata stays revocable
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"project_id": "example",
"planning_silo_id": "example",
"topic_ids": [
"example"
],
"silo_ids": [
"example"
],
"label": "example",
"format": "educational",
"idempotency_key": "example-"
}Required fields: project_id, planning_silo_id, topic_ids, silo_ids, format, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/publications/example/adopt" \
-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 |
GET /strategy/policy
Read inherited brand/silo editorial policy and estimated effort templates
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | no | string | minLength 1; maxLength 100 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/policy?project_id=example&silo_id=example" \
-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 |
PUT /strategy/policy
Save sparse authored policy overrides with revision guard; objective remains qualified leads and demos
Scope: strategy:write.
Example request
{
"project_id": "example",
"silo_id": "example",
"expected_revision": 0,
"overrides": {
"min_buyer_fit": 2,
"min_solution_fit": 2,
"weights": {
"buyer_fit": 0,
"solution_fit": 0,
"need_support": 0,
"outcome_support": 0,
"video_suitability": 0,
"differentiation": 0
},
"max_evidence_age_days": 1,
"exploration_slots": 0
},
"effort_templates": {
"educational": 1,
"walkthrough": 1,
"demo": 1,
"comparison": 1,
"short": 1
},
"planning_defaults": {
"capacity_minutes": 1,
"max_videos": 1
}
}Required fields: project_id, expected_revision, overrides, effort_templates.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/policy" \
-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 | JSON |
revision | JSON |
{
"id": "id",
"revision": "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 |
GET /strategy/policy/history
Read paginated authored policy revisions
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | no | string | minLength 1; maxLength 100 |
limit | query | no | integer | minimum 1; maximum 100 |
offset | query | no | integer | minimum 0; maximum 100000 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/policy/history?project_id=example&silo_id=example&limit=example&offset=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
items | array |
has_more | boolean |
limit | number |
offset | number |
{
"items": [],
"has_more": false,
"limit": 0,
"offset": 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 /strategy/candidates/{id}/accept
Accept an authorized decision candidate with revision and stable request identity; evidence access remains required
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"planning_silo_id": "example",
"expected_revision": 0,
"idempotency_key": "example-"
}Required fields: planning_silo_id, expected_revision, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/candidates/example/accept" \
-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 /strategy/videos/{id}/script
Resume staged brief/draft/optional generation handoff; also requires scripts:write, knowledge:read, and generation:write when generating
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0,
"generate": true,
"generation_mode": "single",
"writing_skill": {
"ref": "example",
"revision": "example"
},
"length_target": "example",
"model": "example",
"idempotency_key": "example-"
}Required fields: expected_revision, generate, generation_mode, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/videos/example/script" \
-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 |
GET /strategy/generation-jobs/{id}
Read the existing durable generation command and retained draft result
Scope: jobs:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/generation-jobs/example" \
-H "Authorization: Bearer <workspace API key>"Response
A job is JSON with these fields. operation is one of script.generate, script.generate_long, article.generate, slides.generate, or video.render. status is queued, running, done, error, or cancelled.
| Field | Type |
|---|---|
id | string |
operation | string |
status | string |
stage | string |
result | object or null |
error_code | string or null |
created_at | string |
updated_at | string |
{
"id": "id",
"operation": "script.generate",
"status": "queued",
"stage": "example",
"result": null,
"error_code": null,
"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 /strategy/generation-jobs/{id}/cancel
Cancel the existing durable command; uncertain started work is never automatically retried
Scope: jobs:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X POST "https://app.foxcue.com/api/v1/strategy/generation-jobs/example/cancel" \
-H "Authorization: Bearer <workspace API key>"Response
A job is JSON with these fields. operation is one of script.generate, script.generate_long, article.generate, slides.generate, or video.render. status is queued, running, done, error, or cancelled.
| Field | Type |
|---|---|
id | string |
operation | string |
status | string |
stage | string |
result | object or null |
error_code | string or null |
created_at | string |
updated_at | string |
{
"id": "id",
"operation": "script.generate",
"status": "queued",
"stage": "example",
"result": null,
"error_code": null,
"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 |
GET /strategy/decisions/configuration
Read AI availability and UTC suggestion usage; workspace allowances are not enforced during evaluation
Scope: strategy: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/strategy/decisions/configuration?project_id=example&script_id=example&collection_id=example&scope_type=example&scope_id=example&kind=example" \
-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 |
PUT /strategy/decisions/configuration
Compatibility settings only; saved allowance fields do not restrict evaluation suggestions. Owner-only; additionally requires generation:write
Scope: strategy:write.
Example request
{
"expected_revision": 0,
"enabled": true,
"daily_token_budget": 0,
"max_calls_per_run": 1,
"model": "example"
}Required fields: expected_revision, enabled, daily_token_budget, max_calls_per_run.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/decisions/configuration" \
-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 |
|---|---|
revision | JSON |
{
"revision": "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 |
GET /strategy/decisions/runs
List durable strategy run receipts
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | no | string | minLength 1; maxLength 100 |
source_id | query | no | string | minLength 1; maxLength 100 |
target_ids | query | no | ||
limit | query | no | integer | minimum 1; maximum 100 |
offset | query | no | integer | minimum 0; maximum 100000 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/decisions/runs?project_id=example&silo_id=example&source_id=example&target_ids=example&limit=example&offset=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
items | array |
has_more | boolean |
limit | number |
offset | number |
{
"items": [],
"has_more": false,
"limit": 0,
"offset": 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 /strategy/decisions/runs
Queue a qualified-leads-and-demos portfolio; additionally requires strategy:read, knowledge:read, generation:write and current private evidence permissions
Scope: strategy:write.
Example request
{
"input": {
"silo_id": "example",
"current": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"comparison": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"capacity_minutes": 1,
"max_videos": 1,
"policy_version": "example",
"idempotency_key": "example-",
"discovery_mode": "silo_gaps",
"max_suggestions": 1,
"topic_ids": [
"example"
]
},
"format_limits": {
"educational": 0,
"walkthrough": 0,
"demo": 0,
"comparison": 0,
"short": 0
}
}Required fields: input.
curl -X POST "https://app.foxcue.com/api/v1/strategy/decisions/runs" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
| Status | Meaning |
|---|---|
202 | 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 /strategy/decisions/runs/{id}
Read a safe decision run receipt
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/decisions/runs/example" \
-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 |
POST /strategy/decisions/runs/{id}/cancel
Cancel queued/running planning and fence late output
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{}curl -X POST "https://app.foxcue.com/api/v1/strategy/decisions/runs/example/cancel" \
-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 |
GET /strategy/decisions/plans/{id}
Read saved portfolio with evidence revalidation; restricted or stale context never returns private payload
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/decisions/plans/example" \
-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 |
GET /strategy/decisions/plans/{id}/evidence
Read exact private feature values, sample bases, source references and windows after current plan evidence revalidation; additionally requires knowledge:read and included private evidence permissions
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/decisions/plans/example/evidence" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
plan_id | JSON |
evidence_state | JSON |
context | null |
{
"plan_id": "id",
"evidence_state": "example",
"context": null
}| 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 |
GET /strategy/silos/{id}/decision-plan
Read current saved portfolio, preserving the previous plan after a failed refresh
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/decision-plan" \
-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 |
POST /strategy/candidates/{id}/feedback
Save, defer, dismiss, restore or override effort with revision checks; effort overrides require a reason
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0,
"action": "save",
"reason": "example",
"effort_minutes": 1
}Required fields: expected_revision, action.
curl -X POST "https://app.foxcue.com/api/v1/strategy/candidates/example/feedback" \
-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 | JSON |
revision | JSON |
state | JSON |
{
"id": "id",
"revision": "example",
"state": "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 /strategy/prompt-targets
List authored prompt families and target links; these are not observed queries or demand
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
silo_id | query | no | string | minLength 1; maxLength 256 |
intent_id | query | no | string | minLength 1; maxLength 256 |
after_id | query | no | string | minLength 1; maxLength 256 |
limit | query | no | integer | minimum 1; maximum 500 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/prompt-targets?project_id=example&silo_id=example&intent_id=example&after_id=example&limit=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
targets | JSON |
next_cursor | JSON |
{
"targets": "example",
"next_cursor": "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 |
PUT /strategy/prompt-targets
Create or explicitly revise an authored prompt target using CAS and an idempotent request key
Scope: strategy:write.
Example request
{
"project_id": "example",
"expected_revision": 0,
"text": "example",
"intent_ids": [
"example"
],
"origin": "human",
"engine": "example",
"surface": "example",
"locale": "example",
"idempotency_key": "example-",
"id": "example",
"silo_ids": [
"example"
],
"model": "example"
}Required fields: project_id, expected_revision, text, intent_ids, origin, engine, surface, locale, idempotency_key.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/prompt-targets" \
-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 |
GET /strategy/prompt-targets/{id}
Read one current authored prompt target and independent canonical associations
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/prompt-targets/example" \
-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 |
GET /strategy/intents
Enumerate the complete canonical intent universe through active relational memberships
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | no | string | minLength 1; maxLength 100 |
status | query | no | string | one of proposed, confirmed |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/intents?project_id=example&silo_id=example&status=example" \
-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 |
GET /strategy/intent-mappings
Review typed proposed/confirmed intent relationships; private links require current performance grants
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 100 |
silo_id | query | no | string | minLength 1; maxLength 100 |
status | query | no | string | one of proposed, confirmed |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/intent-mappings?project_id=example&silo_id=example&status=example" \
-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 |
POST /strategy/intent-mappings/propose
Suggest links using retained vectors or honest lexical matching; never calls a provider or changes observations
Scope: strategy:write.
Example request
{
"project_id": "example",
"observation_batch_ids": [
"example"
],
"source_revision_ids": [
"example"
]
}Required fields: project_id, observation_batch_ids, source_revision_ids.
curl -X POST "https://app.foxcue.com/api/v1/strategy/intent-mappings/propose" \
-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 /strategy/intent-mappings/index
Explicit semantic indexing opt-in; additionally requires generation:write, evidence permissions and a configured bounded budget fence
Scope: strategy:write.
Example request
{
"project_id": "example",
"observation_batch_ids": [
"example"
],
"source_revision_ids": [
"example"
],
"semantic_indexing": true,
"max_batches": 1,
"max_characters": 1
}Required fields: project_id, observation_batch_ids, source_revision_ids, semantic_indexing, max_batches, max_characters.
curl -X POST "https://app.foxcue.com/api/v1/strategy/intent-mappings/index" \
-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 |
|---|---|
created | JSON |
reused | JSON |
pending | JSON |
warnings | array |
{
"created": "example",
"reused": "example",
"pending": "example",
"warnings": []
}| 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 /strategy/intent-mappings/{id}/confirm
Confirm current evidence with CAS; title-only video coverage becomes explicit human classification
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0
}Required fields: expected_revision.
curl -X POST "https://app.foxcue.com/api/v1/strategy/intent-mappings/example/confirm" \
-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 /strategy/intent-mappings/{id}/re-review
Explicitly recapture retained confirmed support as proposed with CAS and current evidence permissions; preserve prior confirmation audit, then require confirmation
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 0
}Required fields: expected_revision.
curl -X POST "https://app.foxcue.com/api/v1/strategy/intent-mappings/example/re-review" \
-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 /strategy/intents/merge
Explicit same-brand CAS merge retaining aliases, original briefs, lineage and history; never automatically merges
Scope: strategy:write.
Example request
{
"survivor_id": "example",
"merged_ids": [
"example"
],
"expected_revisions": {}
}Required fields: survivor_id, merged_ids, expected_revisions.
curl -X POST "https://app.foxcue.com/api/v1/strategy/intents/merge" \
-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 |
|---|---|
survivor_id | JSON |
{
"survivor_id": "id"
}| 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 /strategy/intents/split
Explicit CAS split of selected mapping IDs into a new topic identity; retain original brief and mapping audit references
Scope: strategy:write.
Example request
{
"intent_id": "example",
"expected_revision": 0,
"title": "example",
"question": "example",
"labels": {
"industry_id": "example",
"workflow_id": "example",
"audience_role_id": "example",
"journey_stage_id": "example"
},
"mapping_ids": [
"example"
],
"expected_mapping_revisions": {}
}Required fields: intent_id, expected_revision, title, question, mapping_ids, expected_mapping_revisions.
curl -X POST "https://app.foxcue.com/api/v1/strategy/intents/split" \
-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 |
|---|---|
original_id | JSON |
intent_id | JSON |
{
"original_id": "id",
"intent_id": "id"
}| 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 /strategy/silos/{siloId}/keyword-runs
Start a keyword research run (discover, enrich or refresh) for a silo. Budget defaults to $1 discover/refresh and $0.50 enrich (max $10); the run stops before passing it. One active run per silo; body idempotency_key required. Also requires strategy:read and generation:write
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string |
Example request
{
"kind": "discover",
"seeds": [
"example"
],
"budget_usd": 0.01,
"depth": "quick",
"idempotency_key": "example-"
}Required fields: kind, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/keyword-runs" \
-H "Authorization: Bearer <workspace API key>" \
-H "Content-Type: application/json" \
-d @body.jsonResponse
| Status | Meaning |
|---|---|
202 | 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 /strategy/keyword-runs/{runId}
Poll a keyword research run: status, stage, progress counts, budget_usd and spent_usd (provider-reported spend from receipts)
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
runId | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/keyword-runs/example" \
-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 |
GET /strategy/silos/{siloId}/keywords
Read keyword research results for a silo: latest run, keyword groups, targeted summary and brand channels
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/keywords" \
-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 |
GET /strategy/silos/{siloId}/keyword-groups/{groupId}
Read one keyword group with its searches, measurements and next step
Scope: strategy:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
groupId | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/strategy/silos/example/keyword-groups/example" \
-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 |
PUT /strategy/silos/{siloId}/keyword-targets
Target keywords: choose groups and the searches inside them to target, or exclude/keep groups. Also requires strategy:read
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string |
Example request
{
"targeted": [
{
"group_id": "example",
"keywords": [
"example"
]
}
],
"excluded_group_ids": [
"example"
],
"kept_group_ids": [
"example"
],
"idempotency_key": "example-"
}Required fields: targeted, idempotency_key.
curl -X PUT "https://app.foxcue.com/api/v1/strategy/silos/example/keyword-targets" \
-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 /strategy/silos/{siloId}/keyword-groups/{groupId}/opportunity
Add a keyword group to this silo's video opportunities; body idempotency_key required. Also requires strategy:read and knowledge:read
Scope: strategy:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
siloId | path | yes | string | |
groupId | path | yes | string |
Example request
{
"idempotency_key": "example-"
}Required fields: idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/strategy/silos/example/keyword-groups/example/opportunity" \
-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 |
|---|---|
opportunity_id | JSON |
{
"opportunity_id": "id"
}| 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 |