Video Automation

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

  1. Open API & webhooks in the dashboard.
  2. Click New key, give it a name (for example n8n) and click Create.
  3. 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_date the request waits up to about a minute for the result; longer uploads continue in the background and return a request_id.
  • async_upload=true returns at once with a request_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 example user_required or invalid_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.