These shapes mirror the models documented in docs/integrations/ugcinc/data-structures/* inside the core repo and are reused across every Partner API response.
Workspace API Key
Represents the credential you create under Workspace → API Keys. Keys inherit the workspace context, so any post you schedule will land in that workspace’s queue and has access to the hosted accounts assigned there.
| Field | Type | Description |
|---|
public_id | string | Short identifier (e.g., gva_live_2ff93c). |
secret_last4 | string | Last four characters of the secret portion, useful for audits. |
workspace_id | string | Workspace that owns the key. |
workspace_name | string | Display name in the dashboard. |
created_at | string (ISO 8601) | Timestamp when the key was issued. |
last_used_at | string | null | Updated whenever the key is used. |
permissions | string[] | Currently ["partner_posts"] for all Partner API keys. |
{
"public_id": "gva_live_2ff93c",
"secret_last4": "b4d5",
"workspace_id": "ws_prod_01",
"workspace_name": "Holiday Launch 2025",
"created_at": "2025-01-12T15:32:11.402Z",
"last_used_at": "2025-01-21T08:14:03.009Z",
"permissions": ["partner_posts"]
}
Social Account (BYO + Hosted)
Returned by GET /accounts and referenced when scheduling posts. Account IDs are UUIDs.
| Field | Type | Description |
|---|
id | string (UUID) | Workspace-scoped account identifier. |
platform | string | tiktok, instagram, etc. |
type | string | byo (user-connected) or hosted (Genviral-managed). |
username | string | Handle shown on the platform. |
display_name | string | Friendly label surfaced in the dashboard. |
status | string | active, paused, revoked, etc. |
workspace_id | string | Workspace that owns the account (mirrors authenticated key). |
{
"id": "0f4f54d4-8cce-4fb7-8c7b-befbcb8af812",
"platform": "tiktok",
"type": "hosted",
"username": "ugc_trends_42",
"display_name": "Hosted Trends 42",
"status": "active",
"workspace_id": "4cb5d3fd-8c8f-4ed7-a17c-4ffb52c7e6ac"
}
Post
Created via POST /posts, retrieved via GET /posts and GET /posts/{id}.
| Field | Type | Description |
|---|
id | string | Unique post ID (post_*). |
status | string | draft, pending, scheduled, retry, posted, failed, partial. |
caption | string | Cross-platform caption. |
scheduled_at | string | null | Target publish timestamp. |
created_at | string | ISO timestamp when the post was created. |
accounts | object | Summary + per-account states (see below). |
media | object | Mirrors the create/update payload (type + url/urls). |
music_url | string | null | TikTok post URL applied to the audio track. |
{
"id": "post_789",
"caption": "Holiday drops start Monday!",
"status": "scheduled",
"scheduled_at": "2025-02-01T15:00:00Z",
"created_at": "2025-01-20T12:05:11.205Z"
}
Returned exactly as submitted to POST /posts and PATCH /posts/{id}:
| Field | Type | Description |
|---|
type | string | video or slideshow. Determines which property appears below. |
url | string | Present when type="video". Points to the ingested/validated clip. |
urls | string[] | Present when type="slideshow". Ordered list of image URLs (1–35 entries). |
When BYO accounts are present, Genviral re-hosts the assets behind the scenes so
these URLs point to first-party Cloudflare R2 buckets. Hosted-only posts reuse
the URLs you provided once reachability is confirmed.
Account States
Each post stores a normalized state for every targeted account (from social_post_accounts):
| Field | Type | Description |
|---|
account_id | string | ID from GET /accounts. |
status | string | One of draft, pending, scheduled, retry, posted, failed, partial. |
published_at | string | null | Timestamp of successful publish. |
published_url | string | null | Platform URL when the provider shares one (hosted creators). |
error_message | string | null | Last error returned by the platform. |
last_attempted_at | string | null | When the scheduler last touched this account. |
{
"accounts": {
"total": 2,
"states": [
{
"account_id": "0f4f54d4-8cce-4fb7-8c7b-befbcb8af812",
"status": "scheduled",
"published_at": null,
"published_url": null,
"error_message": null,
"last_attempted_at": null
},
{
"account_id": "6b0c8c9c-55ac-4fcb-85ec-70b5a8b0d089",
"status": "scheduled",
"published_at": null,
"published_url": null,
"error_message": null,
"last_attempted_at": null
}
]
}
}
Stats Snapshot
Analytics endpoints (and UI exports) reuse the same structures outlined in docs/integrations/ugcinc/data-structures/account-stat.md and post-stat.md.
| Field | Type | Description |
|---|
account_stats.id | string | Unique stat row. |
account_stats.account_id | string | Links back to the workspace account. |
account_stats.followers | number | null | Followers at the time of capture. |
account_stats.views | number | null | Aggregated views across all posts. |
post_stats.id | string | Unique per-post stat row. |
post_stats.post_id | string | Links to the Genviral post. |
post_stats.views | number | null | Views for the specific post. |
post_stats.likes | number | null | Likes for the specific post. |
created_at | string | Snapshot timestamp. |
{
"account_stats": {
"id": "acc_stat_1",
"account_id": "6b0c8c9c-55ac-4fcb-85ec-70b5a8b0d089",
"followers": 15420,
"views": 1250000,
"likes": 89500,
"created_at": "2025-01-19T10:00:00Z"
},
"post_stats": {
"id": "post_stat_1",
"post_id": "post_789",
"views": 48200,
"likes": 3200,
"created_at": "2025-01-21T04:00:00Z"
}
}
Use external_id on posts to map Genviral stats back to your own manifest or
CMS IDs. The combination of workspace_id, external_id, and account_id is
sufficient to reconstruct any analytics roll-up you need.