Ghost Admin API

The Ghost Admin API provides full read and write access to all content and configuration within a Ghost publication. It enables developers to create, update, and delete posts, pages, tags, members, tiers, newsletters, and offers programmatically. Authentication is handled via JSON Web Tokens generated from an Admin API key, integration tokens, or staff access tokens.

OpenAPI Specification

ghost-admin-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Ghost Admin API
  description: >-
    The Ghost Admin API provides full read and write access to all content and
    configuration within a Ghost publication. It enables developers to create,
    update, and delete posts, pages, tags, members, tiers, newsletters, and
    offers programmatically. Authentication is handled via JSON Web Tokens
    generated from an Admin API key, integration tokens, or staff access tokens.
    The Admin API supports everything the Ghost Admin interface can do and more,
    making it suitable for building custom publishing workflows, content
    automation, member management systems, and advanced integrations.
  version: '5.0'
  contact:
    name: Ghost Foundation
    url: https://ghost.org/docs/admin-api/
  termsOfService: https://ghost.org/terms/
externalDocs:
  description: Ghost Admin API Documentation
  url: https://ghost.org/docs/admin-api/
servers:
  - url: https://{site}.ghost.io/ghost/api/admin
    description: Ghost Pro Hosted Site
    variables:
      site:
        default: your-site
        description: Your Ghost site subdomain
  - url: '{protocol}://{domain}/ghost/api/admin'
    description: Self-Hosted Ghost Instance
    variables:
      protocol:
        default: https
        enum:
          - https
          - http
      domain:
        default: localhost:2368
        description: Your Ghost instance domain and port
tags:
  - name: Images
    description: >-
      Upload images to the Ghost publication for use in posts, pages, and
      settings.
  - name: Members
    description: >-
      Manage publication members including creating, reading, updating, and
      deleting member records. Members are people who have signed up for the
      publication.
  - name: Newsletters
    description: >-
      Manage email newsletters that members can subscribe to. Each newsletter
      has its own design, sender details, and subscription list.
  - name: Offers
    description: >-
      Manage promotional offers for paid membership tiers, including discounts
      and trial periods.
  - name: Pages
    description: >-
      Create, read, update, and delete pages. Pages share the same structure as
      posts but are used for static content.
  - name: Posts
    description: >-
      Create, read, update, and delete posts. Posts are the primary content
      resource in Ghost and support rich content via the Lexical editor format.
  - name: Site
    description: >-
      Read basic information about the Ghost site.
  - name: Themes
    description: >-
      Upload, activate, and manage themes that control the front-end appearance
      of the Ghost publication.
  - name: Tiers
    description: >-
      Manage membership tiers including creating, reading, and updating tier
      configurations with pricing and benefits.
  - name: Users
    description: >-
      Read staff user accounts for the Ghost publication.
  - name: Webhooks
    description: >-
      Create, update, and delete webhooks that send HTTP POST notifications when
      events occur within the publication.
security:
  - adminApiToken: []
