Skip to main content
POST
/
slate-core
/
api
/
public
/
v1
/
content-updates
Create Content Update
curl --request POST \
  --url https://api.slatehq.ai/slate-core/api/public/v1/content-updates \
  --header 'Authorization: <authorization>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "url": "<string>",
  "update_type": "<string>",
  "occurred_at": "<string>",
  "is_draft": true,
  "content_artifact_uid": "<string>",
  "metadata": {}
}
'
{
  "event_id": 123,
  "daily_update_id": 123,
  "deduped": true
}

Documentation Index

Fetch the complete documentation index at: https://slatehq.com/docs/llms.txt

Use this file to discover all available pages before exploring further.

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

Authorization
string
required
Bearer token. Format: Bearer slat_<your-token>. See Authentication.
url
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.
update_type
string
The kind of event to record. One of: publish, refresh. Omit for a draft entry.
occurred_at
string
ISO-8601 timestamp for when the update happened (for example, 2026-05-06T14:30:00Z). Defaults to the time the request is received.
is_draft
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.
content_artifact_uid
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.
metadata
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.
event_id
integer
required
Unique identifier for the recorded event.
daily_update_id
integer
Identifier for the daily rollup row this event belongs to. null for draft entries, since drafts do not roll up into daily counts.
deduped
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

curl -s -X POST "https://api.slatehq.ai/slate-core/api/public/v1/content-updates" \
  -H "Authorization: Bearer slat_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
    "url": "https://example.com/blog/seo-guide-2026",
    "update_type": "refresh",
    "occurred_at": "2026-05-06T14:30:00Z",
    "is_draft": false,
    "metadata": {
      "deploy_id": "dep_9f2a",
      "author": "marketing-bot"
    }
  }'

Response

{
  "event_id": 184237,
  "daily_update_id": 9412,
  "deduped": false
}

Status codes

StatusDescription
201Event recorded. Check deduped to see whether a new row was created.
400Invalid request. url is missing, update_type is not publish or refresh, occurred_at is not ISO-8601, or metadata is not a JSON object.
401Missing or invalid Bearer token. See Authentication.
403API token context is invalid or scoped to a workspace the request cannot access.
500Internal server error.

Update types and drafts

The combination of update_type and is_draft decides how the entry shows up in reporting:
update_typeis_draftResult
publishfalseCounts toward Published on the Performance tab
refreshfalseCounts toward Refreshed on the Performance tab
publish or refreshtrueStored as a draft. Counts toward Drafts in flight, not Published or Refreshed
omittedtrueStored as a draft

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