Ingest then publish
Dravo publishes media by URL. The recommended flow is to ingest a remote file once, then reference the stable URL Dravo returns in your publish call.
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" }'
{
"public_url": "https://cdn.dravo.dev/u/abc/2f1c....jpg",
"content_type": "image/jpeg",
"size_bytes": 84211
}
Then publish:
{
"account_ids": ["acc_8f2c1d"],
"text": "New drop.",
"media_urls": ["https://cdn.dravo.dev/u/abc/2f1c....jpg"]
}
Why ingest first
You can pass any public URL in media_urls, but ingesting first is more
reliable:
- Platforms fetch the URL themselves; a stable, fast, always available URL avoids transient fetch failures at publish time.
- Some networks (for example TikTok with PULL_FROM_URL) require the source domain to be verified. Serving from Dravo storage sidesteps per customer domain verification for those flows.
- You validate the file once (size and type) instead of discovering a problem during delivery.
Limits and formats
| Constraint | Value |
|---|---|
| Max file size | 100 MB |
| Image types | jpeg, png, webp, gif |
| Video types | mp4, quicktime (mov), webm |
Requests that exceed the size return 413, and unsupported content types return
415. See POST /v1/media for the full error list.
Per network rules
Each platform adds its own constraints on top (aspect ratio, duration, codecs, how many items per post). The current MVP publishes one media item per post. Check the per network notes for the exact rules, for example Instagram requiring JPEG for images and MP4 or MOV for Reels.