Adopt scheduled post
POST /v1/posts/adopt scope write
Registers in Praeko a Reel that is already scheduled in Buffer (does not call Buffer).
Headers
Authorization: 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 _). |
{
"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"
]
}'const res = await fetch("https://praeko.app/v1/posts/adopt", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.PRAEKO_KEY}`,
"X-Praeko-Contract": "en",
"Content-Type": "application/json",
},
body: JSON.stringify({
"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"
]
}),
});
console.log(res.status, await res.json());import { Praeko } from "@praeko/sdk";
const praeko = new Praeko({ url: "https://praeko.app", key: process.env.PRAEKO_KEY });
const resultado = await praeko.posts.adopt({
"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"
]
});
console.log(resultado);import os
import requests
resp = requests.post(
"https://praeko.app/v1/posts/adopt",
headers={
"Authorization": f"Bearer {os.environ['PRAEKO_KEY']}",
"X-Praeko-Contract": "en",
},
json={
"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",
],
},
)
print(resp.status_code, resp.json())<?php
$corpo = <<<'JSON'
{
"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"
]
}
JSON;
$ch = curl_init('https://praeko.app/v1/posts/adopt');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("PRAEKO_KEY"),
'X-Praeko-Contract: en',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $corpo,
]);
$resposta = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $resposta, PHP_EOL;
curl_close($ch);package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"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"
]
}`)
req, err := http.NewRequest("POST", "https://praeko.app/v1/posts/adopt", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PRAEKO_KEY"))
req.Header.Set("X-Praeko-Contract", "en")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(out))
}require "net/http"
require "uri"
uri = URI("https://praeko.app/v1/posts/adopt")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV['PRAEKO_KEY']}"
request["X-Praeko-Contract"] = "en"
request["Content-Type"] = "application/json"
request.body = <<~'JSON'
{
"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"
]
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }
puts response.code, response.bodyusing System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://praeko.app/v1/posts/adopt");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("PRAEKO_KEY"));
request.Headers.Add("X-Praeko-Contract", "en");
request.Content = new StringContent("""
{
"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"
]
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String body = """
{
"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"
]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://praeko.app/v1/posts/adopt"))
.header("Authorization", "Bearer " + System.getenv("PRAEKO_KEY"))
.header("X-Praeko-Contract", "en")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}http POST "https://praeko.app/v1/posts/adopt" \
"Authorization: Bearer $PRAEKO_KEY" \
"X-Praeko-Contract: en" \
"Content-Type: application/json" \
--raw='{
"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"
]
}'Official SDK for NodeInstall it with
npm install @praeko/sdk (see SDK and CLI).No official SDKExample with the language's standard library (or HTTP client). Only the JavaScript SDK exists.
No official SDKExample with the language's standard library (or HTTP client). Only the JavaScript SDK exists.
No official SDKExample with the language's standard library (or HTTP client). Only the JavaScript SDK exists.
No official SDKExample with the language's standard library (or HTTP client). Only the JavaScript SDK exists.
No official SDKExample with the language's standard library (or HTTP client). Only the JavaScript SDK exists.
No official SDKExample with the language's standard library (or HTTP client). Only the JavaScript SDK exists.
Response
| Success status | When |
|---|---|
200 |
Success. |
{
"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
Sign in to try itThe live test uses your key and your account. It stays off when you are not signed in.
Question or mistake on this page? contato@praeko.appView .md