Ghost Admin - Posts API

Read-write posts.

Business capability
Content Marketing Management BC-400.70

Operations 6

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

GET /admin/posts/ List posts including drafts · Browse posts #
Ask an LLM
“How do I list all my posts, including drafts and scheduled ones?”
“Can I sort posts by publish date and only return certain fields?”
Tell an agent
List posts matching {filter}.
Show me {limit} posts ordered by {order}.
POST /admin/posts/ Create a post · Create a post #
Ask an LLM
“How do I create a new blog post through the Admin API?”
“Can I write the post content in HTML rather than Lexical?”
Tell an agent
Create a new post from {posts}.
Create a draft post with {source} content.
GET /admin/posts/{id}/ Get a post by ID · Read a post by ID #
Ask an LLM
“How do I get one post by its ID, even if it's unpublished?”
“Can I get a post's content back in HTML format?”
Tell an agent
Get post {id}.
Fetch post {id} with its content in {formats}.
PUT /admin/posts/{id}/ Update a post · Update a post #
Ask an LLM
“How do I edit a post that's already been created?”
“Why does updating a post need the current updated_at value?”
Tell an agent
Update post {id} with {posts}.
Edit post {id} and send the new body as {source}.
DELETE /admin/posts/{id}/ Delete a post · Delete a post #
Ask an LLM
“How do I permanently remove a blog post?”
“Can I delete a post if I only know its ID?”
Tell an agent destructive · confirm first
Delete post {id}.
Remove post {id} from the blog.
GET /admin/posts/slug/{slug}/ Get a post by its URL slug · Read a post by slug #
Ask an LLM
“How do I find a post when I only know its URL slug?”
“Can I look up a post from the last part of its link?”
Tell an agent
Get the post with slug {slug}.
Look up post {slug} by its slug.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ghost-org:ghost-org-admin-posts-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ghost-org-admin-posts-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Ghost Content and Admin Admin - Posts API
  description: Ghost is an open-source (MIT) publishing platform for professional publications, newsletters, memberships, and paid subscriptions.
  version: '5.0'
  contact:
    name: Ghost
    url: https://ghost.org
  license:
    name: MIT
    url: https://github.com/TryGhost/Ghost/blob/main/LICENSE
servers:
- url: https://{admin_domain}/ghost/api
  description: A Ghost site's API root (self-hosted or Ghost(Pro))
  variables:
    admin_domain:
      default: demo.ghost.io
      description: The domain of the Ghost site (Ghost(Pro) uses *.ghost.io).
security:
- contentApiKey: []
- adminJwt: []
tags:
- name: Admin - Posts
  description: Read-write posts.
paths:
  /admin/posts/:
    get:
      operationId: browseAdminPosts
      tags:
      - Admin - Posts
      summary: Browse posts
      parameters:
      - $ref: '#/components/parameters/AcceptVersion'
      - $ref: '#/components/parameters/Include'
      - $ref: '#/components/parameters/Fields'
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Page'
      - $ref: '#/components/parameters/Order'
      - $ref: '#/components/parameters/Formats'
      responses:
        '200':
          description: A list of posts.
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: addAdminPost
      tags:
      - Admin - Posts
      summary: Create a post
      parameters:
      - $ref: '#/components/parameters/AcceptVersion'
      - $ref: '#/components/parameters/Source'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostsRequest'
      responses:
        '201':
          description: The created post.
  /admin/posts/{id}/:
    get:
      operationId: readAdminPostById
      tags:
      - Admin - Posts
      summary: Read a post by ID
      parameters:
      - $ref: '#/components/parameters/AcceptVersion'
      - $ref: '#/components/parameters/PathId'
      - $ref: '#/components/parameters/Formats'
      responses:
        '200':
          description: The requested post.
    put:
      operationId: editAdminPost
      tags:
      - Admin - Posts
      summary: Update a post
      description: Updates a post. The current updated_at value must be supplied in the payload for collision detection.
      parameters:
      - $ref: '#/components/parameters/AcceptVersion'
      - $ref: '#/components/parameters/PathId'
      - $ref: '#/components/parameters/Source'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostsRequest'
      responses:
        '200':
          description: The updated post.
    delete:
      operationId: deleteAdminPost
      tags:
      - Admin - Posts
      summary: Delete a post
      parameters:
      - $ref: '#/components/parameters/AcceptVersion'
      - $ref: '#/components/parameters/PathId'
      responses:
        '204':
          description: The post was deleted.
  /admin/posts/slug/{slug}/:
    get:
      operationId: readAdminPostBySlug
      tags:
      - Admin - Posts
      summary: Read a post by slug
      parameters:
      - $ref: '#/components/parameters/AcceptVersion'
      - $ref: '#/components/parameters/PathSlug'
      responses:
        '200':
          description: The requested post.
components:
  parameters:
    Filter:
      name: filter
      in: query
      required: false
      description: Ghost NQL filter expression.
      schema:
        type: string
    Fields:
      name: fields
      in: query
      required: false
      description: Comma-separated list of fields to return.
      schema:
        type: string
    Source:
      name: source
      in: query
      required: false
      description: Set to 'html' to supply post/page content as HTML instead of Lexical.
      schema:
        type: string
        enum:
        - html
    AcceptVersion:
      name: Accept-Version
      in: header
      required: false
      description: Minimum compatible API version, for example v5.0.
      schema:
        type: string
        example: v5.0
    Limit:
      name: limit
      in: query
      required: false
      description: Number of records per page (default 15, or 'all').
      schema:
        type: string
        default: '15'
    Order:
      name: order
      in: query
      required: false
      description: Sort order, for example 'published_at desc'.
      schema:
        type: string
    Formats:
      name: formats
      in: query
      required: false
      description: Content formats to return, for example 'html,lexical'.
      schema:
        type: string
    PathId:
      name: id
      in: path
      required: true
      description: The resource ID.
      schema:
        type: string
    Include:
      name: include
      in: query
      required: false
      description: Comma-separated related data to include (for example authors,tags).
      schema:
        type: string
    Page:
      name: page
      in: query
      required: false
      description: Page number of results to return.
      schema:
        type: integer
        default: 1
    PathSlug:
      name: slug
      in: path
      required: true
      description: The resource slug.
      schema:
        type: string
  responses:
    Unauthorized:
      description: Authentication failed or was missing.
  schemas:
    PostsRequest:
      type: object
      properties:
        posts:
          type: array
          items:
            type: object
            properties:
              title:
                type: string
              lexical:
                type: string
              html:
                type: string
              status:
                type: string
                enum:
                - draft
                - published
                - scheduled
              updated_at:
                type: string
                format: date-time
  securitySchemes:
    contentApiKey:
      type: apiKey
      in: query
      name: key
      description: Content API key from a Custom Integration, passed as the `key` query parameter. Safe for browser use; grants read-only access to public data.
    adminJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Admin API access. An Admin API key (id:secret) is used to sign a short-lived JWT sent as `Authorization: Ghost {token}`. A staff access token or an authenticated user session may also be used.'