Posts & Scheduling
Read-only published posts vs the mutable scheduled-post lifecycle.
Dynamo has two kinds of posts, and they behave very differently.
Published posts (read-only)
A published post is already live on a channel. These are read-only: you can list them and read their metrics and live comments, but not change them. They're stored per channel.
GET /posts?mediumId=<id>— posts for one channel (omitmediumIdto merge across all channels, newest first).GET /posts/:postId?mediumId=<id>— a single post (mediumIdis required here).GET /posts/:postId/comments— live comments, fetched fresh from the Meta Graph API and cursor-paginated.
Each post carries engagement metrics and the full attached superpower (or null).
See GET /posts, GET /posts/:id,
insights, and comments
(with a CSV export).
Scheduled posts (the mutable lifecycle)
A scheduled post is the draft/approval resource you create and edit. Create, fetch,
update, delete, and run the approval workflow via /scheduled-posts.
State machine
Solid arrows are reachable through the API. Dashed states and transitions
(approve, going live) are human / in-app only.
- You may create a post with
statusDRAFTorWAITING_FOR_APPROVALonly.DRAFT— permissive; no validation of media, caption, or date.WAITING_FOR_APPROVAL— runs full publish validation and enters the approval queue.
submit-for-approvalmovesDRAFT/REJECTED→WAITING_FOR_APPROVAL.reject(with a requirednotes) →REJECTED; the creator can iterate back toDRAFTwithPATCH status: "DRAFT".revertmoves aSCHEDULEDpost back toDRAFT(cancelling the task).
The WAITING_FOR_APPROVAL → SCHEDULED transition — going live — is human-only.
/approve and /publish are disabled, and SCHEDULED is rejected on create
(422). A human reviews and schedules in the app.
Full publish validation
To leave DRAFT (i.e. to enter WAITING_FOR_APPROVAL), a post needs: a future
scheduledFor, a media URL, at least one channel, and a caption on every channel.
Violations return 400 { "message": "..." }.
Timezone & media constraints
- Timezone —
scheduledForis an absolute instant in ISO-8601 (UTC). Convert local time yourself (e.g. 16:00 US Eastern in summer / EDT =20:00Z, UTC−4). - Media — must be a publicly hosted URL (e.g. Cloudinary or Storage). There's no
upload endpoint, and text-only posts can only stay as
DRAFT.
See the /scheduled-posts reference:
create,
get,
update,
delete,
submit,
reject, and
revert.
Field naming: the API field is channels; it maps onto the model's mediumsData,
which is what you'll see in raw response documents.