Automate the complete Vidmfy workflow with one professional API
Connect your website, application, CRM, e-commerce platform or internal workflow to Vidmfy. Create videos, follow production, inspect costs and retrieve cross-platform results without reproducing the video pipeline yourself.
Built for production integrations
Versioned JSON endpoints, predictable status codes, pagination, filtering and stable video references.
Protected against duplicate production
Every write request requires an idempotency key, preventing accidental repeated work and repeated billing.
Controlled by your account
Create, scope, restrict, monitor and immediately revoke every API key from your connected Vidmfy account.
One API above the complete video production pipeline
The Vidmfy API exposes the same protected business rules used by the web application: connected destination checks, provider selection, free-trial limits, wallet reservations, production status, publication retry logic and cost traceability.
A single integration can create a draft, select YouTube, Instagram, TikTok or Facebook destinations, queue production, follow every stage using the permanent VID reference, and retrieve publication links and analytics after completion.
API keys are shown once, stored only as one-way hashes and can be limited by permission, expiration, request rate and exact source IP addresses.
Endpoint reference
All responses are JSON. All authenticated routes require a scoped account API key.
https://vidmfy.com/api/v1Authentication and headers
Use the complete secret only on a trusted server. Keys support granular scopes, expiration, rate limiting and an optional exact-IP allowlist.
Authorization: Bearer vfm_live_…
Accept: application/json
Content-Type: application/json
Idempotency-Key: order-1842-video-1Open a GET request directly in your browser
For quick manual checks, read-only GET endpoints also accept the key in the query string.
https://vidmfy.com/api/v1/me?api_key=YOUR_API_KEYAccount & connections
Required scope: account:read / connections:read
/meAccount, plan, trial, wallet and current key information.
/capabilitiesSupported providers, formats, statuses, languages and limits.
/connectionsConnected publishing accounts and available content/video providers.
Videos
Required scope: videos:read / videos:write
/videosList and filter videos by status, destination, campaign, date or search.
/videosCreate a draft or immediately queue a protected production.
/videos/{VID-reference}Complete video, destination, publication and failure details.
/videos/{VID-reference}Edit a video that has not started production.
/videos/{VID-reference}Cancel an eligible video without removing its audit history.
/videos/{VID-reference}/statusLightweight progress and destination status.
/videos/{VID-reference}/eventsOrdered production and publication events.
/videos/{VID-reference}/costsWallet charges, API usage and refunds for one video.
/videos/{VID-reference}/analyticsPlatform results attached to one video.
/videos/{VID-reference}/queueQueue an existing draft after all preflight checks.
/videos/{VID-reference}/retryRetry publication from the completed media when eligible.
Campaigns
Required scope: campaigns:read
/campaignsPaginated campaigns with status and production counts.
/campaigns/{CMP-reference}One campaign and its schedule configuration.
/campaigns/{CMP-reference}/videosVideos produced or planned for the selected campaign.
Billing & analytics
Required scope: billing:read / analytics:read
/billingWallet balance, subscription and free-trial state.
/billing/transactionsPaginated wallet history with video references.
/analytics/summaryConsolidated publication and performance summary.
Source tools
Required scope: videos:write
/sources/url/checkSafely verify a public URL before using it as video content.
Detailed documentation for every endpoint
Open an endpoint to see every accepted parameter, whether it is required, its location and type, an example value, and an example JSON response.
Service
GET/Discover API version, base URL, documentation and resources.+
Accepted parameters
No path, query or body parameter is accepted. Only the authentication header is required when the endpoint is not public.
Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"name": "Vidmfy API",
"version": "v1",
"documentation": "https://vidmfy.com/?page=api-documentation",
"base_url": "https://vidmfy.com/api/v1",
"authentication": "Authorization: Bearer vfm_live_…",
"resources": [
"account",
"connections",
"videos",
"campaigns",
"billing",
"analytics",
"URL source checks"
]
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/healthCheck whether API v1 and its database bootstrap are operational.+
Accepted parameters
No path, query or body parameter is accepted. Only the authentication header is required when the endpoint is not public.
Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"service": "Vidmfy API",
"version": "v1",
"status": "operational",
"time": "2026-08-02T09:30:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Account
GET/meReturn the authenticated account, plan and current API key. Wallet data is included only with billing:read.+
Accepted parameters
No path, query or body parameter is accepted. Only the authentication header is required when the endpoint is not public.
Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": 42,
"name": "Alex Martin",
"email": "alex@example.com",
"company": "Example Studio",
"language": "English",
"timezone": "Europe/Brussels",
"plan": {
"code": "creator",
"subscription_status": "active"
},
"api_key": {
"name": "Production website",
"prefix": "vfm_live_9060E409",
"scopes": [
"account:read",
"billing:read"
]
},
"wallet": {
"balance_cents": 3595,
"balance": "35.95"
},
"free_videos_remaining": 0
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/capabilitiesList supported providers, destinations, formats, languages, statuses and limits.+
Accepted parameters
No path, query or body parameter is accepted. Only the authentication header is required when the endpoint is not public.
Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"video_providers": [
"auto",
"heygen",
"openai",
"google",
"runway"
],
"video_types": [
"short",
"youtube"
],
"aspect_ratios": [
"9:16",
"16:9",
"1:1"
],
"publishing_destinations": [
"youtube",
"instagram",
"tiktok",
"facebook"
],
"statuses": [
"draft",
"queued",
"generating_script",
"generating_video",
"published",
"failed"
],
"limits": {
"page_size_max": 100,
"api_key_rate_limit_max_per_minute": 300
}
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/connectionsReturn safe provider availability and connected publishing destinations without secrets or OAuth tokens.+
Accepted parameters
No path, query or body parameter is accepted. Only the authentication header is required when the endpoint is not public.
Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"content_and_video_providers": {
"openai": {
"credential_source": "vidmfy",
"ready": true,
"managed_status": {
"available": true,
"enabled": true,
"unit": "tokens"
}
}
},
"publishing_destinations": {
"youtube": [
{
"id": 4,
"name": "Example Channel",
"youtube_channel_id": "UC123",
"is_default": true,
"last_verified_at": "2026-08-02 09:00:00"
}
],
"instagram": [
{
"id": 12,
"name": "examplebrand",
"external_id": "17841400000000000",
"is_default": true,
"last_verified_at": "2026-08-02 09:00:00"
}
]
}
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Videos
GET/videosList, search and filter videos.+
Accepted parameters
pageQueryinteger ≥ 1NoPage number. Default: 1.
1per_pageQueryinteger · 1–100NoNumber of results per page. Default: 25.
25statusQuerycomma-separated enumNoFilter by one or several production statuses.
published,faileddestinationQueryyoutube | instagram | tiktok | facebookNoReturn videos targeting this platform.
instagramcampaign_idQueryCMP referenceNoReturn videos linked to one campaign.
CMP-A1B2C3D4E5fromQuerydate or ISO 8601NoMinimum publication date/time.
2026-08-01toQuerydate or ISO 8601NoMaximum publication date/time.
2026-08-31T23:59:59+02:00searchQuerystring · max 100NoSearch reference, title or topic.
productExample response
HTTP 200 OK · application/json{
"ok": true,
"data": [
{
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "draft",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"pages": 1
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}POST/videosCreate a reviewable draft or queue a new protected production.+
Accepted parameters
Idempotency-KeyHeaderstring · 8–120YesUnique safe value for this write operation. Reusing it with the same payload replays the response.
order-1842-video-1titleJSON bodystring · max 100YesHuman-readable video title.
Discover our new producttopicJSON bodystring · max 10,000YesSubject, facts and instructions used to prepare the content.
Present the three main customer benefitsdescriptionJSON bodystring · max 5,000NoAdditional publication description.
A concise product presentation.video_typeJSON bodyshort | youtubeNoVideo format. Default: short.
shortvideo_providerJSON bodyauto | heygen | openai | google | runwayNoGeneration provider. Auto selects a ready provider.
autoprovider_modelJSON bodystring · max 100NoSupported provider model override.
sora-2heygen_generation_modeJSON bodyvideo_agent | avatarNoHeyGen production mode.
video_agentvisual_instructionsJSON bodystring · max 10,000NoScenes, rhythm, framing and visual direction.
Vertical product shots with clean transitions.reference_media_urlsJSON bodyarray of HTTPS URLs · max 20NoPublic media references accessible by the provider.
["https://example.com/product.jpg"]duration_secondsJSON bodyintegerNoPresenter: 1–1200. OpenAI, Veo and Runway: 4, 8 or 12.
60languageJSON bodystring · max 80NoContent language. Defaults to account language.
EnglishtoneJSON bodystring · max 120NoEditorial tone.
Professional and friendlyaudienceJSON bodystring · max 2,000NoTarget audience and useful context.
Small business ownerscall_to_actionJSON bodystring · max 1,000NoClosing action requested from viewers.
Visit our websiteaspect_ratioJSON body9:16 | 16:9 | 1:1NoInstagram, TikTok and Facebook Reels require 9:16.
9:16visibilityJSON bodyprivate | unlisted | publicNoYouTube visibility. Default: private.
privatethumbnail_promptJSON bodystring · max 2,000NoOptional YouTube thumbnail direction.
Bright product close-upscheduled_atJSON bodyISO 8601 date-timeNoDesired publication time with timezone. Defaults to now.
2026-08-05T10:00:00+02:00modeJSON bodydraft | queueNoDraft saves without production. Queue starts preflights and protected billing. Default: draft.
draftdestinationsJSON bodyobjectYesAt least one keyed destination object: youtube, instagram, tiktok or facebook.
{"instagram":{"enabled":true,"account_id":12}}destinations.*.enabledJSON bodybooleanYesEnables that destination.
truedestinations.*.account_idJSON bodyintegerNoConnected account ID. Omit to use the default account.
12destinations.tiktok.consentJSON bodybooleanRequired for TikTok queueConfirms the TikTok publication choices.
trueExample response
HTTP 201 Created · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "draft",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/videos/{video_id}Return complete content, generation, destination and publication details for one video.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "draft",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00",
"content": {
"description": "A concise product presentation.",
"language": "English",
"tone": "Professional and friendly",
"audience": "Small business owners",
"call_to_action": "Visit our website",
"script": null,
"visibility": "private"
}
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}PATCH/videos/{video_id}Edit an existing draft or queued video. Only supplied fields are changed.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Idempotency-KeyHeaderstring · 8–120YesUnique safe value for this write operation. Reusing it with the same payload replays the response.
order-1842-video-1titleJSON bodystring · max 100NoHuman-readable video title.
Discover our new producttopicJSON bodystring · max 10,000NoSubject, facts and instructions used to prepare the content.
Present the three main customer benefitsdescriptionJSON bodystring · max 5,000NoAdditional publication description.
A concise product presentation.video_typeJSON bodyshort | youtubeNoVideo format. Default: short.
shortvideo_providerJSON bodyauto | heygen | openai | google | runwayNoGeneration provider. Auto selects a ready provider.
autoprovider_modelJSON bodystring · max 100NoSupported provider model override.
sora-2heygen_generation_modeJSON bodyvideo_agent | avatarNoHeyGen production mode.
video_agentvisual_instructionsJSON bodystring · max 10,000NoScenes, rhythm, framing and visual direction.
Vertical product shots with clean transitions.reference_media_urlsJSON bodyarray of HTTPS URLs · max 20NoPublic media references accessible by the provider.
["https://example.com/product.jpg"]duration_secondsJSON bodyintegerNoPresenter: 1–1200. OpenAI, Veo and Runway: 4, 8 or 12.
60languageJSON bodystring · max 80NoContent language. Defaults to account language.
EnglishtoneJSON bodystring · max 120NoEditorial tone.
Professional and friendlyaudienceJSON bodystring · max 2,000NoTarget audience and useful context.
Small business ownerscall_to_actionJSON bodystring · max 1,000NoClosing action requested from viewers.
Visit our websiteaspect_ratioJSON body9:16 | 16:9 | 1:1NoInstagram, TikTok and Facebook Reels require 9:16.
9:16visibilityJSON bodyprivate | unlisted | publicNoYouTube visibility. Default: private.
privatethumbnail_promptJSON bodystring · max 2,000NoOptional YouTube thumbnail direction.
Bright product close-upscheduled_atJSON bodyISO 8601 date-timeNoDesired publication time with timezone. Defaults to now.
2026-08-05T10:00:00+02:00destinationsJSON bodyobjectNoAt least one keyed destination object: youtube, instagram, tiktok or facebook.
{"instagram":{"enabled":true,"account_id":12}}destinations.*.enabledJSON bodybooleanNoRequired only inside a destination object supplied by the PATCH request.
truedestinations.*.account_idJSON bodyintegerNoConnected account ID. Omit to use the default account.
12Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"title": "Updated product presentation",
"topic": "Present the main customer benefits",
"status": "draft",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}DELETE/videos/{video_id}Cancel an eligible draft or queued video while preserving its audit history.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Idempotency-KeyHeaderstring · 8–120YesUnique safe value for this write operation. Reusing it with the same payload replays the response.
order-1842-video-1Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "cancelled",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/videos/{video_id}/statusRetrieve a lightweight production status suitable for polling.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"status": "generating_video",
"progress": {
"stage": "video_generation",
"validation": null,
"error": null,
"retry_count": 0
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"updated_at": "2026-08-02T09:42:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/videos/{video_id}/eventsReturn ordered activity and error events for production tracking.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Example response
HTTP 200 OK · application/json{
"ok": true,
"data": [
{
"type": "activity",
"status": "success",
"message": "Script generation completed.",
"process_name": null,
"stage": null,
"created_at": "2026-08-02 09:35:00"
},
{
"type": "activity",
"status": "info",
"message": "Video generation started.",
"process_name": null,
"stage": null,
"created_at": "2026-08-02 09:36:00"
}
],
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/videos/{video_id}/costsReturn provider estimates, Vidmfy charges, reservations and refunds for one video.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"video_id": "VID-A1B2C3D4E5",
"currency": "USD",
"totals": {
"provider_cost_estimate_cents": 120.5,
"customer_charge_cents": 185,
"refunded_cents": 0,
"net_customer_charge_cents": 185
},
"charges": [
{
"reference": "MAC-EXAMPLE",
"provider": "heygen",
"operation": "video_agent",
"model": "video_agent",
"credential_source": "vidmfy",
"pricing_unit": "second",
"actual_quantity": 55,
"customer_charge_cents": 185,
"refunded_cents": 0,
"status": "finalized"
}
]
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/videos/{video_id}/analyticsReturn daily platform metrics attached to one published video.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"video_id": "VID-A1B2C3D4E5",
"items": [
{
"platform": "instagram",
"metric_date": "2026-08-02",
"views": 1250,
"reach": 980,
"impressions": 1400,
"likes": 84,
"comments": 9,
"shares": 17,
"saves": 25,
"watch_time_seconds": 22100,
"average_watch_time_seconds": 17.68,
"followers_gained": 12,
"followers_lost": 0,
"updated_at": "2026-08-02 10:00:00"
}
]
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}POST/videos/{video_id}/queueStart an existing draft after capacity, destination, provider and billing preflights.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Idempotency-KeyHeaderstring · 8–120YesUnique safe value for this write operation. Reusing it with the same payload replays the response.
order-1842-video-1Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "queued",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": "2026-08-05T10:00:00+02:00",
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}POST/videos/{video_id}/retryRetry an eligible failure. Completed reusable media resumes at publication without regenerating the video.+
Accepted parameters
video_idPathstring · VID-XXXXXXXXXXYesPermanent Vidmfy video reference.
VID-A1B2C3D4E5Idempotency-KeyHeaderstring · 8–120YesUnique safe value for this write operation. Reusing it with the same payload replays the response.
order-1842-video-1Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "ready_to_upload",
"progress": {
"stage": "publication_retry",
"validation": null,
"error": null,
"retry_count": 1
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": null,
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Campaigns
GET/campaignsList campaigns and their production counts.+
Accepted parameters
pageQueryinteger ≥ 1NoPage number. Default: 1.
1per_pageQueryinteger · 1–100NoNumber of results per page. Default: 25.
25Example response
HTTP 200 OK · application/json{
"ok": true,
"data": [
{
"id": "CMP-A1B2C3D4E5",
"user_id": 42,
"name": "August product launch",
"campaign_type": "normal",
"content_mode": "manual",
"theme": "Present the new collection",
"start_date": "2026-08-05",
"end_date": "2026-08-31",
"weekdays": [
"1",
"3",
"5"
],
"publish_time": "10:00:00",
"language": "English",
"destinations": "instagram,tiktok",
"planned_videos": 12,
"video_count": 12
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"pages": 1
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/campaigns/{campaign_id}Return the selected campaign configuration and counts.+
Accepted parameters
campaign_idPathstring · CMP-XXXXXXXXXXYesPermanent Vidmfy campaign reference.
CMP-A1B2C3D4E5Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"id": "CMP-A1B2C3D4E5",
"name": "August product launch",
"campaign_type": "normal",
"content_mode": "manual",
"theme": "Present the new collection",
"start_date": "2026-08-05",
"end_date": "2026-08-31",
"weekdays": [
"1",
"3",
"5"
],
"publish_time": "10:00:00",
"language": "English",
"destinations": "instagram,tiktok",
"planned_videos": 12,
"video_count": 12
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/campaigns/{campaign_id}/videosList videos belonging to one campaign. Video list filters remain available.+
Accepted parameters
campaign_idPathstring · CMP-XXXXXXXXXXYesPermanent Vidmfy campaign reference.
CMP-A1B2C3D4E5pageQueryinteger ≥ 1NoPage number. Default: 1.
1per_pageQueryinteger · 1–100NoNumber of results per page. Default: 25.
25statusQuerycomma-separated enumNoFilter by one or several production statuses.
published,faileddestinationQueryyoutube | instagram | tiktok | facebookNoReturn videos targeting this platform.
instagramfromQuerydate or ISO 8601NoMinimum publication date/time.
2026-08-01toQuerydate or ISO 8601NoMaximum publication date/time.
2026-08-31T23:59:59+02:00searchQuerystring · max 100NoSearch reference, title or topic.
productExample response
HTTP 200 OK · application/json{
"ok": true,
"data": [
{
"id": "VID-A1B2C3D4E5",
"title": "Discover our new product",
"topic": "Present the main customer benefits",
"status": "draft",
"progress": {
"stage": null,
"validation": null,
"error": null,
"retry_count": 0
},
"format": {
"type": "short",
"aspect_ratio": "9:16",
"duration_value": 1,
"billing_duration_seconds": 60
},
"generation": {
"provider": "auto",
"model": null,
"provider_job_id": null
},
"destinations": {
"instagram": {
"enabled": true,
"account_id": 12,
"external_id": null,
"url": null
}
},
"campaign_id": "CMP-A1B2C3D4E5",
"scheduled_at": "2026-08-05T10:00:00+02:00",
"publish_at": null,
"published_at": null,
"created_at": "2026-08-02T09:30:00+02:00",
"updated_at": "2026-08-02T09:30:00+02:00"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 12,
"pages": 1
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Billing
GET/billingReturn wallet balance, subscription, production limits and free-video counter.+
Accepted parameters
No path, query or body parameter is accepted. Only the authentication header is required when the endpoint is not public.
Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"currency": "USD",
"wallet": {
"balance_cents": 3595,
"balance": "35.95"
},
"subscription": {
"status": "active",
"plan": "creator",
"interval": "month",
"current_period_end": "2026-09-01T00:00:00+02:00"
},
"limits": {
"monthly_videos": 30,
"used_this_month": 7
},
"free_videos_remaining": 0
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}GET/billing/transactionsReturn paginated wallet movements with video references when applicable.+
Accepted parameters
pageQueryinteger ≥ 1NoPage number. Default: 1.
1per_pageQueryinteger · 1–100NoNumber of results per page. Default: 25.
25Example response
HTTP 200 OK · application/json{
"ok": true,
"data": [
{
"id": 901,
"type": "debit",
"amount_cents": -185,
"balance_after_cents": 3595,
"description": "Vidmfy API · HeyGen · video agent",
"created_at": "2026-08-02 09:36:00",
"video_id": "VID-A1B2C3D4E5"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"pages": 1
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Analytics
GET/analytics/summaryReturn consolidated platform performance, top content and analytics connection state.+
Accepted parameters
limitQueryinteger · 1–50NoMaximum number of top-performing content items. Default: 12.
12Example response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"summary": {
"platforms": {
"youtube": {
"label": "YouTube",
"views": 4200,
"likes": 210
},
"instagram": {
"label": "Instagram",
"views": 7600,
"likes": 540
}
}
},
"top_content": [
{
"video_id": "VID-A1B2C3D4E5",
"platform": "instagram",
"title": "Discover our new product",
"views": 1250,
"permalink": "https://instagram.com/reel/example"
}
],
"connections": [
{
"platform": "instagram",
"status": "connected",
"last_success_at": "2026-08-02 09:55:00"
}
]
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Sources
POST/sources/url/checkVerify and safely extract a public web page before it is used as a content source.+
Accepted parameters
Idempotency-KeyHeaderstring · 8–120YesUnique safe value for this write operation. Reusing it with the same payload replays the response.
order-1842-video-1urlJSON bodypublic HTTP(S) URL · max 2,048YesPublic URL to validate. Private, local, authenticated and unsafe hosts are blocked.
https://example.com/productExample response
HTTP 200 OK · application/json{
"ok": true,
"data": {
"url": "https://example.com/product",
"final_url": "https://example.com/product",
"domain": "example.com",
"title": "Example product",
"description": "A practical product for small businesses.",
"canonical_url": "https://example.com/product",
"preview_image_url": "https://example.com/product.jpg",
"word_count": 640,
"content_hash": "d2a72e74b183f18c…",
"headings": [
"A better way to work",
"Main benefits"
],
"reference_media_urls": [
"https://example.com/product.jpg"
]
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Video request fields
The same payload is used to create a video and to edit a draft. Omitted optional values use safe account defaults.
{"enabled": true, "account_id": 123}. The account ID is optional and defaults to the platform’s default connected account. TikTok also accepts caption, privacy_level, allow_comment, allow_duet, allow_stitch, brand_content, brand_organic and consent.Create and queue a video
Use mode: "draft" to create a reviewable draft. Use mode: "queue" only when the payload is final and the connected destinations are ready.
curl -X POST https://vidmfy.com/api/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: product-842-launch" \
-d '{
"title": "Discover our new product",
"topic": "Explain the key customer benefits",
"language": "English",
"video_provider": "auto",
"video_type": "short",
"duration_seconds": 60,
"aspect_ratio": "9:16",
"destinations": {
"instagram": {"enabled": true},
"tiktok": {"enabled": true, "consent": true}
},
"scheduled_at": "2026-08-05T10:00:00+02:00",
"mode": "draft"
}'Filtering and pagination
List endpoints return data plus a meta object. The maximum page size is 100.
GET /videos?page=1&per_page=25
&status=published
&destination=instagram
&campaign_id=CMP-REFERENCE
&from=2026-08-01
&to=2026-08-31
&search=productProduction status lifecycle
Poll the lightweight status route and stop when the video reaches published, failed or cancelled. Store platform publication URLs returned in the destination objects.
Other actionable states: waiting_video, uploading, budget_paused, failed and cancelled. Use the progress error, event history and retry endpoint to decide the next action.
Errors, request IDs and rate limits
Errors always contain a stable machine-readable code. The X-Request-Id response header is also returned in JSON for support and audit purposes.
{
"ok": false,
"error": {
"code": "insufficient_scope",
"message": "This API key does not include the required permission.",
"details": {"required_scope": "videos:write"}
},
"request_id": "2f19a913-8f91-4d9b-9f95-62d43af81362"
}Create your first scoped key
Sign in to manage credentials, monitor request history and revoke access instantly.
A clear workflow from start to finish
Create a scoped API key
Sign in, open Developer API and select only the permissions needed by the integration.
Authenticate with Bearer
Send the complete key in the Authorization header over HTTPS. Never include it in a URL or client-side application.
Send an idempotency key for writes
Give every POST, PATCH and DELETE operation a unique Idempotency-Key value.
Store Vidmfy references
Keep the returned VID reference and request ID to follow status, costs, analytics and support investigations.
Ways to use Developer API
Use the feature on its own or connect it to the complete Vidmfy production and publishing workflow.
- →Create videos from an e-commerce back office
- →Connect a CRM or customer portal
- →Queue productions from an internal application
- →Display production progress in your own interface
- →Retrieve per-video costs for accounting
- →Feed a business intelligence dashboard
- →Validate public source URLs before production
- →Synchronize published links and analytics
What to know before you start
Where do I create an API key?+
Sign in to Vidmfy and open Developer API in the account menu. The complete secret is displayed only once.
Can an API request create duplicate paid videos?+
Write requests require an Idempotency-Key. Repeating the same request with the same key returns the saved response instead of starting the operation again.
Can I restrict a key?+
Yes. Select exact scopes, a rate limit, an expiration and optionally a list of permitted IPv4 or IPv6 addresses.
Are provider API keys exposed?+
No. Connection summaries report availability and destination identities without returning OAuth tokens or provider secrets.
Does creating a video through the API change pricing?+
No. The API reuses the account plan, trial, wallet and provider billing rules. Costs remain visible through the billing endpoints and the Vidmfy interface.
Bring your next content idea to life with Vidmfy.
Start with one idea, one photo, one URL or a complete campaign calendar.
Create your Vidmfy account →