ReleasePad
Home
API v2 · REST · JSON

ReleasePad API v2

A small, predictable REST API for reading your changelog posts, widget configuration, and view analytics. Everything speaks JSON, every response has the same envelope, and you can hit the public read endpoints with nothing but a product token.

Jump to endpoints https://pro.releasepad.io/api/v2

Introduction

The ReleasePad API lets you read the same data that powers our in-app widget and public changelog page, so you can build a fully custom changelog UI, feed release notes into another surface, or wire your own analytics. It's a plain JSON REST API — no SDK required.

Base URL

https://pro.releasepad.io/api/v2

Format

JSON request & response bodies over HTTPS

Versioning

Path-based. This page documents v2.

Authentication

The v2 API is authenticated with a single credential: your product's public token. There's no header, key exchange, or OAuth flow to set up — you pass the token in the URL and you're done.

Public token all endpoints

Every product has a public token that is safe to expose in client-side code (it's what the widget uses). Pass it as the {token} path segment. It grants access to that product's published posts, public widget settings, and view tracking — nothing else. Find it in your product's Settings → API page.

Response format

The core API follows the JSend convention. Every response carries a top-level status so you can branch on one field before touching the payload.

"success"

Request worked. The payload is under data.

"fail"

Invalid input. Details are under data.

"error"

Something broke server-side. See message.

A successful response
{
  "status": "success",
  "data": {
    "posts": [ ... ]
  }
}

Errors

Standard HTTP status codes are used alongside the JSend body. The most common ones:

Code Meaning
200Success.
404Unknown product token or post ID.
500Unexpected server error.

Pagination

Only List posts is paginated. It returns 50 posts per page. Pass ?page=N (1-indexed, default 1) to page through results. The response includes the total count and the total number of pages so you know when to stop.

Posts

Read your published release notes.

GET /api/v2/products/{token}/posts

List posts

Public token

Returns a paginated list of a product's published posts, newest first. Each post includes both its raw delta (Editor.js JSON) and a pre-rendered html field, so you can drop it straight into a page or render it yourself.

Parameters

Name In Description
token *pathYour product's public token.
pagequeryPage number, 1-indexed. Default 1. 50 posts per page.
user_metadataqueryAn external user identifier. When supplied, private posts targeted at that user are included too.
previewquerySet to true to include drafts (returns cache-control: no-store). For previewing unpublished work.
cURL
curl "https://pro.releasepad.io/api/v2/products/SFMyNTY.g2gDYQ9uBgBK3Xj2kwFiAAFRgA.p7Zs4mT6yZ1cB9dF3hA5sK8jN0qW2eR7Q3jK5X8vN2/posts?page=1"
Response · 200
{
  "status": "success",
  "data": {
    "posts": [
      {
        "id": 482,
        "name": "Dark mode is finally here",
        "blurb": "Toggle dark mode from any screen.",
        "delta": "{\"blocks\":[{\"type\":\"paragraph\", ... }]}",
        "html": "<p>Toggle dark mode from any screen.</p>",
        "published_at": "2026-06-28T14:03:00Z",
        "views": 1284,
        "category": "New",
        "category_bg_color": "#dcfce7",
        "draft": false,
        "created_at": "2026-06-28T13:55:00Z"
      }
    ],
    "count": 37,
    "pages": 1,
    "category_id": null
  }
}
GET /api/v2/products/{token}/posts/{id}

Get a post

Public token

Returns a single published post by ID. Responds 404 if the post is a draft, archived, or doesn't belong to the product. Unlike the list endpoint, the single-post payload does not include a pre-rendered html field — render the delta yourself.

Parameters

Name In Description
token *pathYour product's public token.
id *pathThe post ID.
cURL
curl "https://pro.releasepad.io/api/v2/products/SFMyNTY.g2gDYQ9uBgBK3Xj2kwFiAAFRgA.p7Zs4mT6yZ1cB9dF3hA5sK8jN0qW2eR7Q3jK5X8vN2/posts/482"
Response · 200
{
  "status": "success",
  "data": {
    "id": 482,
    "title": "Dark mode is finally here",
    "blurb": "Toggle dark mode from any screen.",
    "delta": "{\"blocks\":[{\"type\":\"paragraph\", ... }]}",
    "published_at": "2026-06-28T14:03:00Z",
    "views": 1284,
    "category": "New",
    "category_bg_color": "#dcfce7",
    "draft": false,
    "created_at": "2026-06-28T13:55:00Z",
    "product_id": 20
  }
}

Widget

The configuration that renders the embeddable widget.

GET /api/v2/products/{token}/widget

Get widget config

Public token

Returns the display configuration for a product's widget — brand color, title, dark-mode preference, custom CSS, font, and the count of new posts. Calling this endpoint also registers the widget as "installed" for the product; pass a timestamp query param to opt out of that side effect (useful for previews and cache-busting reloads).

Parameters

Name In Description
token *pathYour product's public token.
timestampqueryAny value. When present, the call is not counted as a widget installation.
cURL
curl "https://pro.releasepad.io/api/v2/products/SFMyNTY.g2gDYQ9uBgBK3Xj2kwFiAAFRgA.p7Zs4mT6yZ1cB9dF3hA5sK8jN0qW2eR7Q3jK5X8vN2/widget"
Response · 200
{
  "status": "success",
  "data": {
    "color": "#0070c7",
    "title": "What's new",
    "dark_mode": false,
    "new_posts": 37,
    "product_uri": "acme-app",
    "custom_css": "",
    "font": "Inter"
  }
}

Analytics

Record views when you render the changelog yourself.

POST /api/v2/products/{token}/changelog/view

Track a changelog view

Public token

Records a page view for a product's public changelog. Call this once when your custom changelog surface loads so view analytics stay accurate. The client IP is captured server-side.

Parameters

Name In Description
token *pathYour product's public token.
cURL
curl -X POST "https://pro.releasepad.io/api/v2/products/SFMyNTY.g2gDYQ9uBgBK3Xj2kwFiAAFRgA.p7Zs4mT6yZ1cB9dF3hA5sK8jN0qW2eR7Q3jK5X8vN2/changelog/view"
Response · 200
{
  "status": "success",
  "data": "ok"
}
POST /api/v2/products/{token}/posts/{id}/view

Track a post view

Public token

Marks a single post as viewed and increments its view counter. Optionally attribute the view to one of your users with user_metadata. Responds 404 if the post is not a published post belonging to the product.

Parameters

Name In Description
token *pathYour product's public token.
id *pathThe post ID being viewed.
user_metadatabodyOptional external user identifier recorded with the view.
cURL
curl -X POST "https://pro.releasepad.io/api/v2/products/SFMyNTY.g2gDYQ9uBgBK3Xj2kwFiAAFRgA.p7Zs4mT6yZ1cB9dF3hA5sK8jN0qW2eR7Q3jK5X8vN2/posts/482/view" \
  -H "Content-Type: application/json" \
  -d '{"user_metadata": "user_9f2c"}'
Response · 200
{
  "status": "success",
  "data": "ok"
}

Built and maintained by the ReleasePad team · Last updated

Building something with the API?

Tell us what you're building — we're happy to help, and we take endpoint requests seriously.

Contact the team
Try me now!