Media handling

View .md

How Dravo uploads, imports, verifies and reuses images and videos for publishing.


The Dravo media flow

Dravo publishes media by URL. The simplest reliable path is:

  1. Upload a local file (multipart or Base64) or import a remote URL with POST /v1/media.
  2. Store the returned public_url.
  3. Pass that URL in media_urls when creating a post — within 60 days, while the asset is still hosted (see Retention).
Shell
curl -X POST https://api.dravo.dev/v1/media \
  -H "Authorization: Bearer $DRAVO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "source_url": "https://example.com/promo.jpg" }'
JSON
{  "id": "media_8f2c1d",  "public_url": "https://cdn.dravo.dev/u/abc/2f1c....jpg",  "kind": "image",  "content_type": "image/jpeg",  "size_bytes": 84211,  "status": "ready",  "created_at": "2026-06-27T10:00:00Z",  "expires_at": "2026-08-26T10:00:00Z"}

You can also send a local file as Base64 in the JSON body — pass file_base64 and its content_type instead of source_url — or as multipart/form-data with a file field. All three create the same asset.

Then publish:

JSON
{  "account_ids": ["acc_8f2c1d"],  "text": "New drop.",  "media_urls": ["https://cdn.dravo.dev/u/abc/2f1c....jpg"]}

When to use Dravo media

Use Dravo media when you want a stable asset URL owned by the same system that publishes the post. It avoids broken temporary links, expiring signed URLs and late failures when a platform fetches the file.

You can still pass your own public URLs directly in media_urls. That is useful when the asset already lives on a reliable CDN or when a platform requires a domain your organization controls.

Retention

Dravo media is temporary hosting, not a permanent CDN — it's a bridge to get your file a public URL the platforms can fetch. Each asset is stored for 60 days from upload (expires_at in the response), then deleted from Dravo storage.

  • Already-published posts are unaffected. Once a post publishes, the platform has downloaded its own copy; the Dravo URL is no longer used.
  • Scheduled posts that reference expired media will fail. If you schedule a post more than 60 days out, host the asset on your own CDN and pass that URL in media_urls instead.

In practice: upload, then publish (or schedule) within the window. For long-lived assets, use your own storage and pass the URL directly.

Verify external URLs

Before publishing a URL you do not import into Dravo, call POST /v1/media/verify. It checks whether the URL is reachable and reports basic metadata such as kind, content_type and size_bytes.

Limits and formats

ConstraintValue
Direct upload max size30 MB
Remote import max size100 MB
Image typesJPEG, PNG, WebP, GIF
Video typesMP4, MOV, WebM
TransformationsNot in the MVP
Automatic thumbnailsNot in the MVP

Requests that exceed the size limit return 413, and unsupported content types return 415. Dravo stores the asset and returns a public_url; it does not resize, transcode, watermark or optimize the media in this MVP.

Per platform rules

Each platform adds its own constraints on top: aspect ratio, duration, codecs, how many items per post and whether images and videos can be mixed. Dravo keeps the publish contract simple with media_urls, while the platform guides explain the platform-specific limits.