Skip to main content
Canonical objects returned by the Genviral Partner API. These structures are consistent across all 6 supported platforms (TikTok, Instagram, YouTube, Pinterest, LinkedIn, Facebook) and are designed for easy consumption by OpenClaw agents, AI automation pipelines, and custom integrations.

Partner API Key

Represents the credential you create in API Keys. Every key is single-scope: either workspace or personal.
FieldTypeDescription
public_idstringShort identifier (e.g., gva_live_2ff93c).
secret_suffixstringLast four characters of the secret portion, useful for audits.
scopestringworkspace or personal.
workspace_idstring | nullPresent for workspace keys.
owner_user_idstring | nullPresent for personal keys.
is_activebooleanKey active state.
created_atstring (ISO 8601)Timestamp when the key was issued.
last_used_atstring | nullUpdated whenever the key is used.
revoked_atstring | nullTimestamp when key was revoked.
{
  "public_id": "gva_live_2ff93c",
  "secret_suffix": "b4d5",
  "scope": "personal",
  "workspace_id": null,
  "owner_user_id": "5ec8f2fd-8d0a-4c68-b05d-9a8a85aa5d5d",
  "is_active": true,
  "created_at": "2026-02-13T15:32:11.402Z",
  "last_used_at": "2026-02-13T18:14:03.009Z",
  "revoked_at": null
}

Social Account (BYO + Hosted)

Returned by GET /accounts and referenced when scheduling posts. Account IDs are UUIDs.
FieldTypeDescription
idstring (UUID)Scope-constrained account identifier.
platformstringtiktok, instagram, etc.
typestringbyo (user-connected) or hosted (Genviral-managed).
usernamestringHandle shown on the platform.
display_namestringFriendly label surfaced in the dashboard.
statusstringactive, paused, revoked, etc.
workspace_idstring | nullWorkspace owner when account is workspace-scoped; null in personal scope.
{
  "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}.
FieldTypeDescription
idstring (UUID)Unique post ID.
statusstringdraft, pending, scheduled, retry, posted, failed, partial, canceled, deleted, expired.
captionstringCross-platform caption.
scheduled_atstring | nullTarget publish timestamp.
created_atstringISO timestamp when the post was created.
accountsobjectSummary + per-account states (see below).
mediaobjectMirrors the create/update payload (type + url/urls).
music_urlstring | nullTikTok post URL applied to the audio track.
tiktokobject | nullOptional TikTok publish settings (only for TikTok BYO-targeted posts).
pinterestobject | nullOptional Pinterest settings (board_id, link, title, tags).
{
  "id": "11111111-1111-1111-1111-111111111111",
  "caption": "Holiday drops start Monday!",
  "status": "scheduled",
  "scheduled_at": "2025-02-01T15:00:00Z",
  "created_at": "2025-01-20T12:05:11.205Z",
  "tiktok": {
    "post_mode": "MEDIA_UPLOAD",
    "privacy_level": "PUBLIC_TO_EVERYONE"
  }
}
tiktok and pinterest settings are mutually exclusive for a single post request because their account constraints cannot both be true at the same time.

Media

Returned exactly as submitted to POST /posts and PATCH /posts/{id}:
FieldTypeDescription
typestringvideo or slideshow. Determines which property appears below.
urlstringPresent when type="video". Points to the ingested/validated clip.
urlsstring[]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.

TikTok Settings

Optional settings persisted from POST /posts / PATCH /posts/{id} under the tiktok field. These apply only when all targeted accounts are TikTok BYO accounts.
FieldTypeDescription
titlestringOptional TikTok title override (max 150 chars).
descriptionstringOptional TikTok description override (max 2200 chars).
post_modestringDIRECT_POST or MEDIA_UPLOAD (TikTok inbox/drafts).
privacy_levelstringTikTok privacy level (PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY).
disable_commentbooleanOptional comment toggle.
disable_duetbooleanOptional duet toggle (video posts).
disable_stitchbooleanOptional stitch toggle (video posts).
user_consentbooleanOptional policy consent flag.
is_commercialbooleanOptional commercial content flag.
is_your_brandbooleanOptional own-brand flag.
is_branded_contentbooleanOptional third-party branded-content flag.
auto_add_musicbooleanOptional auto-music toggle (photo posts).

Pinterest Settings

Optional settings persisted from POST /posts / PATCH /posts/{id} under the pinterest field. These apply only when at least one targeted account is Pinterest.
FieldTypeDescription
board_idstringOptional Pinterest board ID (max 128 chars).
titlestringOptional pin title override (max 100 chars).
linkstringOptional destination URL attached to the pin.
tagsstring[]Optional topic tags (up to 30, spaces allowed).

Account States

Each post stores a normalized state for every targeted account (from social_post_accounts):
FieldTypeDescription
account_idstringID from GET /accounts.
statusstringOne of draft, pending, scheduled, retry, posted, failed, partial, canceled, deleted, expired.
published_atstring | nullTimestamp of successful publish.
published_urlstring | nullPlatform URL when the provider shares one (hosted creators).
error_messagestring | nullLast error returned by the platform.
last_attempted_atstring | nullWhen 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
      }
    ]
  }
}

