Manage media
Everything you upload or import lives in your workspace's media library. To add files, see Upload media; this page covers the rest.
Collect files from someone's device
When the file is on a user's phone or laptop (or pasted into a chat with your AI agent), create an upload link and hand it to them. The link opens a Schedulin page where they can drop files straight into your media library — no API key needed on their side.
curl -X POST https://api.schedulin.app/v0/media/upload-link \ -H "x-api-key: $SCHEDULIN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "expiresInHours": 24 }'
{ "url": "https://…/upload/…", "expiresAt": "2026-06-02T15:00:00.000Z" }
const link = (await client.media.createUploadLink({ expiresInHours: 24 })) as { url: string; expiresAt: string; };
link = client.media.create_upload_link(expires_in_hours=24) print(link["url"])
expiresInHours defaults to 24 (max 168, one week). Once the user says they're done, list
media to find the new files and use their url in a post.
List and search media
GET /v0/media is paginated (page, limit up to 100) and returns the most recently
updated items first. Filter with q (file name), type (image, video, or all), and
tagIds. See Pagination.
curl "https://api.schedulin.app/v0/media?q=launch&type=image&limit=20" \ -H "x-api-key: $SCHEDULIN_API_KEY"
const { items, totalPages } = await client.media.list({ q: "launch", type: "image", limit: 20 });
page = client.media.list(q="launch", type="image", limit=20) for item in page.items: print(item.id, item.url)
Fetch a single item with GET /v0/media/{id} (client.media.retrieve).
Delete media
curl -X DELETE https://api.schedulin.app/v0/media/6f0c… \ -H "x-api-key: $SCHEDULIN_API_KEY"
Deleting removes the file from storage. Media that is still attached to a post can't be
deleted — the API returns 409 Conflict; remove it from those posts (or delete them) first.