Content
Content publishing for the workspace's own website: the feeds it follows and the briefs it sends become posts written through the router as its own metered requests; posts are reviewed, published and delivered to its destinations (a signed webhook, WordPress, Ghost) with a retried delivery log, or pulled from `GET /content/posts` and the RSS at `GET /content/feed.xml`.
The `content_*` MCP tools do the same for agents.
get /api /v1 /content
Overview
The workspace's content service at a glance: editorial profile, post and delivery counts, feeds, destinations, the writer that is active, the limits and the pull URL of the workspace RSS.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content" \
-H "Authorization: Bearer $OSR_API_KEY"get /api /v1 /content /deliveries
Deliveries
The delivery log: every attempt to put a post on a destination, with the site's answer.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| post_id | query | string | null | ||
| limit | query | integer | 50 | |
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/deliveries?limit=50" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /deliveries /{delivery_id} /retry
Retry Delivery
Try a failed or waiting delivery again now.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| delivery_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/deliveries/<delivery_id>/retry" \
-H "Authorization: Bearer $OSR_API_KEY"get /api /v1 /content /destinations
Destinations
Where published posts go: signed webhooks, WordPress sites, Ghost publications and the social, chat and
blog networks - never the secrets. networks describes every kind with the credential fields it needs.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/destinations" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /destinations
Add Destination
Add a destination (admins). webhook: your URL, optional secret for X-OSR-Signature;
wordpress: the site URL, a user name and an application password; ghost: the site URL and an
Admin API key; a social kind (linkedin, x, facebook, discord ...): its credentials
(the fields GET /destinations lists under networks). auto_publish sends every post that
becomes published; post_status: draft leaves the post as a draft on a CMS or blog platform;
schedule (mode immediate or window, days, start, end, timezone, gap_minutes,
max_per_day) decides when queued deliveries go out.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Request bodyDestinationIn
| Field | Type | Default | Description |
|---|---|---|---|
| auto_publish | boolean | true | |
| credentials | object<string> | null | ||
| kind(required) | string | ||
| name(required) | string | ||
| post_status | string | "publish" | |
| schedule | object | null | ||
| secret | string | null | ||
| template | string | null | ||
| url | string | "" | |
| username | string | null |
Responses
| 201 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/destinations" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "kind": "string", "name": "default" }'{
"kind": "string",
"name": "default"
}patch /api /v1 /content /destinations /{destination_id}
Update Destination
Change a destination (admins); secret: "" removes the stored credential, credentials are merged
into the stored fields (an empty value removes one), schedule and template replace theirs.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| destination_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Request bodyDestinationPatch
| Field | Type | Default | Description |
|---|---|---|---|
| auto_publish | boolean | null | ||
| credentials | object<string> | null | ||
| enabled | boolean | null | ||
| name | string | null | ||
| post_status | string | null | ||
| schedule | object | null | ||
| secret | string | null | ||
| template | string | null | ||
| url | string | null | ||
| username | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X PATCH "$OSR_URL/api/v1/content/destinations/<destination_id>" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "auto_publish": false, "credentials": {}, "enabled": false, "name": "default", "post_status": "string", "schedule": {}, "secret": "string", "template": "string" }'{
"auto_publish": false,
"credentials": {},
"enabled": false,
"name": "default",
"post_status": "string",
"schedule": {},
"secret": "string",
"template": "string"
}delete /api /v1 /content /destinations /{destination_id}
Delete Destination
Remove a destination and its delivery log (admins).
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| destination_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 204 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X DELETE "$OSR_URL/api/v1/content/destinations/<destination_id>" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /destinations /{destination_id} /test
Test Destination
Send a clearly marked test post to the destination now and return the site's answer.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| destination_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/destinations/<destination_id>/test" \
-H "Authorization: Bearer $OSR_API_KEY"get /api /v1 /content /feed.xml
Feed Xml
RSS 2.0 of the workspace's published posts, for its own site or a feed reader: with the API key in the
header, or with the workspace's feed token as ?token= (the pull URL on the Content page) - a feed
reader cannot send headers.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| token | query | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/feed.xml" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /feed /token
Rotate Feed Token
Replace the feed token (admins): the pull URL a feed reader or a site build was given stops working at once and the answer carries the new one.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/feed/token" \
-H "Authorization: Bearer $OSR_API_KEY"get /api /v1 /content /feeds
Feeds
The RSS/Atom feeds the workspace follows, with their last fetch.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/feeds" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /feeds
Add Feed
Follow a feed - or a page that advertises one, the feed is found - after one look at it: the feed's title
names it unless name is given, its site is remembered, a reachable URL that is no feed is refused (400),
an unreachable one is followed with the error on its row. It is polled on the scheduler's next pass (entries
from the last 7 days) and every new entry becomes a post written for the workspace's publication. The
answer is the feed with what the look found under probe.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Request bodyWorkspaceFeedIn
| Field | Type | Default | Description |
|---|---|---|---|
| category | string | null | ||
| name | string | null | ||
| url(required) | string |
Responses
| 201 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/feeds" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "string" }'{
"url": "string"
}post /api /v1 /content /feeds /preview
Preview Feed
Look at a URL before following it: the feed's title, site and newest entries - or, for a page, the feed
it advertises in its <head> (or at /feed, /rss.xml ...); nothing is stored.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Request bodyFeedPreviewIn
| Field | Type | Default | Description |
|---|---|---|---|
| url(required) | string |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/feeds/preview" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "string" }'{
"url": "string"
}patch /api /v1 /content /feeds /{feed_id}
Update Feed
Rename, recategorise or pause a feed.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| feed_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Request bodyWorkspaceFeedPatch
| Field | Type | Default | Description |
|---|---|---|---|
| category | string | null | ||
| enabled | boolean | null | ||
| name | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X PATCH "$OSR_URL/api/v1/content/feeds/<feed_id>" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "category": "string", "enabled": false, "name": "default" }'{
"category": "string",
"enabled": false,
"name": "default"
}delete /api /v1 /content /feeds /{feed_id}
Delete Feed
Stop following a feed (its posts stay).
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| feed_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 204 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X DELETE "$OSR_URL/api/v1/content/feeds/<feed_id>" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /feeds /{feed_id} /fetch
Fetch Feed
Poll one feed now and write posts for its new entries (a metered request per post).
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| feed_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/feeds/<feed_id>/fetch" \
-H "Authorization: Bearer $OSR_API_KEY"get /api /v1 /content /posts
Posts
The workspace's posts, newest first (status filters; q searches title, summary and tags).
Bodies are left out; GET /posts/{id} has them.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| status | query | string | null | ||
| q | query | string | null | ||
| limit | query | integer | 50 | |
| offset | query | integer | 0 | |
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/posts?limit=50&offset=0" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /posts
Create Post
Store a post written elsewhere (Markdown body). status: published delivers it to the destinations
set to publish automatically.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Request bodyPostIn
| Field | Type | Default | Description |
|---|---|---|---|
| body(required) | string | ||
| category | string | null | ||
| image_url | string | null | ||
| source_url | string | null | ||
| status | string | "draft" | |
| summary | string | "" | |
| tags | string[] | [] | |
| title(required) | string |
Responses
| 201 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/posts" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "string", "title": "string" }'{
"body": "string",
"title": "string"
}post /api /v1 /content /posts /write
Write Post
Write a post from a brief: the topic, the editor's notes and optionally a page it is about. The writer
routes through the platform as the workspace's own metered request; routing on the post says which
model wrote it. Without an executable model (or when the request is refused) the post is the brief.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Request bodyWriteIn
| Field | Type | Default | Description |
|---|---|---|---|
| notes | string | "" | |
| status | string | "draft" | |
| topic(required) | string | ||
| url | string | null |
Responses
| 201 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/posts/write" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "topic": "string" }'{
"topic": "string"
}get /api /v1 /content /posts /{post_id}
Post
One post with its Markdown body, an HTML rendering and its deliveries.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| post_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/posts/<post_id>" \
-H "Authorization: Bearer $OSR_API_KEY"patch /api /v1 /content /posts /{post_id}
Update Post
Edit a post; moving it to published delivers it to the automatic destinations.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| post_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Request bodyWorkspacePostPatch
| Field | Type | Default | Description |
|---|---|---|---|
| body | string | null | ||
| image_url | string | null | ||
| status | string | null | ||
| summary | string | null | ||
| tags | string[] | null | ||
| title | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X PATCH "$OSR_URL/api/v1/content/posts/<post_id>" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "string", "image_url": "string", "status": "string", "summary": "string", "tags": [], "title": "string" }'{
"body": "string",
"image_url": "string",
"status": "string",
"summary": "string",
"tags": [],
"title": "string"
}delete /api /v1 /content /posts /{post_id}
Delete Post
Delete a post and its delivery log (what a site already received stays there).
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| post_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 204 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X DELETE "$OSR_URL/api/v1/content/posts/<post_id>" \
-H "Authorization: Bearer $OSR_API_KEY"post /api /v1 /content /posts /{post_id} /publish
Publish Post
Publish a post and deliver it now to every enabled destination (or destination_ids), waiting for
the sites' answers; the deliveries come back with their status.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| post_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/posts/<post_id>/publish" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "destination_ids": [] }'{
"destination_ids": []
}post /api /v1 /content /posts /{post_id} /regenerate
Regenerate Post
Rewrite a post from its feed entry with the current writer (status and slug are kept).
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| post_id(required) | path | string | ||
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/posts/<post_id>/regenerate" \
-H "Authorization: Bearer $OSR_API_KEY"get /api /v1 /content /profile
Profile
The editorial profile the writer is told: publication, audience, tone, language, site, auto-publish.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s "$OSR_URL/api/v1/content/profile" \
-H "Authorization: Bearer $OSR_API_KEY"put /api /v1 /content /profile
Set Profile
Update the editorial profile (members). auto_publish publishes posts written from feeds at once -
and delivers them to the destinations set to publish automatically - instead of keeping them as drafts.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Request bodyProfileIn
| Field | Type | Default | Description |
|---|---|---|---|
| article_words | integer | null | ||
| audience | string | null | ||
| auto_publish | boolean | null | ||
| language | string | null | ||
| publication | string | null | ||
| site_url | string | null | ||
| tone | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X PUT "$OSR_URL/api/v1/content/profile" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "article_words": 1, "audience": "string", "auto_publish": false, "language": "string", "publication": "string", "site_url": "string", "tone": "string" }'{
"article_words": 1,
"audience": "string",
"auto_publish": false,
"language": "string",
"publication": "string",
"site_url": "string",
"tone": "string"
}post /api /v1 /content /refresh
Refresh
Poll every enabled feed (or feed_ids) now and write the posts.
Requires an API key
Parameters
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| x-goog-api-key | header | string | null |
Responses
| 200 | Successful Response |
| 422 | Validation ErrorHTTPValidationError |
| 401 | Missing, invalid or revoked API key |
curl -s -X POST "$OSR_URL/api/v1/content/refresh" \
-H "Authorization: Bearer $OSR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "feed_ids": [] }'{
"feed_ids": []
}Something wrong or out of date on this page? Tell us - the page is named for you, so a one-line note is enough.
Releases
Release notes parsed from the changelog: every released version with its sections and highlights, the version this deployment runs, and what a signed-in person has not read yet (What's new).
Workspaces
Organization workspaces: members, roles, invitations, teams (rosters, leads, tenant bindings), organization SSO (browser sessions only) and the SCIM provisioning token.