paths:
  /posts/:
    get:
      operationId: adminBrowsePosts
      summary: Browse posts
      description: >-
        Retrieve a paginated list of posts with all statuses including draft,
        scheduled, and published. Supports filtering, ordering, and including
        related resources.
      tags:
        - Posts
      parameters:
        - $ref: '#/components/parameters/includePostRelations'
        - $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
          content:
            application/json:
              schema:
                type: object
                properties:
                  posts:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreatePost
      summary: Create a post
      description: >-
        Create a new post. The title field is required, all other fields are
        optional and will have defaults applied. Content can be provided in
        Lexical or HTML format. Tags can be specified by name or as full tag
        objects. If a tag does not exist, it will be created automatically.
      tags:
        - Posts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - posts
              properties:
                posts:
                  type: array
                  items:
                    $ref: '#/components/schemas/PostInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '201':
          description: Post created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  posts:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /posts/{id}/:
    get:
      operationId: adminReadPost
      summary: Read a post by ID
      description: >-
        Retrieve a single post by its unique identifier, including draft and
        scheduled posts.
      tags:
        - Posts
      parameters:
        - $ref: '#/components/parameters/resourceId'
        - $ref: '#/components/parameters/includePostRelations'
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/formats'
      responses:
        '200':
          description: A single post
          content:
            application/json:
              schema:
                type: object
                properties:
                  posts:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
                    minItems: 1
                    maxItems: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: adminUpdatePost
      summary: Update a post
      description: >-
        Update an existing post. The updated_at field must be sent with the
        current value to prevent update collisions. Only the fields being changed
        need to be included in the request body, along with updated_at.
      tags:
        - Posts
      parameters:
        - $ref: '#/components/parameters/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - posts
              properties:
                posts:
                  type: array
                  items:
                    $ref: '#/components/schemas/PostInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '200':
          description: Post updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  posts:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Update collision due to stale updated_at value
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: adminDeletePost
      summary: Delete a post
      description: >-
        Permanently delete a post by its unique identifier.
      tags:
        - Posts
      parameters:
        - $ref: '#/components/parameters/resourceId'
      responses:
        '204':
          description: Post deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /pages/:
    get:
      operationId: adminBrowsePages
      summary: Browse pages
      description: >-
        Retrieve a paginated list of pages including draft and published pages.
      tags:
        - Pages
      parameters:
        - $ref: '#/components/parameters/includePostRelations'
        - $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 pages
          content:
            application/json:
              schema:
                type: object
                properties:
                  pages:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreatePage
      summary: Create a page
      description: >-
        Create a new page. Pages share the same structure as posts and require
        a title field.
      tags:
        - Pages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - pages
              properties:
                pages:
                  type: array
                  items:
                    $ref: '#/components/schemas/PostInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '201':
          description: Page created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  pages:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /pages/{id}/:
    get:
      operationId: adminReadPage
      summary: Read a page by ID
      description: >-
        Retrieve a single page by its unique identifier.
      tags:
        - Pages
      parameters:
        - $ref: '#/components/parameters/resourceId'
        - $ref: '#/components/parameters/includePostRelations'
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/formats'
      responses:
        '200':
          description: A single page
          content:
            application/json:
              schema:
                type: object
                properties:
                  pages:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
                    minItems: 1
                    maxItems: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: adminUpdatePage
      summary: Update a page
      description: >-
        Update an existing page. The updated_at field must be included to
        prevent update collisions.
      tags:
        - Pages
      parameters:
        - $ref: '#/components/parameters/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - pages
              properties:
                pages:
                  type: array
                  items:
                    $ref: '#/components/schemas/PostInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '200':
          description: Page updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  pages:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Update collision due to stale updated_at value
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: adminDeletePage
      summary: Delete a page
      description: >-
        Permanently delete a page by its unique identifier.
      tags:
        - Pages
      parameters:
        - $ref: '#/components/parameters/resourceId'
      responses:
        '204':
          description: Page deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tags/:
    get:
      operationId: adminBrowseTags
      summary: Browse tags
      description: >-
        Retrieve a paginated list of all tags, including internal tags.
      tags: []
      parameters:
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          description: A list of tags
          content:
            application/json:
              schema:
                type: object
                properties:
                  tags:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tag'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreateTag
      summary: Create a tag
      description: >-
        Create a new tag. The name field is required. Tags with names starting
        with a hash character are treated as internal tags.
      tags: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - tags
              properties:
                tags:
                  type: array
                  items:
                    $ref: '#/components/schemas/TagInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '201':
          description: Tag created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  tags:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tags/{id}/:
    get:
      operationId: adminReadTag
      summary: Read a tag by ID
      description: >-
        Retrieve a single tag by its unique identifier.
      tags: []
      parameters:
        - $ref: '#/components/parameters/resourceId'
        - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A single tag
          content:
            application/json:
              schema:
                type: object
                properties:
                  tags:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tag'
                    minItems: 1
                    maxItems: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: adminUpdateTag
      summary: Update a tag
      description: >-
        Update an existing tag by its unique identifier.
      tags: []
      parameters:
        - $ref: '#/components/parameters/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - tags
              properties:
                tags:
                  type: array
                  items:
                    $ref: '#/components/schemas/TagInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '200':
          description: Tag updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  tags:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tag'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: adminDeleteTag
      summary: Delete a tag
      description: >-
        Permanently delete a tag by its unique identifier.
      tags: []
      parameters:
        - $ref: '#/components/parameters/resourceId'
      responses:
        '204':
          description: Tag deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /members/:
    get:
      operationId: adminBrowseMembers
      summary: Browse members
      description: >-
        Retrieve a paginated list of publication members. Supports filtering by
        status, label, newsletter subscription, and other member properties.
      tags:
        - Members
      parameters:
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          description: A list of members
          content:
            application/json:
              schema:
                type: object
                properties:
                  members:
                    type: array
                    items:
                      $ref: '#/components/schemas/Member'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreateMember
      summary: Create a member
      description: >-
        Create a new member. The email field is required. Optionally include
        name, labels, and newsletter subscriptions.
      tags:
        - Members
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - members
              properties:
                members:
                  type: array
                  items:
                    $ref: '#/components/schemas/MemberInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '201':
          description: Member created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  members:
                    type: array
                    items:
                      $ref: '#/components/schemas/Member'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /members/{id}/:
    get:
      operationId: adminReadMember
      summary: Read a member by ID
      description: >-
        Retrieve a single member by their unique identifier.
      tags:
        - Members
      parameters:
        - $ref: '#/components/parameters/resourceId'
        - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A single member
          content:
            application/json:
              schema:
                type: object
                properties:
                  members:
                    type: array
                    items:
                      $ref: '#/components/schemas/Member'
                    minItems: 1
                    maxItems: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: adminUpdateMember
      summary: Update a member
      description: >-
        Update an existing member by their unique identifier. Can be used to
        change name, email, labels, note, and newsletter subscriptions.
      tags:
        - Members
      parameters:
        - $ref: '#/components/parameters/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - members
              properties:
                members:
                  type: array
                  items:
                    $ref: '#/components/schemas/MemberInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '200':
          description: Member updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  members:
                    type: array
                    items:
                      $ref: '#/components/schemas/Member'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: adminDeleteMember
      summary: Delete a member
      description: >-
        Permanently delete a member by their unique identifier.
      tags:
        - Members
      parameters:
        - $ref: '#/components/parameters/resourceId'
      responses:
        '204':
          description: Member deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tiers/:
    get:
      operationId: adminBrowseTiers
      summary: Browse tiers
      description: >-
        Retrieve a paginated list of membership tiers.
      tags:
        - Tiers
      parameters:
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/page'
      responses:
        '200':
          description: A list of tiers
          content:
            application/json:
              schema:
                type: object
                properties:
                  tiers:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tier'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreateTier
      summary: Create a tier
      description: >-
        Create a new membership tier with pricing, benefits, and visibility
        configuration.
      tags:
        - Tiers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - tiers
              properties:
                tiers:
                  type: array
                  items:
                    $ref: '#/components/schemas/TierInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '201':
          description: Tier created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  tiers:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tier'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /tiers/{id}/:
    get:
      operationId: adminReadTier
      summary: Read a tier by ID
      description: >-
        Retrieve a single membership tier by its unique identifier.
      tags:
        - Tiers
      parameters:
        - $ref: '#/components/parameters/resourceId'
        - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A single tier
          content:
            application/json:
              schema:
                type: object
                properties:
                  tiers:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tier'
                    minItems: 1
                    maxItems: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: adminUpdateTier
      summary: Update a tier
      description: >-
        Update an existing membership tier by its unique identifier.
      tags:
        - Tiers
      parameters:
        - $ref: '#/components/parameters/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - tiers
              properties:
                tiers:
                  type: array
                  items:
                    $ref: '#/components/schemas/TierInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '200':
          description: Tier updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  tiers:
                    type: array
                    items:
                      $ref: '#/components/schemas/Tier'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
  /newsletters/:
    get:
      operationId: adminBrowseNewsletters
      summary: Browse newsletters
      description: >-
        Retrieve a list of all newsletters configured for the publication.
      tags:
        - Newsletters
      parameters:
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          description: A list of newsletters
          content:
            application/json:
              schema:
                type: object
                properties:
                  newsletters:
                    type: array
                    items:
                      $ref: '#/components/schemas/Newsletter'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreateNewsletter
      summary: Create a newsletter
      description: >-
        Create a new newsletter for the publication with customizable design,
        sender details, and subscription settings.
      tags:
        - Newsletters
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - newsletters
              properties:
                newsletters:
                  type: array
                  items:
                    $ref: '#/components/schemas/NewsletterInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '201':
          description: Newsletter created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  newsletters:
                    type: array
                    items:
                      $ref: '#/components/schemas/Newsletter'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /newsletters/{id}/:
    get:
      operationId: adminReadNewsletter
      summary: Read a newsletter by ID
      description: >-
        Retrieve a single newsletter by its unique identifier.
      tags:
        - Newsletters
      parameters:
        - $ref: '#/components/parameters/resourceId'
        - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A single newsletter
          content:
            application/json:
              schema:
                type: object
                properties:
                  newsletters:
                    type: array
                    items:
                      $ref: '#/components/schemas/Newsletter'
                    minItems: 1
                    maxItems: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: adminUpdateNewsletter
      summary: Update a newsletter
      description: >-
        Update an existing newsletter by its unique identifier.
      tags:
        - Newsletters
      parameters:
        - $ref: '#/components/parameters/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - newsletters
              properties:
                newsletters:
                  type: array
                  items:
                    $ref: '#/components/schemas/NewsletterInput'
                  minItems: 1
                  maxItems: 1
      responses:
        '200':
          description: Newsletter updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  newsletters:
                    type: array
                    items:
                      $ref: '#/components/schemas/Newsletter'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
  /offers/:
    get:
      operationId: adminBrowseOffers
      summary: Browse offers
      description: >-
        Retrieve a list of all promotional offers configured for the
        publication.
      tags:
        - Offers
      parameters:
        - $ref: '#/components/parameters/fields'
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/page'
      responses:
        '200':
          description: A list of offers
          content:
            application/json:
              schema:
                type: object
                properties:
                  offers:
                    type: array
                    items:
                      $ref: '#/components/schemas/Offer'
                  meta:
                    $ref: '#/components/schemas/PaginationMeta'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: adminCreateOffer
  

# --- truncated at 32 KB (88 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/ghost/refs/heads/main/openapi/ghost-admin-api-openapi.yml