FoxCue API: YouTube performance and Observations
Request examples, parameters, scopes and response statuses for FoxCue API youtube performance and observations.
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.
YouTube performance
GET /performance/capabilities
Discover configured YouTube capabilities, supported reports and setup gaps
Scope: performance:read.
Example request
curl -X GET "https://app.foxcue.com/api/v1/performance/capabilities" \
-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 /performance/connections
List OAuth or public API-key channel connections visible to this actor; optional brand project_id
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
Example request
curl -X GET "https://app.foxcue.com/api/v1/performance/connections?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 |
GET /performance/publications
List publications as {items,limit,offset,has_more}; public availability by default
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
connection_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
topic_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
script_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
artifact_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
composition_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
availability | query | no | string | one of all, public, unlisted, private, scheduled, unavailable |
linked | query | no | string | one of all, linked, unlinked |
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/performance/publications?project_id=example&connection_id=example&topic_id=example&script_id=example&artifact_id=example&composition_id=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
items | array |
limit | number |
offset | number |
has_more | boolean |
{
"items": [],
"limit": 0,
"offset": 0,
"has_more": false
}| 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 /performance/publications/{id}
Read one visible published video and its explicit content associations
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/performance/publications/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 /performance/publications/{id}/links
Replace explicit same-brand topic/script/video-artifact links using expected_revision
Scope: performance:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"expected_revision": 1,
"topic_id": "example",
"script_id": "example",
"artifact_id": "example"
}Required fields: expected_revision.
curl -X PUT "https://app.foxcue.com/api/v1/performance/publications/example/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 /performance/connections/{id}/sync
Queue YouTube inventory (plus core Analytics for OAuth connections only); body idempotency_key required; at most 367 days
Scope: performance:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"start_date": "example",
"end_date": "example",
"idempotency_key": "example-"
}Required fields: start_date, end_date, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/performance/connections/example/sync" \
-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 /performance/sync-runs/{id}
Poll a visible Performance sync/report run, progress and safe error code
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/performance/sync-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 /performance/reports
Read cached provider report; missing is not zero; date order and maximum 367-day window required; retention requires publication_id
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
connection_id | query | yes | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
publication_id | query | no | string | minLength 1; maxLength 128; pattern ^[a-zA-Z0-9_-]+$ |
family | query | no | string | one of totals, daily, traffic, search_terms, retention |
start_date | query | yes | string | format date |
end_date | query | yes | string | format date |
Example request
curl -X GET "https://app.foxcue.com/api/v1/performance/reports?connection_id=example&publication_id=example&family=example&start_date=example&end_date=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
status | string |
report | null |
{
"status": "queued",
"report": 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 |
POST /performance/reports/query
Queue one supported Analytics report; body idempotency_key required; poll Performance sync run
Scope: performance:write.
Example request
{
"query": {
"connection_id": "example",
"publication_id": "example",
"family": "totals",
"start_date": "example",
"end_date": "example"
},
"idempotency_key": "example-"
}Required fields: query, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/performance/reports/query" \
-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 |
Observations
GET /observations/connections/summary
Aggregate actor-visible integration connection status across brands
Scope: performance:read.
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/connections/summary" \
-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 /observations/page-search
Read authorized stored GSC queries for a page or YouTube video URL; includes weighted position, totals and coverage
Scope: performance:read.
Example request
{
"project_id": "example",
"connection_id": "example",
"url": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"search_type": "web",
"q": "example",
"limit": 1,
"offset": 0
}Required fields: project_id, connection_id, url, window.
curl -X POST "https://app.foxcue.com/api/v1/observations/page-search" \
-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 /observations/connections/{id}/sync
Queue an authorized Google resource refresh; durable idempotency, actual adapter and worker status apply
Scope: performance:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
{
"project_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"idempotency_key": "example"
}Required fields: window, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/observations/connections/example/sync" \
-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 /observations/capabilities
Read actual observation capabilities for a brand
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/capabilities?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 |
GET /observations/connections
List actor-visible brand data resources; setup requires browser owner
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/connections?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 /observations/uploads
Stage a private CSV up to 10 MiB for an existing authorized resource
Scope: performance:write.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
connection_id | query | yes | string | minLength 1; maxLength 256 |
Example request
Body is raw bytes (text/csv), not JSON.
curl -X POST "https://app.foxcue.com/api/v1/observations/uploads?project_id=example&connection_id=example" \
-H "Authorization: Bearer <workspace API key>" \
--data-binary @fileResponse
The body is a JSON object with these fields.
| Field | Type |
|---|---|
id | JSON |
content_hash | JSON |
byte_count | JSON |
expires_at | JSON |
{
"id": "id",
"content_hash": "example",
"byte_count": "example",
"expires_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 |
POST /observations/imports/preview
Validate a staged typed CSV without publishing a batch
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"grain": [
"example"
],
"filters": {},
"kind": "gsc_page_daily",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example",
"schema_version": 1,
"column_mapping": {}
}Required fields: project_id, connection_id, resource_id, window, grain, filters, kind, upload_id, idempotency_key, schema_version.
curl -X POST "https://app.foxcue.com/api/v1/observations/imports/preview" \
-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 /observations/imports
Publish a typed CSV with an idempotent receipt and row errors
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"grain": [
"example"
],
"filters": {},
"kind": "gsc_page_daily",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example",
"schema_version": 1,
"column_mapping": {}
}Required fields: project_id, connection_id, resource_id, window, grain, filters, kind, upload_id, idempotency_key, schema_version.
curl -X POST "https://app.foxcue.com/api/v1/observations/imports" \
-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 /observations/page-evidence
Read authorized native-grain page observations with as-of and completeness provenance
Scope: performance:read.
Example request
{
"project_id": "example",
"connection_id": "example",
"page_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"as_of": "example",
"filters": {},
"limit": 1,
"offset": 0
}Required fields: project_id, connection_id, page_id, window.
curl -X POST "https://app.foxcue.com/api/v1/observations/page-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 |
GET /observations/runs
List actor-visible resource observation runs
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
connection_id | query | yes | string | minLength 1; maxLength 256 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/runs?project_id=example&connection_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 /observations/runs/{id}
Read one authorized observation run
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
id | path | yes | string |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/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 /observations/qualification-rules
Read current authored brand qualification rules
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/qualification-rules?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 /observations/qualification-rules
Save a versioned explicit qualification rule with revision guard
Scope: performance:write.
Example request
{
"project_id": "example",
"id": "example",
"expected_revision": 0,
"name": "example",
"criteria": [
"example"
],
"active": true
}Required fields: project_id, expected_revision, name, criteria.
curl -X PUT "https://app.foxcue.com/api/v1/observations/qualification-rules" \
-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 |
POST /observations/outcomes
Record one deduplicated outcome stage or retraction; linked pages/videos/intents additionally require strategy:write
Scope: performance:write.
Example request
{
"input": {
"project_id": "example",
"origin": "manual",
"external_id": "example",
"occurred_at": "example",
"kind": "form_submission",
"attribution": "direct_recorded",
"qualification_rule_id": "example",
"qualification_rule_revision": 1,
"video_id": "example"
},
"idempotency_key": "example"
}Required fields: input, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/observations/outcomes" \
-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 |
identity_id | JSON |
revision | JSON |
{
"id": "id",
"identity_id": "id",
"revision": "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 |
POST /observations/outcomes/evidence
Read one latest-asof nonretracted state per outcome identity; no GA4-inferred qualification
Scope: performance:read.
Example request
{
"project_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"as_of": "example",
"limit": 1,
"offset": 0
}Required fields: project_id, window, as_of.
curl -X POST "https://app.foxcue.com/api/v1/observations/outcomes/evidence" \
-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 |
|---|---|
outcomes | JSON |
next_offset | JSON |
qualification_available | JSON |
{
"outcomes": "example",
"next_offset": "example",
"qualification_available": "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 /observations/outcomes/history
Read retained authored identity revision history
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
id | query | yes | string | minLength 1; maxLength 256 |
limit | query | no | integer | minimum 1; maximum 100 |
offset | query | no | integer | minimum 0 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/outcomes/history?project_id=example&id=example&limit=example&offset=example" \
-H "Authorization: Bearer <workspace API key>"Response
The body is a JSON object with these fields.
| Field | Type |
|---|---|
revisions | JSON |
next_offset | JSON |
{
"revisions": "example",
"next_offset": "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 /observations/outcomes/imports/preview
Validate typed outcome CSV using existing private observation staging
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example"
}Required fields: project_id, connection_id, resource_id, upload_id, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/observations/outcomes/imports/preview" \
-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 /observations/outcomes/imports
Import typed outcome identities with file/request idempotency and row errors
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example"
}Required fields: project_id, connection_id, resource_id, upload_id, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/observations/outcomes/imports" \
-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 |
PUT /observations/ga4-settings
Configure explicit landing origins and demo event proxy names for an authorized GA4 connection
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"expected_revision": 0,
"landing_origins": [
"example"
],
"demo_event_names": [
"example"
]
}Required fields: project_id, connection_id, expected_revision, landing_origins, demo_event_names.
curl -X PUT "https://app.foxcue.com/api/v1/observations/ga4-settings" \
-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 /observations/ga4-settings
Read actor-visible GA4 landing origins/event proxy definitions
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
connection_id | query | yes | string | minLength 1; maxLength 256 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/ga4-settings?project_id=example&connection_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 /observations/youtube/reports
Read actor-visible native Performance report families for one linked canonical video; original Pacific definitions and suppressed search terms remain explicit
Scope: performance:read.
Example request
{
"project_id": "example",
"connection_id": "example",
"video_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"as_of": "example"
}Required fields: project_id, connection_id, video_id, window.
curl -X POST "https://app.foxcue.com/api/v1/observations/youtube/reports" \
-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 |
|---|---|
video_id | JSON |
connection_id | JSON |
timezone | JSON |
source | string |
reports | JSON |
attribution | string |
qualification | string |
{
"video_id": "id",
"connection_id": "id",
"timezone": "example",
"source": "example",
"reports": "example",
"attribution": "example",
"qualification": "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 |
POST /observations/youtube/reports/refresh
Refresh one linked canonical video report through the existing Performance queue; no new OAuth or publishing
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"video_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"family": "totals",
"idempotency_key": "example-"
}Required fields: project_id, connection_id, video_id, window, family, idempotency_key.
curl -X POST "https://app.foxcue.com/api/v1/observations/youtube/reports/refresh" \
-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 /observations/market-capabilities
Read actual keyword configuration and import-only AI visibility capabilities
Scope: performance:read.
Parameters
| Name | In | Required | Type | Rules |
|---|---|---|---|---|
project_id | query | yes | string | minLength 1; maxLength 256 |
Example request
curl -X GET "https://app.foxcue.com/api/v1/observations/market-capabilities?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 /observations/keywords/preview
Preview a staged Google Search keyword estimate CSV; close variants and missing values remain explicit
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"grain": [
"example"
],
"filters": {},
"kind": "keyword_estimates",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example",
"schema_version": 1,
"column_mapping": {}
}Required fields: project_id, connection_id, resource_id, window, grain, filters, kind, upload_id, idempotency_key, schema_version.
curl -X POST "https://app.foxcue.com/api/v1/observations/keywords/preview" \
-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 /observations/keywords/import
Import exact native keyword estimates through the shared idempotent typed observation owner
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"grain": [
"example"
],
"filters": {},
"kind": "keyword_estimates",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example",
"schema_version": 1,
"column_mapping": {}
}Required fields: project_id, connection_id, resource_id, window, grain, filters, kind, upload_id, idempotency_key, schema_version.
curl -X POST "https://app.foxcue.com/api/v1/observations/keywords/import" \
-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 /observations/keywords/evidence
Read authorized historical keyword estimates without interpreting them as YouTube or prompt volume
Scope: performance:read.
Example request
{
"project_id": "example",
"connection_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"as_of": "example",
"filters": {}
}Required fields: project_id, connection_id, window, as_of.
curl -X POST "https://app.foxcue.com/api/v1/observations/keywords/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 /observations/keywords/estimate
Request historical metrics only through explicit server-configured Google Ads customer authorization; no credentials in arguments
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"idempotency_key": "example-",
"input": {
"terms": [
"example"
],
"country": "example",
"language": "example",
"network": "google_search",
"start_month": "example",
"end_month": "example"
}
}Required fields: project_id, connection_id, idempotency_key, input.
curl -X POST "https://app.foxcue.com/api/v1/observations/keywords/estimate" \
-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 |
|---|---|
batch_id | JSON |
outcome | JSON |
{
"batch_id": "id",
"outcome": "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 |
POST /observations/ai-visibility/preview
Preview declared dashboard exports or controlled prompt samples; panel targets additionally require strategy:read
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"grain": [
"example"
],
"filters": {},
"kind": "google_ai_visibility",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example",
"schema_version": 1,
"samples": [
{
"row": 2,
"target_id": "example",
"prompt_revision": 1,
"prompt_version": "example",
"tested_at": "example",
"measurement_environment": "consumer_search",
"citation_urls": [
"example"
],
"evidence_note": "example"
}
],
"column_mapping": {},
"zero_policy": "unknown",
"format": "canonical"
}Required fields: project_id, connection_id, resource_id, window, grain, filters, kind, upload_id, idempotency_key, schema_version, samples.
curl -X POST "https://app.foxcue.com/api/v1/observations/ai-visibility/preview" \
-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 /observations/ai-visibility/import
Import private AI visibility samples with exact repetitions, provenance and immutable metadata; panel targets additionally require strategy:read
Scope: performance:write.
Example request
{
"project_id": "example",
"connection_id": "example",
"resource_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"grain": [
"example"
],
"filters": {},
"kind": "google_ai_visibility",
"upload_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example",
"schema_version": 1,
"samples": [
{
"row": 2,
"target_id": "example",
"prompt_revision": 1,
"prompt_version": "example",
"tested_at": "example",
"measurement_environment": "consumer_search",
"citation_urls": [
"example"
],
"evidence_note": "example"
}
],
"column_mapping": {},
"zero_policy": "unknown",
"format": "canonical"
}Required fields: project_id, connection_id, resource_id, window, grain, filters, kind, upload_id, idempotency_key, schema_version, samples.
curl -X POST "https://app.foxcue.com/api/v1/observations/ai-visibility/import" \
-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 /observations/ai-visibility/evidence
Read scoped private AI samples and their actual tested denominator
Scope: performance:read.
Example request
{
"project_id": "example",
"connection_id": "example",
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"as_of": "example",
"filters": {},
"target_id": "example"
}Required fields: project_id, connection_id, window, as_of.
curl -X POST "https://app.foxcue.com/api/v1/observations/ai-visibility/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 /observations/ai-visibility/intents
Read exact AI visibility support for authored canonical intents; additionally requires strategy:read
Scope: performance:read.
Example request
{
"project_id": "example",
"intent_ids": [
"example"
],
"window": {
"start_date": "example",
"end_date": "example",
"timezone": "example"
},
"as_of": "example",
"filters": {}
}Required fields: project_id, intent_ids, window, as_of.
curl -X POST "https://app.foxcue.com/api/v1/observations/ai-visibility/intents" \
-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 |