Dynamo Developer DocsDynamo Developer Docs
Core Concepts

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 (omit mediumId to merge across all channels, newest first).
  • GET /posts/:postId?mediumId=<id> — a single post (mediumId is 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 status DRAFT or WAITING_FOR_APPROVAL only.
    • DRAFT — permissive; no validation of media, caption, or date.
    • WAITING_FOR_APPROVAL — runs full publish validation and enters the approval queue.
  • submit-for-approval moves DRAFT / REJECTEDWAITING_FOR_APPROVAL.
  • reject (with a required notes) → REJECTED; the creator can iterate back to DRAFT with PATCH status: "DRAFT".
  • revert moves a SCHEDULED post back to DRAFT (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

  • TimezonescheduledFor is 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.

On this page