The Dravo media flow
Dravo publishes media by URL. The simplest reliable path is:
- Upload a local file (multipart or Base64) or import a remote URL with
POST /v1/media. - Store the returned
public_url. - Pass that URL in
media_urlswhen creating a post — within 60 days, while the asset is still hosted (see Retention).
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" }'{ "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:
{ "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_urlsinstead.
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
| Constraint | Value |
|---|---|
| Direct upload max size | 30 MB |
| Remote import max size | 100 MB |
| Image types | JPEG, PNG, WebP, GIF |
| Video types | MP4, MOV, WebM |
| Transformations | Not in the MVP |
| Automatic thumbnails | Not 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.