API and API keys
Create an API key, authenticate with Bearer or Apikey, publish with the REST API v1 or the Upload-Post compatible API, rate limits and Idempotency-Key.
Video Automation has two APIs that share one key:
- REST API v1 – JSON, resource-oriented, for new projects.
- Upload-Post compatible API – the same paths, fields and responses as Upload-Post, so existing scripts, n8n workflows and Make scenarios keep working.
Base URL: https://my-video-automation.com. Full reference: /docs/api, machine-readable: /openapi.json.
Create a key
- Open API & webhooks in the dashboard.
- Click New key, give it a name (for example
n8n) and click Create. - Copy the key right away – it is shown only once. We store only a hash.
Your plan sets how many keys you can have. Revoke a key with Revoke; scripts using it stop working immediately. Creating keys needs the permission "API: manage" (owner and administrator by default).
Authenticate
Send the key in the Authorization header, either way works for both APIs:
Authorization: Bearer YOUR_KEY
Authorization: Apikey YOUR_KEY
Check a key with GET /api/uploadposts/me or GET /v1/me.
REST API v1: publish a video
curl https://my-video-automation.com/v1/posts \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"profile": "my-brand",
"platforms": ["youtube", "bluesky"],
"title": "My video",
"media_urls": ["https://example.com/clip.mp4"],
"scheduled_at": "2026-12-01T12:00:00",
"timezone": "Europe/Berlin"
}'
The answer is the post with a status per platform. Options use the same field names as the Upload-Post API (for example privacyStatus, tags, bluesky_alt_text). Files can also be sent as multipart field media.
Upload-Post compatible: publish a video
curl -X POST https://my-video-automation.com/api/upload \
-H "Authorization: Apikey YOUR_KEY" \
-F "user=my-brand" \
-F "platform[]=youtube" -F "platform[]=bluesky" \
-F "title=My video" \
-F "video=@clip.mp4" \
-F "scheduled_date=2026-12-01T12:00:00" \
-F "timezone=Europe/Berlin"
- Without
scheduled_datethe request waits up to about a minute for the result; longer uploads continue in the background and return arequest_id. async_upload=truereturns at once with arequest_id.- Query the status with
GET /api/uploadposts/status?request_id=…or?job_id=….
Photos go to /api/upload_photos (photos[]), text posts to /api/upload_text. Which platform supports what is on the integration pages.
Rate limits
Requests per minute and key depend on your plan:
| Plan | Requests per minute |
|---|---|
| Trial | 30 |
| Starter | 60 |
| Pro | 120 |
| Business | 300 |
| Agency | 600 |
Every answer carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Above the limit you get HTTP 429 with retry_after in seconds – wait and send again.
Avoid duplicate posts
Send an Idempotency-Key header (any unique string, for example your own ID of the video). If the same key arrives again within 24 hours, we return the original post instead of publishing twice. Useful when a workflow tool retries a request after a timeout.
You can also send request_id (6–64 characters) to choose the ID yourself, and external_id to label posts with your own reference; the history can be filtered by it.
Errors
Errors are JSON with error (machine-readable code) and message. Typical codes:
401– key missing, wrong or revoked.400– a field is missing or invalid, for exampleuser_requiredorinvalid_platform.402– the trial has ended or the workspace has no active plan.429– rate limit or monthly upload limit reached.
Per-platform results contain success, url or error and error_code. Get notified about the result with webhooks.
Automation tools
n8n, Make and Zapier work with plain HTTP requests – see the n8n, Make and Zapier pages.