Skip to main content
POST
Create Content Update
Records an entry in your workspace’s Content Updates ledger. Use this to log publishes, refreshes, or drafts from any system outside of Slate — a custom CMS, a static site generator, a deploy pipeline, or your own internal tooling — so the entry shows up in the Update History and Performance tabs alongside workflow- and manually-logged updates. Entries created through this endpoint appear with the source label API.
This is the only Content Updates endpoint accessible via API tokens. To list, edit, or delete entries, use the Slate dashboard.

Parameters

string
required
Bearer token. Format: Bearer slat_<your-token>. See Authentication.
string
required
Canonical URL of the page being recorded. Use the full URL including the protocol (for example, https://example.com/blog/post). To get accurate matching across runs, drop tracking parameters and use the same canonical form everywhere.
string
The kind of event to record. One of: publish, refresh. Omit for a draft entry.
string
ISO-8601 timestamp for when the update happened (for example, 2026-05-06T14:30:00Z). Defaults to the time the request is received.
boolean
default:"false"
Set to true to record the entry as a draft. Drafts stay in the ledger but do not count toward Published or Refreshed totals on the Performance tab.
string
Optional identifier you can use to correlate this entry with the artifact it was generated from (a workflow output, a CMS item, a build ID). Returned on subsequent reads from the dashboard.
object
Optional JSON object stored alongside the entry. Use it for context fields your reporting may need later — for example, the deploy ID, the author, the model that generated the content. Must be a JSON object; arrays and primitives are rejected.

Response

Returns 201 Created with the recorded event details.
integer
required
Unique identifier for the recorded event.
integer
Identifier for the daily rollup row this event belongs to. null for draft entries, since drafts do not roll up into daily counts.
boolean
required
true if the event matched an existing entry (same URL on the same day, same update type) and was deduplicated rather than written as a new row. false if a new entry was created.

Example

Response

Status codes

Update types and drafts

The combination of update_type and is_draft decides how the entry shows up in reporting:

Deduplication

If you send a second request with the same url, same update_type, and an occurred_at on the same calendar day as an existing entry, the API returns the existing row with deduped: true instead of creating a duplicate. Use this to make your integration safe to retry.

What’s next