{
    "ok": true,
    "data": {
        "base_url": "https://vidmfy.com/api/v1",
        "endpoint_count": 41,
        "generated_at": "2026-09-16T12:53:04+02:00",
        "routes": [
            {
                "group": "Projects",
                "method": "GET",
                "path": "/projects",
                "scope": "connections:read",
                "summary": "List every publishing project with its editorial context and platform connections.",
                "parameters": []
            },
            {
                "group": "Projects",
                "method": "POST",
                "path": "/projects",
                "scope": "connections:write",
                "summary": "Create a publishing project and enable Project mode. Available during Trial and with active Pro.",
                "parameters": [
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "name",
                        "JSON body",
                        "string, max 120",
                        "Yes",
                        "Project, brand, subject or customer name.",
                        "Historical facts"
                    ],
                    [
                        "description",
                        "JSON body",
                        "string, max 4000",
                        "No",
                        "Purpose and general context of the project.",
                        "Short educational history videos."
                    ],
                    [
                        "content_theme",
                        "JSON body",
                        "string, max 4000",
                        "No",
                        "Editorial subjects and boundaries.",
                        "Verified historical anecdotes."
                    ],
                    [
                        "target_audience",
                        "JSON body",
                        "string, max 3000",
                        "No",
                        "People the project should address.",
                        "Curious adults"
                    ],
                    [
                        "editorial_tone",
                        "JSON body",
                        "string, max 190",
                        "No",
                        "Preferred style and tone.",
                        "Captivating and factual"
                    ],
                    [
                        "default_language_code",
                        "JSON body",
                        "BCP-47 code or null",
                        "No",
                        "Default editorial language.",
                        "fr-BE"
                    ],
                    [
                        "color",
                        "JSON body",
                        "#RRGGBB",
                        "No",
                        "Private organization color.",
                        "#596bde"
                    ]
                ]
            },
            {
                "group": "Projects",
                "method": "GET",
                "path": "/projects/{project_id}",
                "scope": "connections:read",
                "summary": "Return one project and all publishing connections currently linked to it.",
                "parameters": [
                    [
                        "project_id",
                        "Path or JSON body",
                        "PRJ reference or integer",
                        "Yes in Project mode",
                        "Publishing project used to isolate channels, languages and campaigns.",
                        "PRJ-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Projects",
                "method": "PATCH",
                "path": "/projects/{project_id}",
                "scope": "connections:write",
                "summary": "Edit the supplied project fields without changing linked connections.",
                "parameters": [
                    [
                        "project_id",
                        "Path or JSON body",
                        "PRJ reference or integer",
                        "Yes in Project mode",
                        "Publishing project used to isolate channels, languages and campaigns.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "name",
                        "JSON body",
                        "string, max 120",
                        "Yes",
                        "Project, brand, subject or customer name.",
                        "Historical facts"
                    ],
                    [
                        "description",
                        "JSON body",
                        "string, max 4000",
                        "No",
                        "Purpose and general context of the project.",
                        "Short educational history videos."
                    ],
                    [
                        "content_theme",
                        "JSON body",
                        "string, max 4000",
                        "No",
                        "Editorial subjects and boundaries.",
                        "Verified historical anecdotes."
                    ],
                    [
                        "target_audience",
                        "JSON body",
                        "string, max 3000",
                        "No",
                        "People the project should address.",
                        "Curious adults"
                    ],
                    [
                        "editorial_tone",
                        "JSON body",
                        "string, max 190",
                        "No",
                        "Preferred style and tone.",
                        "Captivating and factual"
                    ],
                    [
                        "default_language_code",
                        "JSON body",
                        "BCP-47 code or null",
                        "No",
                        "Default editorial language.",
                        "fr-BE"
                    ],
                    [
                        "color",
                        "JSON body",
                        "#RRGGBB",
                        "No",
                        "Private organization color.",
                        "#596bde"
                    ]
                ]
            },
            {
                "group": "Projects",
                "method": "DELETE",
                "path": "/projects/{project_id}",
                "scope": "connections:write",
                "summary": "Delete an inactive project and its linked destination authorizations while preserving historical videos.",
                "parameters": [
                    [
                        "project_id",
                        "Path or JSON body",
                        "PRJ reference or integer",
                        "Yes in Project mode",
                        "Publishing project used to isolate channels, languages and campaigns.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ]
                ]
            },
            {
                "group": "Service",
                "method": "GET",
                "path": "/",
                "scope": "Public",
                "summary": "Discover API version, base URL, documentation and resources.",
                "parameters": []
            },
            {
                "group": "Service",
                "method": "GET",
                "path": "/health",
                "scope": "Public",
                "summary": "Check whether API v1 and its database bootstrap are operational.",
                "parameters": []
            },
            {
                "group": "Service",
                "method": "GET",
                "path": "/routes",
                "scope": "Public",
                "summary": "Return the complete machine-readable REST route, scope and parameter catalog used by this documentation.",
                "parameters": []
            },
            {
                "group": "Service",
                "method": "GET",
                "path": "/openapi.json",
                "scope": "Public",
                "summary": "Return the OpenAPI 3.1 contract generated from the canonical REST endpoint catalog.",
                "parameters": []
            },
            {
                "group": "Account",
                "method": "GET",
                "path": "/me",
                "scope": "account:read",
                "summary": "Return the authenticated account, plan and current API key. Wallet data is included only with billing:read.",
                "parameters": []
            },
            {
                "group": "Account",
                "method": "GET",
                "path": "/capabilities",
                "scope": "connections:read",
                "summary": "List supported providers, destinations, formats, BCP-47 languages and the current account entitlements. Multiple same-platform connections and translations are available during Trial and with active Pro.",
                "parameters": []
            },
            {
                "group": "Account",
                "method": "GET",
                "path": "/connections",
                "scope": "connections:read",
                "summary": "Return safe provider availability and connected publishing destinations, including their routing language, without secrets or OAuth tokens.",
                "parameters": []
            },
            {
                "group": "Connections",
                "method": "GET",
                "path": "/connections/{platform}",
                "scope": "connections:read",
                "summary": "List every connected account for one destination platform, including custom label, official identity, default language and default flag.",
                "parameters": [
                    [
                        "platform",
                        "Path",
                        "youtube | instagram | tiktok | facebook",
                        "Yes",
                        "Publishing platform whose connected accounts are being managed.",
                        "instagram"
                    ]
                ]
            },
            {
                "group": "Connections",
                "method": "GET",
                "path": "/connections/{platform}/{connection_id}",
                "scope": "connections:read",
                "summary": "Return one safe publishing connection without exposing OAuth tokens or application secrets.",
                "parameters": [
                    [
                        "platform",
                        "Path",
                        "youtube | instagram | tiktok | facebook",
                        "Yes",
                        "Publishing platform whose connected accounts are being managed.",
                        "instagram"
                    ],
                    [
                        "connection_id",
                        "Path",
                        "positive integer",
                        "Yes",
                        "Account ID returned by GET /connections or GET /connections/{platform}.",
                        "12"
                    ]
                ]
            },
            {
                "group": "Connections",
                "method": "POST",
                "path": "/connections/{platform}/authorization",
                "scope": "connections:write",
                "summary": "Return an OAuth URL. The first account is available to every eligible subscription; adding another account on the same platform requires Trial or active Pro. Supply connection_id to reconnect an existing account without adding one.",
                "parameters": [
                    [
                        "platform",
                        "Path",
                        "youtube | instagram | tiktok | facebook",
                        "Yes",
                        "Publishing platform whose connected accounts are being managed.",
                        "instagram"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "connection_id",
                        "JSON body",
                        "integer",
                        "No",
                        "Existing connection to reauthorize. Omit it only when adding a new account.",
                        12
                    ]
                ]
            },
            {
                "group": "Connections",
                "method": "PATCH",
                "path": "/connections/{platform}/{connection_id}",
                "scope": "connections:write",
                "summary": "Change a private connection label, its default routing language or the platform default account. Only supplied fields are changed.",
                "parameters": [
                    [
                        "platform",
                        "Path",
                        "youtube | instagram | tiktok | facebook",
                        "Yes",
                        "Publishing platform whose connected accounts are being managed.",
                        "instagram"
                    ],
                    [
                        "connection_id",
                        "Path",
                        "positive integer",
                        "Yes",
                        "Account ID returned by GET /connections or GET /connections/{platform}.",
                        "12"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "connection_label",
                        "JSON body",
                        "string · max 120 | null",
                        "No",
                        "Private label used to identify this connection in Vidmfy and API payloads. Empty or null removes the custom label.",
                        "French shop"
                    ],
                    [
                        "default_language_code",
                        "JSON body",
                        "BCP-47 code | null",
                        "No",
                        "Default content language used by automatic translation routing. Empty or null disables language routing for this connection.",
                        "fr-BE"
                    ],
                    [
                        "project_id",
                        "JSON body",
                        "PRJ reference | null",
                        "No",
                        "Assign this publishing account to a project, or null to leave it unassigned.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "is_default",
                        "JSON body",
                        "boolean",
                        "No",
                        "When true, makes this the platform default and removes the default flag from the other accounts on that platform.",
                        "true"
                    ]
                ]
            },
            {
                "group": "Connections",
                "method": "DELETE",
                "path": "/connections/{platform}/{connection_id}",
                "scope": "connections:write",
                "summary": "Completely remove one platform authorization when it is not used by an active production. Historical videos remain preserved.",
                "parameters": [
                    [
                        "platform",
                        "Path",
                        "youtube | instagram | tiktok | facebook",
                        "Yes",
                        "Publishing platform whose connected accounts are being managed.",
                        "instagram"
                    ],
                    [
                        "connection_id",
                        "Path",
                        "positive integer",
                        "Yes",
                        "Account ID returned by GET /connections or GET /connections/{platform}.",
                        "12"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ]
                ]
            },
            {
                "group": "Connections",
                "method": "GET",
                "path": "/connections/routing",
                "scope": "connections:read",
                "summary": "Preview automatic multilingual routing before creating a video. Shows all matching accounts and the account selected on each platform for every language.",
                "parameters": []
            },
            {
                "group": "Videos",
                "method": "GET",
                "path": "/videos",
                "scope": "videos:read",
                "summary": "List, search and filter videos.",
                "parameters": [
                    [
                        "page",
                        "Query",
                        "integer ≥ 1",
                        "No",
                        "Page number. Default: 1.",
                        "1"
                    ],
                    [
                        "per_page",
                        "Query",
                        "integer · 1–100",
                        "No",
                        "Number of results per page. Default: 25.",
                        "25"
                    ],
                    [
                        "status",
                        "Query",
                        "comma-separated enum",
                        "No",
                        "Filter by one or several production statuses.",
                        "published,failed"
                    ],
                    [
                        "destination",
                        "Query",
                        "youtube | instagram | tiktok | facebook",
                        "No",
                        "Return videos targeting this platform.",
                        "instagram"
                    ],
                    [
                        "campaign_id",
                        "Query",
                        "CMP reference",
                        "No",
                        "Return videos linked to one campaign.",
                        "CMP-A1B2C3D4E5"
                    ],
                    [
                        "project_id",
                        "Query",
                        "PRJ reference",
                        "No",
                        "Return videos linked to one publishing project.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "language_code",
                        "Query",
                        "BCP-47 code",
                        "No",
                        "Return only this original or translated language.",
                        "fr-BE"
                    ],
                    [
                        "localization_group_id",
                        "Query",
                        "MLG reference",
                        "No",
                        "Return all language versions belonging to one localization group.",
                        "MLG-K2L3M4N5P6"
                    ],
                    [
                        "localization_role",
                        "Query",
                        "original | translated",
                        "No",
                        "Return only originals or translated variants.",
                        "translated"
                    ],
                    [
                        "from",
                        "Query",
                        "date or ISO 8601",
                        "No",
                        "Minimum publication date/time.",
                        "2026-08-01"
                    ],
                    [
                        "to",
                        "Query",
                        "date or ISO 8601",
                        "No",
                        "Maximum publication date/time.",
                        "2026-08-31T23:59:59+02:00"
                    ],
                    [
                        "search",
                        "Query",
                        "string · max 100",
                        "No",
                        "Search reference, title or topic.",
                        "product"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "POST",
                "path": "/videos",
                "scope": "videos:write",
                "summary": "Create a draft or queue an original plus optional language variants. Each translated version receives its own VID reference and routes to matching destination languages.",
                "parameters": [
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "project_id",
                        "JSON body",
                        "PRJ reference",
                        "Required in Project mode",
                        "Project returned by GET /projects. Every selected destination must belong to it.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "title",
                        "JSON body",
                        "string · max 100",
                        "Yes",
                        "Human-readable video title.",
                        "Discover our new product"
                    ],
                    [
                        "topic",
                        "JSON body",
                        "string · max 10,000",
                        "Yes",
                        "Subject, facts and instructions used to prepare the content.",
                        "Present the three main customer benefits"
                    ],
                    [
                        "description",
                        "JSON body",
                        "string · max 5,000",
                        "No",
                        "Additional publication description.",
                        "A concise product presentation."
                    ],
                    [
                        "video_type",
                        "JSON body",
                        "short | youtube",
                        "No",
                        "Video format. Default: short.",
                        "short"
                    ],
                    [
                        "video_provider",
                        "JSON body",
                        "auto | heygen | openai | google | runway",
                        "No",
                        "Generation provider. Auto selects a ready provider.",
                        "auto"
                    ],
                    [
                        "provider_model",
                        "JSON body",
                        "string · max 100",
                        "No",
                        "Supported provider model override.",
                        "sora-2"
                    ],
                    [
                        "heygen_generation_mode",
                        "JSON body",
                        "video_agent | avatar",
                        "No",
                        "HeyGen production mode.",
                        "video_agent"
                    ],
                    [
                        "visual_instructions",
                        "JSON body",
                        "string · max 10,000",
                        "No",
                        "Scenes, rhythm, framing and visual direction.",
                        "Vertical product shots with clean transitions."
                    ],
                    [
                        "reference_media_urls",
                        "JSON body",
                        "array of HTTPS URLs · max 20",
                        "No",
                        "Public media references accessible by the provider.",
                        [
                            "https://example.com/product.jpg"
                        ]
                    ],
                    [
                        "product_photo_id",
                        "JSON body",
                        "40-character upload id with extension",
                        "No",
                        "Protected photo returned by POST /media/photos. Activates the photo-led production workflow.",
                        "4f7c1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b.jpg"
                    ],
                    [
                        "retouch_photo",
                        "JSON body",
                        "boolean",
                        "No",
                        "When product_photo_id is supplied, request the separately billed protected photo-retouch stage.",
                        "true"
                    ],
                    [
                        "content_goal",
                        "JSON body",
                        "sell | discover | educate | entertain | inspire | trust",
                        "No",
                        "Communication goal used to direct a photo-led production. Default: sell.",
                        "sell"
                    ],
                    [
                        "duration_seconds",
                        "JSON body",
                        "integer",
                        "No",
                        "Presenter: 1–1200. OpenAI, Veo and Runway: 4, 8 or 12.",
                        "60"
                    ],
                    [
                        "language",
                        "JSON body",
                        "language name",
                        "No",
                        "Original video language. Kept for backward compatibility; prefer localization.source_language_code.",
                        "English"
                    ],
                    [
                        "language_code",
                        "JSON body",
                        "BCP-47 code",
                        "No",
                        "Original language code. Kept for backward compatibility; prefer localization.source_language_code.",
                        "en"
                    ],
                    [
                        "translation_languages",
                        "JSON body",
                        "array of BCP-47 codes · max 20",
                        "No",
                        "Backward-compatible alias of localization.target_languages. An empty array creates no translation.",
                        [
                            "fr-BE",
                            "nl-BE"
                        ]
                    ],
                    [
                        "localization",
                        "JSON body",
                        "object",
                        "No",
                        "Controls the source language, optional translations and automatic routing.",
                        {
                            "source_language_code": "en",
                            "translate": true,
                            "target_languages": [
                                "fr-BE",
                                "nl-BE"
                            ]
                        }
                    ],
                    [
                        "localization.source_language_code",
                        "JSON body",
                        "BCP-47 code",
                        "No",
                        "Language of the original title, topic and description.",
                        "en"
                    ],
                    [
                        "localization.translate",
                        "JSON body",
                        "boolean",
                        "No",
                        "Set false to create only the original video, even when target_languages is present. Default: true.",
                        "true"
                    ],
                    [
                        "localization.target_languages",
                        "JSON body",
                        "array of BCP-47 codes · max 20",
                        "No",
                        "One independently billed and tracked video is created per language and routed by connection default language.",
                        [
                            "fr-BE",
                            "nl-BE"
                        ]
                    ],
                    [
                        "tone",
                        "JSON body",
                        "string · max 120",
                        "No",
                        "Editorial tone.",
                        "Professional and friendly"
                    ],
                    [
                        "audience",
                        "JSON body",
                        "string · max 2,000",
                        "No",
                        "Target audience and useful context.",
                        "Small business owners"
                    ],
                    [
                        "call_to_action",
                        "JSON body",
                        "string · max 1,000",
                        "No",
                        "Closing action requested from viewers.",
                        "Visit our website"
                    ],
                    [
                        "aspect_ratio",
                        "JSON body",
                        "9:16 | 16:9 | 1:1",
                        "No",
                        "Instagram, TikTok and Facebook Reels require 9:16.",
                        "9:16"
                    ],
                    [
                        "visibility",
                        "JSON body",
                        "private | unlisted | public",
                        "No",
                        "YouTube visibility. Default: private.",
                        "private"
                    ],
                    [
                        "thumbnail_prompt",
                        "JSON body",
                        "string · max 2,000",
                        "No",
                        "Optional YouTube thumbnail direction.",
                        "Bright product close-up"
                    ],
                    [
                        "scheduled_at",
                        "JSON body",
                        "ISO 8601 date-time",
                        "No",
                        "Desired publication time with timezone. Defaults to now.",
                        "2026-08-05T10:00:00+02:00"
                    ],
                    [
                        "mode",
                        "JSON body",
                        "draft | queue",
                        "No",
                        "Draft saves without production. Queue starts preflights and protected billing. Default: draft.",
                        "draft"
                    ],
                    [
                        "destinations",
                        "JSON body",
                        "object",
                        "Yes",
                        "At least one keyed destination object: youtube, instagram, tiktok or facebook.",
                        {
                            "instagram": {
                                "enabled": true,
                                "account_id": 12
                            }
                        }
                    ],
                    [
                        "destinations.*.enabled",
                        "JSON body",
                        "boolean",
                        "Yes",
                        "Enables that destination.",
                        "true"
                    ],
                    [
                        "destinations.*.account_id",
                        "JSON body",
                        "integer",
                        "No",
                        "Connected account ID. Omit to use the default account.",
                        "12"
                    ],
                    [
                        "destinations.*.connection_label",
                        "JSON body",
                        "string",
                        "No",
                        "Alternative to account_id. Must exactly match one custom connection label; ambiguous labels are rejected.",
                        "Main French channel"
                    ],
                    [
                        "destinations.tiktok.consent",
                        "JSON body",
                        "boolean",
                        "Required for TikTok queue",
                        "Confirms the TikTok publication choices.",
                        "true"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "GET",
                "path": "/videos/{video_id}",
                "scope": "videos:read",
                "summary": "Return complete content, generation, destination and publication details for one video.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Translations",
                "method": "GET",
                "path": "/videos/{video_id}/translations",
                "scope": "videos:read",
                "summary": "Return the original video and every active translated version with its own VID reference, language, destinations and publication status. A translated VID may also be supplied.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Translations",
                "method": "POST",
                "path": "/videos/{video_id}/translations",
                "scope": "videos:write",
                "summary": "Trial or active Pro only. Replace the optional translation choices of an original draft. Use mode queue to start the original and every selected language after routing and billing preflights.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "translation_languages",
                        "JSON body",
                        "array of BCP-47 codes · max 20",
                        "Yes*",
                        "Required unless localization.target_languages or translate=false is supplied. Empty removes draft translations.",
                        [
                            "fr-BE",
                            "nl-BE"
                        ]
                    ],
                    [
                        "translate",
                        "JSON body",
                        "boolean",
                        "No",
                        "Set false to remove every draft translation and keep only the original.",
                        "true"
                    ],
                    [
                        "localization.target_languages",
                        "JSON body",
                        "array of BCP-47 codes · max 20",
                        "No",
                        "Structured alternative to translation_languages.",
                        [
                            "fr-BE",
                            "nl-BE"
                        ]
                    ],
                    [
                        "localization.translate",
                        "JSON body",
                        "boolean",
                        "No",
                        "Structured alternative to translate.",
                        "true"
                    ],
                    [
                        "mode",
                        "JSON body",
                        "draft | queue",
                        "No",
                        "Draft only prepares variants. Queue starts protected production. Default: draft.",
                        "draft"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "PATCH",
                "path": "/videos/{video_id}",
                "scope": "videos:write",
                "summary": "Edit an existing draft or queued video. Only supplied fields are changed.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "project_id",
                        "JSON body",
                        "PRJ reference",
                        "No",
                        "Project returned by GET /projects. Every selected destination must belong to it.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "title",
                        "JSON body",
                        "string · max 100",
                        "No",
                        "Human-readable video title.",
                        "Discover our new product"
                    ],
                    [
                        "topic",
                        "JSON body",
                        "string · max 10,000",
                        "No",
                        "Subject, facts and instructions used to prepare the content.",
                        "Present the three main customer benefits"
                    ],
                    [
                        "description",
                        "JSON body",
                        "string · max 5,000",
                        "No",
                        "Additional publication description.",
                        "A concise product presentation."
                    ],
                    [
                        "video_type",
                        "JSON body",
                        "short | youtube",
                        "No",
                        "Video format. Default: short.",
                        "short"
                    ],
                    [
                        "video_provider",
                        "JSON body",
                        "auto | heygen | openai | google | runway",
                        "No",
                        "Generation provider. Auto selects a ready provider.",
                        "auto"
                    ],
                    [
                        "provider_model",
                        "JSON body",
                        "string · max 100",
                        "No",
                        "Supported provider model override.",
                        "sora-2"
                    ],
                    [
                        "heygen_generation_mode",
                        "JSON body",
                        "video_agent | avatar",
                        "No",
                        "HeyGen production mode.",
                        "video_agent"
                    ],
                    [
                        "visual_instructions",
                        "JSON body",
                        "string · max 10,000",
                        "No",
                        "Scenes, rhythm, framing and visual direction.",
                        "Vertical product shots with clean transitions."
                    ],
                    [
                        "reference_media_urls",
                        "JSON body",
                        "array of HTTPS URLs · max 20",
                        "No",
                        "Public media references accessible by the provider.",
                        [
                            "https://example.com/product.jpg"
                        ]
                    ],
                    [
                        "product_photo_id",
                        "JSON body",
                        "40-character upload id with extension",
                        "No",
                        "Protected photo returned by POST /media/photos. Activates the photo-led production workflow.",
                        "4f7c1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b.jpg"
                    ],
                    [
                        "retouch_photo",
                        "JSON body",
                        "boolean",
                        "No",
                        "When product_photo_id is supplied, request the separately billed protected photo-retouch stage.",
                        "true"
                    ],
                    [
                        "content_goal",
                        "JSON body",
                        "sell | discover | educate | entertain | inspire | trust",
                        "No",
                        "Communication goal used to direct a photo-led production. Default: sell.",
                        "sell"
                    ],
                    [
                        "duration_seconds",
                        "JSON body",
                        "integer",
                        "No",
                        "Presenter: 1–1200. OpenAI, Veo and Runway: 4, 8 or 12.",
                        "60"
                    ],
                    [
                        "language",
                        "JSON body",
                        "language name",
                        "No",
                        "Original video language. Kept for backward compatibility; prefer localization.source_language_code.",
                        "English"
                    ],
                    [
                        "language_code",
                        "JSON body",
                        "BCP-47 code",
                        "No",
                        "Original language code. Kept for backward compatibility; prefer localization.source_language_code.",
                        "en"
                    ],
                    [
                        "translation_languages",
                        "JSON body",
                        "array of BCP-47 codes · max 20",
                        "No",
                        "Backward-compatible alias of localization.target_languages. An empty array creates no translation.",
                        [
                            "fr-BE",
                            "nl-BE"
                        ]
                    ],
                    [
                        "localization",
                        "JSON body",
                        "object",
                        "No",
                        "Controls the source language, optional translations and automatic routing.",
                        {
                            "source_language_code": "en",
                            "translate": true,
                            "target_languages": [
                                "fr-BE",
                                "nl-BE"
                            ]
                        }
                    ],
                    [
                        "localization.source_language_code",
                        "JSON body",
                        "BCP-47 code",
                        "No",
                        "Language of the original title, topic and description.",
                        "en"
                    ],
                    [
                        "localization.translate",
                        "JSON body",
                        "boolean",
                        "No",
                        "Set false to create only the original video, even when target_languages is present. Default: true.",
                        "true"
                    ],
                    [
                        "localization.target_languages",
                        "JSON body",
                        "array of BCP-47 codes · max 20",
                        "No",
                        "One independently billed and tracked video is created per language and routed by connection default language.",
                        [
                            "fr-BE",
                            "nl-BE"
                        ]
                    ],
                    [
                        "tone",
                        "JSON body",
                        "string · max 120",
                        "No",
                        "Editorial tone.",
                        "Professional and friendly"
                    ],
                    [
                        "audience",
                        "JSON body",
                        "string · max 2,000",
                        "No",
                        "Target audience and useful context.",
                        "Small business owners"
                    ],
                    [
                        "call_to_action",
                        "JSON body",
                        "string · max 1,000",
                        "No",
                        "Closing action requested from viewers.",
                        "Visit our website"
                    ],
                    [
                        "aspect_ratio",
                        "JSON body",
                        "9:16 | 16:9 | 1:1",
                        "No",
                        "Instagram, TikTok and Facebook Reels require 9:16.",
                        "9:16"
                    ],
                    [
                        "visibility",
                        "JSON body",
                        "private | unlisted | public",
                        "No",
                        "YouTube visibility. Default: private.",
                        "private"
                    ],
                    [
                        "thumbnail_prompt",
                        "JSON body",
                        "string · max 2,000",
                        "No",
                        "Optional YouTube thumbnail direction.",
                        "Bright product close-up"
                    ],
                    [
                        "scheduled_at",
                        "JSON body",
                        "ISO 8601 date-time",
                        "No",
                        "Desired publication time with timezone. Defaults to now.",
                        "2026-08-05T10:00:00+02:00"
                    ],
                    [
                        "destinations",
                        "JSON body",
                        "object",
                        "No",
                        "At least one keyed destination object: youtube, instagram, tiktok or facebook.",
                        {
                            "instagram": {
                                "enabled": true,
                                "account_id": 12
                            }
                        }
                    ],
                    [
                        "destinations.*.enabled",
                        "JSON body",
                        "boolean",
                        "No",
                        "Required only inside a destination object supplied by the PATCH request.",
                        "true"
                    ],
                    [
                        "destinations.*.account_id",
                        "JSON body",
                        "integer",
                        "No",
                        "Connected account ID. Omit to use the default account.",
                        "12"
                    ],
                    [
                        "destinations.*.connection_label",
                        "JSON body",
                        "string",
                        "No",
                        "Alternative to account_id. Must exactly match one custom connection label; ambiguous labels are rejected.",
                        "Main French channel"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "DELETE",
                "path": "/videos/{video_id}",
                "scope": "videos:write",
                "summary": "Cancel an eligible draft or queued video while preserving its audit history.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "GET",
                "path": "/videos/{video_id}/status",
                "scope": "videos:read",
                "summary": "Retrieve a lightweight production status suitable for polling.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "GET",
                "path": "/videos/{video_id}/events",
                "scope": "videos:read",
                "summary": "Return ordered activity and error events for production tracking.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "GET",
                "path": "/videos/{video_id}/costs",
                "scope": "billing:read",
                "summary": "Return provider estimates, Vidmfy charges, reservations and refunds for one video.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "GET",
                "path": "/videos/{video_id}/analytics",
                "scope": "analytics:read",
                "summary": "Return daily platform metrics attached to one published video.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "POST",
                "path": "/videos/{video_id}/queue",
                "scope": "videos:write",
                "summary": "Start an existing draft after capacity, destination, provider and billing preflights.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ]
                ]
            },
            {
                "group": "Videos",
                "method": "POST",
                "path": "/videos/{video_id}/retry",
                "scope": "videos:write",
                "summary": "Retry an eligible failure. Completed reusable media resumes at publication without regenerating the video.",
                "parameters": [
                    [
                        "video_id",
                        "Path",
                        "string · VID-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy video reference.",
                        "VID-A1B2C3D4E5"
                    ],
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ]
                ]
            },
            {
                "group": "Campaigns",
                "method": "GET",
                "path": "/campaigns",
                "scope": "campaigns:read",
                "summary": "List campaigns, production counts and multilingual configuration.",
                "parameters": [
                    [
                        "page",
                        "Query",
                        "integer ≥ 1",
                        "No",
                        "Page number. Default: 1.",
                        "1"
                    ],
                    [
                        "per_page",
                        "Query",
                        "integer · 1–100",
                        "No",
                        "Number of results per page. Default: 25.",
                        "25"
                    ]
                ]
            },
            {
                "group": "Campaigns",
                "method": "GET",
                "path": "/campaigns/{campaign_id}",
                "scope": "campaigns:read",
                "summary": "Return the selected campaign configuration, languages and counts.",
                "parameters": [
                    [
                        "campaign_id",
                        "Path",
                        "string · CMP-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy campaign reference.",
                        "CMP-A1B2C3D4E5"
                    ]
                ]
            },
            {
                "group": "Campaigns",
                "method": "GET",
                "path": "/campaigns/{campaign_id}/videos",
                "scope": "campaigns:read",
                "summary": "List videos belonging to one campaign. Video list filters remain available.",
                "parameters": [
                    [
                        "campaign_id",
                        "Path",
                        "string · CMP-XXXXXXXXXX",
                        "Yes",
                        "Permanent Vidmfy campaign reference.",
                        "CMP-A1B2C3D4E5"
                    ],
                    [
                        "page",
                        "Query",
                        "integer ≥ 1",
                        "No",
                        "Page number. Default: 1.",
                        "1"
                    ],
                    [
                        "per_page",
                        "Query",
                        "integer · 1–100",
                        "No",
                        "Number of results per page. Default: 25.",
                        "25"
                    ],
                    [
                        "status",
                        "Query",
                        "comma-separated enum",
                        "No",
                        "Filter by one or several production statuses.",
                        "published,failed"
                    ],
                    [
                        "destination",
                        "Query",
                        "youtube | instagram | tiktok | facebook",
                        "No",
                        "Return videos targeting this platform.",
                        "instagram"
                    ],
                    [
                        "project_id",
                        "Query",
                        "PRJ reference",
                        "No",
                        "Return videos linked to one publishing project.",
                        "PRJ-A1B2C3D4E5"
                    ],
                    [
                        "language_code",
                        "Query",
                        "BCP-47 code",
                        "No",
                        "Return only this original or translated language.",
                        "fr-BE"
                    ],
                    [
                        "localization_group_id",
                        "Query",
                        "MLG reference",
                        "No",
                        "Return all language versions belonging to one localization group.",
                        "MLG-K2L3M4N5P6"
                    ],
                    [
                        "localization_role",
                        "Query",
                        "original | translated",
                        "No",
                        "Return only originals or translated variants.",
                        "translated"
                    ],
                    [
                        "from",
                        "Query",
                        "date or ISO 8601",
                        "No",
                        "Minimum publication date/time.",
                        "2026-08-01"
                    ],
                    [
                        "to",
                        "Query",
                        "date or ISO 8601",
                        "No",
                        "Maximum publication date/time.",
                        "2026-08-31T23:59:59+02:00"
                    ],
                    [
                        "search",
                        "Query",
                        "string · max 100",
                        "No",
                        "Search reference, title or topic.",
                        "product"
                    ]
                ]
            },
            {
                "group": "Billing",
                "method": "GET",
                "path": "/billing",
                "scope": "billing:read",
                "summary": "Return wallet balance, subscription, production limits and free-video counter.",
                "parameters": []
            },
            {
                "group": "Billing",
                "method": "GET",
                "path": "/billing/transactions",
                "scope": "billing:read",
                "summary": "Return paginated wallet movements with video references when applicable.",
                "parameters": [
                    [
                        "page",
                        "Query",
                        "integer ≥ 1",
                        "No",
                        "Page number. Default: 1.",
                        "1"
                    ],
                    [
                        "per_page",
                        "Query",
                        "integer · 1–100",
                        "No",
                        "Number of results per page. Default: 25.",
                        "25"
                    ]
                ]
            },
            {
                "group": "Analytics",
                "method": "GET",
                "path": "/analytics/summary",
                "scope": "analytics:read",
                "summary": "Return consolidated platform performance, top content and analytics connection state.",
                "parameters": [
                    [
                        "limit",
                        "Query",
                        "integer · 1–50",
                        "No",
                        "Maximum number of top-performing content items. Default: 12.",
                        "12"
                    ]
                ]
            },
            {
                "group": "Media",
                "method": "POST",
                "path": "/media/photos",
                "scope": "videos:write",
                "summary": "Upload and validate a protected product photo before creating a photo-led video.",
                "parameters": [
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "photo",
                        "Multipart body",
                        "JPEG, PNG or WebP file",
                        "Yes",
                        "Product image within the configured upload size and dimension limits.",
                        "product.jpg"
                    ]
                ]
            },
            {
                "group": "Media",
                "method": "GET",
                "path": "/media/photos/{photo_id}",
                "scope": "videos:read",
                "summary": "Stream an owned protected product photo.",
                "parameters": [
                    [
                        "photo_id",
                        "Path",
                        "40 hexadecimal characters plus jpg, png or webp",
                        "Yes",
                        "Photo identifier returned by POST /media/photos.",
                        "4f7c1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b.jpg"
                    ]
                ]
            },
            {
                "group": "Media",
                "method": "DELETE",
                "path": "/media/photos/{photo_id}",
                "scope": "videos:write",
                "summary": "Delete an owned protected photo that is no longer needed.",
                "parameters": [
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "photo_id",
                        "Path",
                        "40 hexadecimal characters plus jpg, png or webp",
                        "Yes",
                        "Photo identifier returned by POST /media/photos.",
                        "4f7c1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b.jpg"
                    ]
                ]
            },
            {
                "group": "Sources",
                "method": "POST",
                "path": "/sources/url/check",
                "scope": "videos:write",
                "summary": "Verify and safely extract a public web page before it is used as a content source.",
                "parameters": [
                    [
                        "Idempotency-Key",
                        "Header",
                        "string · 8–120",
                        "Yes",
                        "Unique safe value for this write operation. Reusing it with the same payload replays the response.",
                        "order-1842-video-1"
                    ],
                    [
                        "url",
                        "JSON body",
                        "public HTTP(S) URL · max 2,048",
                        "Yes",
                        "Public URL to validate. Private, local, authenticated and unsafe hosts are blocked.",
                        "https://example.com/product"
                    ]
                ]
            }
        ]
    },
    "request_id": "2394b211-d236-4009-b98e-c9fefe5daef7"
}