curl --request GET \
--url https://api.openpmm.com/v1/workspaces/{workspace_id}/posts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.openpmm.com/v1/workspaces/{workspace_id}/posts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.openpmm.com/v1/workspaces/{workspace_id}/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.openpmm.com/v1/workspaces/{workspace_id}/posts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.openpmm.com/v1/workspaces/{workspace_id}/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.openpmm.com/v1/workspaces/{workspace_id}/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openpmm.com/v1/workspaces/{workspace_id}/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "send_01JABCDEF",
"object": "post",
"group": "launch-2026-08",
"channel": "x",
"state": "draft",
"editable": true,
"terminal": true,
"action_required": true,
"next_action_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"available_actions": [
"update"
],
"version": 2,
"payload": {
"headline": "<string>",
"body": [
"<string>"
],
"destination_options": {
"bluesky": {
"languages": [
"<string>"
],
"content_labels": [
"porn"
],
"alt_text_by_asset_id": {}
}
}
},
"asset_ids": [
"ast_01JABCDEF"
],
"destination_id": "dest_01JABCDEF",
"scheduled_at": "2026-08-09T12:00:00.000Z",
"time_zone": "Europe/Berlin",
"schedule_mode": "now",
"queue_local_date": "2023-12-25",
"queue_window_id": "<string>",
"attempt_count": 1,
"deferred": {
"reason": "publishing_velocity",
"until": "2026-08-09T12:00:00.000Z"
},
"last_error": {
"code": "provider_rejected",
"message": "The provider rejected the post.",
"retryable": true,
"retry_safety": "safe",
"user_action": "retry"
},
"created_at": "2026-08-09T12:00:00.000Z",
"updated_at": "2026-08-09T12:00:00.000Z",
"published_at": "2026-08-09T12:00:00.000Z",
"cancelled_at": "2026-08-09T12:00:00.000Z",
"missed_at": "2026-08-09T12:00:00.000Z",
"receipts": [
{
"id": "rcpt_01JABCDEF",
"object": "receipt",
"item_index": 0,
"provider_object_id": "1844029112345678901",
"url": "<string>",
"state": "published",
"published_at": "2026-08-09T12:00:00.000Z"
}
],
"destination": {
"display_name": "<string>",
"external_id": "<string>",
"profile_image_url": "<string>"
},
"assets": [
{
"id": "ast_01JABCDEF",
"type": "card",
"label": "<string>",
"content_type": "<string>",
"item_index": 1
}
],
"attempts": [
{
"id": "att_01JABCDEF",
"object": "publishing_attempt",
"number": 2,
"trigger": "initial",
"status": "started",
"started_at": "2026-08-09T12:00:00.000Z",
"finished_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"user_action": "retry"
},
"provider": {
"operation": "<string>",
"request_id": "<string>",
"status_code": 349,
"error_code": "<string>",
"subcode": "<string>"
}
}
]
}
],
"has_more": false,
"next_cursor": "eyJ2ZXJzaW9uIjoxfQ"
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}List Posts
List posts in cursor order. Each item includes destination and asset details.
curl --request GET \
--url https://api.openpmm.com/v1/workspaces/{workspace_id}/posts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.openpmm.com/v1/workspaces/{workspace_id}/posts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.openpmm.com/v1/workspaces/{workspace_id}/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.openpmm.com/v1/workspaces/{workspace_id}/posts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.openpmm.com/v1/workspaces/{workspace_id}/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.openpmm.com/v1/workspaces/{workspace_id}/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openpmm.com/v1/workspaces/{workspace_id}/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "send_01JABCDEF",
"object": "post",
"group": "launch-2026-08",
"channel": "x",
"state": "draft",
"editable": true,
"terminal": true,
"action_required": true,
"next_action_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"available_actions": [
"update"
],
"version": 2,
"payload": {
"headline": "<string>",
"body": [
"<string>"
],
"destination_options": {
"bluesky": {
"languages": [
"<string>"
],
"content_labels": [
"porn"
],
"alt_text_by_asset_id": {}
}
}
},
"asset_ids": [
"ast_01JABCDEF"
],
"destination_id": "dest_01JABCDEF",
"scheduled_at": "2026-08-09T12:00:00.000Z",
"time_zone": "Europe/Berlin",
"schedule_mode": "now",
"queue_local_date": "2023-12-25",
"queue_window_id": "<string>",
"attempt_count": 1,
"deferred": {
"reason": "publishing_velocity",
"until": "2026-08-09T12:00:00.000Z"
},
"last_error": {
"code": "provider_rejected",
"message": "The provider rejected the post.",
"retryable": true,
"retry_safety": "safe",
"user_action": "retry"
},
"created_at": "2026-08-09T12:00:00.000Z",
"updated_at": "2026-08-09T12:00:00.000Z",
"published_at": "2026-08-09T12:00:00.000Z",
"cancelled_at": "2026-08-09T12:00:00.000Z",
"missed_at": "2026-08-09T12:00:00.000Z",
"receipts": [
{
"id": "rcpt_01JABCDEF",
"object": "receipt",
"item_index": 0,
"provider_object_id": "1844029112345678901",
"url": "<string>",
"state": "published",
"published_at": "2026-08-09T12:00:00.000Z"
}
],
"destination": {
"display_name": "<string>",
"external_id": "<string>",
"profile_image_url": "<string>"
},
"assets": [
{
"id": "ast_01JABCDEF",
"type": "card",
"label": "<string>",
"content_type": "<string>",
"item_index": 1
}
],
"attempts": [
{
"id": "att_01JABCDEF",
"object": "publishing_attempt",
"number": 2,
"trigger": "initial",
"status": "started",
"started_at": "2026-08-09T12:00:00.000Z",
"finished_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"user_action": "retry"
},
"provider": {
"operation": "<string>",
"request_id": "<string>",
"status_code": 349,
"error_code": "<string>",
"subcode": "<string>"
}
}
]
}
],
"has_more": false,
"next_cursor": "eyJ2ZXJzaW9uIjoxfQ"
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}{
"type": "https://www.openpmm.com/docs/reference/errors#public_invalid_request",
"title": "Invalid request",
"status": 400,
"detail": "The request body does not match the public contract.",
"instance": "urn:openpmm:request:req_01JABCDEF",
"code": "public_invalid_request",
"category": "validation",
"request_id": "req_01JABCDEF",
"retryable": false,
"retry": {
"safety": "not_retryable",
"after": null
},
"user_action": "check_request",
"errors": [
{
"pointer": "/posts/0/destination_id",
"code": "custom",
"detail": "Publishing an entry requires a destination."
}
]
}Authorizations
Send an account API key in the Authorization: Bearer <key> header.
Headers
Optional request ID. OpenPMM returns this value when it is valid. Otherwise, OpenPMM creates a request ID.
128Path Parameters
Unique workspace ID.
"ws_01JABCDEF"
Query Parameters
Maximum number of items to return.
1 <= x <= 100The next_cursor value from the previous page. Send this value without changes.
Post view to return. Use "failed" to list posts that need attention, the same set the "Failed" tab shows.
all, drafts, scheduled, published, attention, failed Return only entries for this publishing channel.
bluesky, facebook, instagram, threads, mastodon, x, linkedin, tiktok, youtube Return only entries with this post group value.
1 - 200Return only Posts for this Destination.
1 - 200Return only Posts in this exact state.
draft, preparing, scheduled, ready, processing, awaiting-provider, published, failed, needs-attention, cancelled, missed Return Posts created after this time.
Return Posts scheduled before this time.
Set to attempts to include sanitized attempt history.
attempts 