Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.genviral.io/llms.txt

Use this file to discover all available pages before exploring further.

Canonical objects returned by the Genviral Partner API. These structures 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.
capabilitiesobjectPer-account supported content kinds, caption/media limits, unsupported reasons, and provider settings JSON Schema.
{
  "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",
  "capabilities": {
    "supported_content_kinds": ["single_image", "multi_image", "single_video"],
    "caption_limit": 500,
    "media_limits": {
      "max_images": 35,
      "max_videos": 1
    },
    "unsupported_content_kind_reasons": {
      "text_only": "Text-only posts are only available for connected BYO accounts; hosted accounts require media."
    },
    "settings_schema": {
      "type": "object",
      "additionalProperties": false,
      "properties": {}
    }
  }
}

Account Capabilities

Returned under account.capabilities by GET /accounts.
FieldTypeDescription
supported_content_kindsstring[]Content kinds this account supports through Genviral: text_only, single_image, multi_image, single_video.
caption_limitnumberAccount-aware caption limit.
media_limits.max_imagesnumberMaximum image count accepted for the account/platform.
media_limits.max_videosnumberMaximum video count accepted for the account/platform.
media_limits.max_video_secondsnumberOptional max video duration when the platform/account policy needs it.
unsupported_content_kind_reasonsobjectReason strings keyed by unsupported content kind.
settings_schemaobjectJSON Schema for provider settings under settings.<provider>.

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).
mediaobject | nullMirrors the create/update payload (type + url/urls), or null for text-only posts.
music_urlstring | nullTikTok post URL applied to the TikTok audio track. Not supported for Instagram targets.
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"
  }
}
Top-level tiktok and pinterest settings are v1 convenience aliases. New multi-platform clients should prefer canonical provider settings under settings.<provider> in create/update requests.

Media

Returned as submitted to POST /posts and PATCH /posts/{id}, or null for text-only posts:
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. Video posts: max 2,200 UTF-16 runes. Photo/slideshow posts: max 90 UTF-16 runes.
descriptionstringOptional TikTok description override. Photo/slideshow posts: max 4,000 UTF-16 runes. For video posts, Genviral keeps this field for compatibility and can use it as a fallback source when deriving the TikTok title if title is blank.
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).
video_cover_timestamp_msintegerOptional video cover frame offset in milliseconds (DIRECT_POST video only).
music_usage_confirmationbooleanConfirms the user has accepted TikTok’s music-usage terms for this post. Preferred Partner API field.
user_consentbooleanLegacy alias for music_usage_confirmation.
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 (max 2,048 chars).
tagsstring[]Optional topic tags (up to 30, spaces allowed). Genviral appends these to the final Pinterest description, which still must fit Pinterest’s 800-character description ceiling.

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 other/docs/product/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.
When available, GET /api/partner/v1/analytics/summary/posts returns both analyticsId, genviralPostId, and externalId. Use genviralPostId or externalId as the preferred correlation fields for mapping analytics rows back to the originating Partner API post. analyticsId and legacy id are the analytics-dataset row ID, not the post-creation ID.