Folder

Returned by folder endpoints under /api/partner/v1/folders*.
FieldTypeDescription
idstring (UUID)Folder ID.
namestringFolder display name.
media_typestringai_image, ai_video, upload, or slideshow.
parent_folder_idstring | nullParent folder ID (null for root).
pathstringMaterialized folder path.
file_countnumberCount of direct items in the folder.
subfolder_countnumberCount of direct child folders.
preview_filesarrayUp to 4 preview items (id, url, content_type).
created_atstringCreation timestamp.
updated_atstringLast update timestamp.
{
  "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
  "name": "March Campaign",
  "media_type": "upload",
  "parent_folder_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
  "path": "/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
  "file_count": 8,
  "subfolder_count": 1,
  "preview_files": [
    {
      "id": "11111111-1111-1111-1111-111111111111",
      "url": "https://cdn.vireel.io/partner-api/workspaces/workspace_123/asset-1.jpg",
      "content_type": "image/jpeg"
    }
  ],
  "created_at": "2026-03-01T09:00:00Z",
  "updated_at": "2026-03-01T09:10:00Z"
}

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.
FieldTypeDescription
account_stats.idstringUnique stat row.
account_stats.account_idstringLinks back to the account in current key scope.
account_stats.followersnumber | nullFollowers at the time of capture.
account_stats.viewsnumber | nullAggregated views across all posts.
post_stats.idstringUnique per-post stat row.
post_stats.post_idstringLinks to the Genviral post.
post_stats.viewsnumber | nullViews for the specific post.
post_stats.likesnumber | nullLikes for the specific post.
created_atstringSnapshot 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": "11111111-1111-1111-1111-111111111111",
    "views": 48200,
    "likes": 3200,
    "created_at": "2025-01-21T04:00:00Z"
  }
}

Analytics Summary

Returned by GET /api/partner/v1/analytics/summary.
FieldTypeDescription
range.startstringStart date (YYYY-MM-DD) of selected range.
range.endstringEnd date (YYYY-MM-DD) of selected range.
filters.platformsstring[]Applied platform filters.
filters.accountIdsstring[]Applied analytics target ID filters.
kpis.<metric>.valuenumberCurrent-period value for metric.
kpis.<metric>.deltanumberDifference from previous equivalent period.
interactionSeries[]object[]Daily interactions (views, likes, comments, shares).
engagementSeries[]object[]Daily engagement-rate values.
postingHeatmap[]object[]Daily post counts for heatmap rendering.
postingStreaknumberConsecutive posting-day streak ending at selected range.end.
contentMix[]object[]Post distribution by platform (platform, posts, percentage).

Analytics Target

Returned by GET /api/partner/v1/analytics/targets and target-management endpoints.
FieldTypeDescription
idstring (UUID)Canonical analytics target identifier used across analytics endpoints.
target_idstring (UUID)Legacy alias currently included in list rows for backward compatibility.
platformstringtiktok, instagram, or youtube.
identifierstringOriginal account handle/input.
normalized_identifierstringNormalized identifier used for dedupe.
display_namestring | nullOptional display label.
last_refreshed_atstring | nullLast successful refresh timestamp.
last_snapshot_totalsobject | nullLatest aggregate totals from snapshot.
last_refresh_statusstring | nullStatus from latest refresh row.
last_refresh_errorstring | nullLatest refresh error text when failed.
free_refresh_availablebooleanWhether free daily refresh is currently available.

Analytics Refresh

Returned by POST /api/partner/v1/analytics/targets/{id}/refresh and GET /api/partner/v1/analytics/refreshes/{id}.
FieldTypeDescription
idstring (UUID)Refresh ID.
target_idstring (UUID)Target this refresh belongs to.
workspace_idstring | nullWorkspace scope for billing/context.
statusstringpending, processing, completed, or failed.
credits_usednumberCredits consumed for this refresh (0 if free).
free_refresh_usedbooleanWhether free refresh window was used.
started_atstringStart timestamp.
completed_atstring | nullCompletion timestamp when done.
errorstring | nullFailure reason when status is failed.
Use external_id on posts to map Genviral stats back to your own manifest or CMS IDs. Workspace scope typically uses (workspace_id, external_id, account_id); personal scope typically uses (owner_user_id, external_id, account_id).