TribeTale API Docs

Getting Started

Create TribeTale API credentials and make your first authenticated request.

Choose the API

Use the Admin API when your integration needs to create, update, publish, upload, or manage private resources. Admin API requests are mounted under /ghost/api/admin and require a short-lived JWT signed with an Admin API key.

Use the Content API when your integration only needs to read published content. Content API requests are mounted under /ghost/api/content and authenticate with ?key=<content api key>.

AI assistants should connect through the TribeTale MCP server instead of handling raw API keys directly.

Create an integration

  1. Open TribeTale admin.
  2. Create a Custom Integration.
  3. Copy the Admin API key. It has the format id:secret.
  4. Copy the Content API key if you need read-only public content access.

Sign Admin API requests

Admin API requests use this header:

Authorization: Ghost <JWT>

Create the JWT with:

  • Algorithm: HS256
  • Header kid: the key id before the : in the Admin API key
  • Signing secret: the hex-decoded bytes from the secret after the :
  • aud claim: the API path, for example /ghost/api/admin/
  • Maximum age: 5 minutes

Create a draft post

This request creates a draft post from HTML. Replace the token and host with values from your integration environment.

curl -X POST 'https://example.com/ghost/api/admin/posts/?source=html' \
  -H 'Authorization: Ghost <JWT>' \
  -H 'Content-Type: application/json' \
  -d '{
    "posts": [
      {
        "title": "Hello from the API",
        "html": "<p>This draft was created through TribeTale.</p>",
        "status": "draft"
      }
    ]
  }'

Publish to a newsletter

To publish a post and attach it to a newsletter, update the post with status: published and pass the newsletter slug in the query string.

curl -X PUT 'https://example.com/ghost/api/admin/posts/{id}/?newsletter=<slug>' \
  -H 'Authorization: Ghost <JWT>' \
  -H 'Content-Type: application/json' \
  -d '{
    "posts": [
      {
        "id": "{id}",
        "status": "published",
        "updated_at": "2026-06-03T16:00:00.000Z"
      }
    ]
  }'

The updated_at value must match the current post version. Read the post first, then send the latest timestamp with the publish request.

Read published content

Content API requests use the content key as a query parameter:

curl 'https://example.com/ghost/api/content/posts/?key=<content api key>'

On this page