---
title: "GET /brands/{brandId}/events"
method: GET
path: "/brands/{brandId}/events"
---

# GET /brands/{brandId}/events

`GET /brands/{brandId}/events`

## Request

- Base URL: `https://api.publinio.com/v1`
- URL: `https://api.publinio.com/v1/brands/{brandId}/events`
- Auth: HTTP bearer

Poll post.published and post.failed events. Requires posts:read. Newest first, ordered by createdAt and id. Follow nextCursor to drain the feed; deduplicate by event id. Each page counts against API usage. All plans; no webhook subscription required.

## Path parameters

- `brandId` string, required

## Query parameters

- `limit` integer
- `cursor` string
- `since` string, date-time
- `until` string, date-time
- `eventType` 'post.published' | 'post.failed'

## Response `200`

data contains id, type, createdAt, postId, brandId, status, revision, publishedAt and platformPostId. nextCursor is a timestamp|UUID or null. since/until bounds are inclusive.

- object
  - `data` object[], required
    - `id` string, uuid, required
    - `type` 'post.published' | 'post.failed', required
    - `createdAt` string, date-time, required
    - `postId` string, uuid, required
    - `brandId` string, required
    - `status` 'published' | 'failed', required
    - `revision` integer, required
    - `publishedAt` string, nullable, required
    - `platformPostId` string, nullable, required
  - `nextCursor` string, nullable, required

## Other responses

- `400`: Invalid query or cursor
- `401`: Invalid credential
- `403`: Missing current brand permission or scope
- `429`: API quota exceeded; follow Retry-After

---

[API](https://skmtc.dev/publinio/apis/publinio-developer-api.md) · [All operations](https://skmtc.dev/publinio/apis/publinio-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/publinio/apis/publinio-developer-api/revisions/2a193fb6939b?raw)
