diff --git a/spec/v1.json b/spec/v1.json index 414cf61..6147dfc 100644 --- a/spec/v1.json +++ b/spec/v1.json @@ -3836,6 +3836,15 @@ "items": { "$ref": "#/components/schemas/PostMediaItem" } + }, + "instagram_trial_reel": { + "description": "Instagram only: publish this video as a trial reel, shown to non-followers first. `manual` keeps it a trial until you share it to your followers from the Instagram app; `auto` lets Instagram share it if it performs well; `off` (the default) publishes a normal reel. Only valid on an Instagram channel. A draft may hold it before its video is attached; scheduling or publishing refuses anything that is not exactly one video (no image, carousel or second file) with 400 `validation_failed`. A non-Instagram channel or an unknown value is refused the same way, never ignored.", + "type": "string", + "enum": [ + "off", + "manual", + "auto" + ] } }, "required": [ @@ -4289,15 +4298,11 @@ "description": "Account handle or display name, e.g. \"@postifyhq\"." }, "avatar_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Profile image URL, if the platform provides one." + "description": "Profile image URL, if the platform provides one.", + "type": [ + "string", + "null" + ] }, "followers": { "anyOf": [ @@ -4336,15 +4341,11 @@ "description": "When channel metadata was last refreshed (ISO-8601 UTC)." }, "last_error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Most recent connection error, if any." + "description": "Most recent connection error, if any.", + "type": [ + "string", + "null" + ] }, "created_at": { "type": "string", @@ -4381,15 +4382,11 @@ "description": "True when another page exists after `next_cursor`." }, "next_cursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page — pass as `after`. Reusing a cursor with a different query is rejected." + "description": "Opaque cursor for the next page — pass as `after`. Reusing a cursor with a different query is rejected.", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -4435,15 +4432,11 @@ "description": "`pending` until the upload is completed; only `ready` assets should be attached to posts." }, "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Durable URL for the asset — use this as `media[].url` when creating posts. Null until the upload completes." + "description": "Durable URL for the asset — use this as `media[].url` when creating posts. Null until the upload completes.", + "type": [ + "string", + "null" + ] }, "size_bytes": { "anyOf": [ @@ -4485,15 +4478,11 @@ "description": "Pixel height, when known." }, "duration_sec": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Duration in seconds for audio/video, when known." + "description": "Duration in seconds for audio/video, when known.", + "type": [ + "number", + "null" + ] }, "created_at": { "type": "string", @@ -4564,15 +4553,11 @@ "description": "True when another page exists after `next_cursor`." }, "next_cursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Opaque cursor for the next page — pass as `after`. Reusing a cursor with a different query is rejected." + "description": "Opaque cursor for the next page — pass as `after`. Reusing a cursor with a different query is rejected.", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -4614,26 +4599,18 @@ "description": "Post format." }, "title": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Internal title (not published to platforms)." + "description": "Internal title (not published to platforms).", + "type": [ + "string", + "null" + ] }, "body": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Channel-agnostic base text the variants derive from." + "description": "Channel-agnostic base text the variants derive from.", + "type": [ + "string", + "null" + ] }, "scheduled_at": { "anyOf": [ @@ -4718,6 +4695,14 @@ "$ref": "#/components/schemas/PostMediaItemOutput" }, "description": "Media attached to this variant." + }, + "instagram_trial_reel": { + "description": "Present only when this Instagram variant publishes as a trial reel: `manual` or `auto` (see the create request).", + "type": "string", + "enum": [ + "manual", + "auto" + ] } }, "required": [ @@ -4750,26 +4735,18 @@ "description": "Latest delivery stage. `indexed`/`acked` are success; `failed`/`dlq` are terminal failures; anything else is in flight." }, "external_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The platform's id for the published item, once known." + "description": "The platform's id for the published item, once known.", + "type": [ + "string", + "null" + ] }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Why the latest delivery failed, as a sentence you can show your users. Present only when `stage` is `failed` or `dlq`; otherwise null." + "description": "Why the latest delivery failed, as a sentence you can show your users. Present only when `stage` is `failed` or `dlq`; otherwise null.", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -5132,15 +5109,11 @@ "description": "HTTP status returned by the endpoint, or null when the request never completed (timeout, TLS failure, blocked egress)." }, "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Transport-level failure detail when no HTTP response exists." + "description": "Transport-level failure detail when no HTTP response exists.", + "type": [ + "string", + "null" + ] } }, "required": [