Skip to content
Sign in Waitlist
Docs/API reference/Posts/Adopt scheduled post

Adopt scheduled post

POST /v1/posts/adopt scope write

Registers in Praeko a Reel that is already scheduled in Buffer (does not call Buffer).

HeadersAuthorization: Bearer praeko_… and X-Praeko-Contract: en. Always send both.

Legacy Portuguese alias (still answered, marked as deprecated): /v1/posts/adotar.

Parameters

Name In Description
Idempotency-Key header Idempotency key (1 to 255 visible characters, for example a UUID). Repeating the SAME request with the same key within 24 h returns the stored response (with Idempotent-Replayed: true) without running it again; a different request with the same key returns 422 idempotency_key_reuse; a request still in progress returns 409 idempotency_in_progress. 5xx errors are not stored. The key is scoped per workspace and per route. See Retry a request safely.

Request body

JSON. Required fields must be sent; the others can be left out.

Field Type Description
title required string Post title. 1 to 200 characters.
network (optional) string Network of the post. Currently only instagram. Values: instagram; default: instagram.
scheduledFor required string Time the Reel goes out. ISO 8601 date and time in UTC, for example 2026-11-14T20:30:00Z. If it is in the past, the post is recorded as already sent.
external required object Where the post is scheduled outside Praeko.
external.provider required string Always buffer. Values: buffer.
external.id required string Id of the post in Buffer.
texts (optional) object Texts.
texts.instagram (optional) object Reel caption.
texts.instagram.text (optional) string Caption.
text (optional) string Caption, if you do not use texts.instagram.text.
media (optional) object Media used only for display in the dashboard.
media.video (optional) string Id of the video media item.
media.cover (optional) string Id of the cover media item (provides the thumbnail).
tags (optional) string[] Tags (up to 40 characters each). Each up to 40 characters.
id (optional) string Post id in Praeko (3 to 64 characters among letters, digits, - and _).
Body example
{
  "title": "Monday Reel: the failing test",
  "network": "instagram",
  "scheduledFor": "2026-11-10T20:30:00.000Z",
  "external": {
    "provider": "buffer",
    "id": "6720a1b3c4d5e6f708192a3b"
  },
  "texts": {
    "instagram": {
      "text": "The test that only failed on Mondays. #programming"
    }
  },
  "tags": [
    "behind-the-scenes"
  ]
}

Example

curl -X POST "https://praeko.app/v1/posts/adopt" \
  -H "Authorization: Bearer $PRAEKO_KEY" \
  -H "X-Praeko-Contract: en" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Monday Reel: the failing test",
  "network": "instagram",
  "scheduledFor": "2026-11-10T20:30:00.000Z",
  "external": {
    "provider": "buffer",
    "id": "6720a1b3c4d5e6f708192a3b"
  },
  "texts": {
    "instagram": {
      "text": "The test that only failed on Mondays. #programming"
    }
  },
  "tags": [
    "behind-the-scenes"
  ]
}'

Response

Success status When
200 Success.
Response 200
{
  "id": "01KA3W2Y6H1RC5ZQ8M0T4VXE7N",
  "title": "The test that only failed on Mondays (final cut)",
  "state": "queued",
  "type": "reel",
  "kind": "video",
  "origin": "api",
  "media": {
    "video": "01KA3VQ7M2T9XE4HB8N5RZ6C0D",
    "cover": null
  },
  "texts": {
    "instagram": {
      "text": "Monday Reel: the failing test"
    }
  },
  "tags": [
    "behind-the-scenes",
    "testing"
  ],
  "thumb": null,
  "items": [
    {
      "id": "01KA3W2Y6J9D3BNF7G2K5PQS8A",
      "network": "instagram",
      "channel": "01KA3V1G4C7N9PXS2WQ6HM8TDZ",
      "state": "scheduled",
      "scheduledFor": "2026-11-10T20:30:00.000Z",
      "custom": true,
      "mode": "now",
      "adopted": true,
      "runAt": null,
      "thumb": null
    }
  ],
  "createdAt": "2026-11-07T14:02:11.482Z",
  "updatedAt": "2026-11-07T15:40:03.120Z",
  "actions": []
}

Returns the adopted post, in the same format as GET /v1/posts/:id. The item is marked with adopted: true.

Example read from the codeThis route cannot be called in our tests without a real provider (Buffer, a video on YouTube, TikTok…), so the example was written by reading the server code. The other responses come from real calls to the test server.

Errors

Status code When
400 empty_body The request body is empty.
400 invalid_json The request body is not a JSON object.
413 body_too_large The request body is larger than 1 MB.
422 invalid_field Invalid external, scheduledFor or id.
409 already_adopted This Buffer post is already in Praeko.
409 id_exists A post with this id already exists.
409 channel_not_connected Instagram is not connected.
422 idempotency_key_reuse The Idempotency-Key was already used with a different request (different method, path, query or body).
409 idempotency_in_progress A request with the same Idempotency-Key is still in progress (retry in a moment).
409 idempotency_response_too_large The original response was larger than 256 KB and was not stored; fetch the resource with GET instead.

Errors on any route

Status code When
401 unauthorized The Authorization: Bearer … header is missing.
401 invalid_api_key The key does not exist.
401 revoked_api_key The key has been revoked.
401 expired_api_key The key has expired.
403 forbidden The key's scope is not enough for this route (see the scope badge).
429 rate_limited The per-minute request limit was exceeded.

The body of every error is { "error": { "code", "message", "details"? } }. See all error codes.

Try it

Try it

The live test uses your key and your account. It stays off when you are not signed in.

Sign in to try it
Question or mistake on this page? contato@praeko.appView .md

Type to search pages, routes and error codes.