API Docs/Reference/List Drafts
API Reference

List Drafts

List your post drafts, optionally filtered by status. Requires a paid Creator or Lifetime plan.

GEThttps://api.linkedmash.com/v1/posts

GET /v1/posts lists the account's post drafts. With no query string you get everything the Studio holds; pass status to narrow to draft, scheduled or published. The response is a flat array in data with meta.count alongside it.

Use this to reconcile an external content calendar with LinkedMash, or to find the draft ids you need for the schedule and update endpoints when you did not keep them from the create call.

Example request

Authenticate with a bearer token in the Authorization header. Create a key on the API page in your LinkedMash settings and export it as LINKEDMASH_API_KEY before running this.

curl
curl "https://api.linkedmash.com/v1/posts?status=draft" \
  -H "Authorization: Bearer $LINKEDMASH_API_KEY"

Header parameters

AuthorizationstringRequired

Your secret API key as a Bearer token.

Query parameters

Combine these parameters to narrow your results.

statusstringOptional

Filter by status: draft, scheduled, or published.

Response

{
  "status": true,
  "data": [
    {
      "id": "drf_8f3a21c9",
      "content": "5 lessons from shipping every week for a year:",
      "title": "Weekly shipping lessons",
      "format": "text",
      "status": "draft",
      "created_at": "2026-06-22T09:14:02.118Z",
      "updated_at": "2026-06-22T09:14:02.118Z"
    }
  ],
  "meta": {
    "count": 1
  }
}

Response fields

Every response is wrapped in the same envelope: a status flag and a data payload, with meta present where there is pagination or a plan limit to report.

statusboolean

true on success. Every LinkedMash API response carries this envelope flag alongside data, so a client can branch on it without re-reading the HTTP status.

dataarray

The matching drafts. Trashed drafts are excluded.

data[].idstring

Draft identifier. Pass it to GET, PATCH and DELETE /v1/posts/{id} and to the schedule route.

data[].contentstring | object

The post body. Drafts written in the Studio editor can store this as an object with a text field rather than a bare string — handle both.

data[].titlestring

Internal working title. It is never published to LinkedIn; it exists so drafts are findable.

data[].formatstring

Composition format, e.g. text or carousel.

data[].statusstring

One of draft, scheduled or published.

data[].created_atstring

ISO-8601 creation timestamp.

data[].updated_atstring

ISO-8601 timestamp of the last edit.

meta.countinteger

Number of drafts returned. This route is not paginated, so it is also the total for the given status filter.

Reconciling an external content calendar

This is the read that lets a planning tool outside LinkedMash stay honest about what is really queued.

1

Pull the three states separately

Call once each with status=draft, status=scheduled and status=published. Three narrow reads are easier to reason about than one list you then have to bucket yourself.

2

Match on id, not on content

Draft text gets edited in the Studio. Storing the LinkedMash draft id against your own record is the only reliable join.

3

Cross-check the scheduled set against the queue

status=scheduled tells you a draft has a schedule; GET /v1/queue tells you when, and gives you the scheduleId you would need to move or cancel it.

4

Expect trashed drafts to vanish

A soft-deleted draft drops out of this list with no tombstone. An id you hold that stops appearing was deleted, not merely published.

Behaviour and limits

Requires a Creator or Lifetime plan

Everything under /v1/posts, /v1/queue, /v1/schedule, /v1/media and /v1/analytics sits behind one middleware that checks for an unlocked Studio, so a Reader-plan or free key gets 402 with code SUBSCRIPTION_REQUIRED before the handler runs. Bookmark and label reads are on a separate router and are not affected by this gate.

No pagination

This route returns the full matching set with a count, not a cursor. Filter with status rather than expecting to page.

Scheduled posts appear here and in the queue

status=scheduled lists them as drafts with a schedule attached; GET /v1/queue lists the schedule entries themselves, keyed by scheduleId. Cancelling uses the scheduleId, not the draft id.

Trashed drafts are not returned

DELETE /v1/posts/{id} is a soft delete that sets is_trash, and trashed drafts drop out of this list.

Errors

Failures carry the same envelope as a success, with the reason in message and a stable machine-readable code where the status alone is ambiguous — several distinct conditions share a 402.

Status
Meaning
401Unauthorized
The Authorization header is missing or the key is not a valid LinkedMash API key. Create or rotate keys on the API page in your LinkedMash settings.
402Payment Required
Returned with code SUBSCRIPTION_REQUIRED. The content API requires a Creator or Lifetime plan; Reader and free accounts get this on every /v1/posts, /v1/queue, /v1/schedule, /v1/media and /v1/analytics call.
500Server Error
Something failed on our side. The body carries message "Failed to list posts". Retry once; if it persists the request is not the problem.