Base URL

http
https://postme.live/api/v1

One-minute quickstart

  1. Open Settings → Developers and create an API key. Copy it once — we only store its hash.
  2. Discover your channels:
    bash
    curl https://postme.live/api/v1/channels \
      -H "Authorization: Bearer pml_live_<lookup>_<secret>"
  3. Create a post (lands as a draft in v1):
    bash
    curl -X POST https://postme.live/api/v1/posts \
      -H "Authorization: Bearer pml_live_<lookup>_<secret>" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
        "caption": "We just shipped v0.20!",
        "channels": [{ "id": "<channel-id-from-step-2>" }]
      }'
  4. Review the draft at the review_url returned in the response, or in the dashboard, and publish from there.

Drafts by default, scheduling opt-in

Posts created through the API are persisted with status: "draft" unless you pass scheduled_for — then they're queued and publish automatically at that time (ISO 8601, at least 2 minutes ahead, at least one media item; consumes one post-quota slot). See Posts → Scheduling. Immediate "post now" stays locked while the API stabilises.

Use the explicit POST /drafts endpoint in code that should always be draft-only — it rejects scheduled_for.

Conventions

  • Auth. Every request needs Authorization: Bearer pml_live_….
  • Idempotency. Every write needs an Idempotency-Key header. Replays return the original response for 24h.
  • Encoding. Request and response bodies are JSON (application/json) unless explicitly multipart.
  • Naming. JSON keys are snake_case. Timestamps are RFC-3339 in UTC. Ids are UUIDv4.
  • Status. 2xx is success, 4xx is your fault, 5xx is ours. See Errors.
  • Rate limit. Plan-based, per key — 5 req/min on Free, 50 on Community. See Rate limits.

Machine-readable spec

The OpenAPI 3.1 spec is the contract: it's what we test against and what we generate clients from.

Download openapi.yaml · paste into editor.swagger.io for an interactive view.

Public API — Overview · postme.live