Skip to main content

Authenticate every request with a workspace token

Tokens are scoped by workspace and permission. Send the token in the Authorization header and rotate it from the workspace security screen.

curl https://api.harbour.test/v1/posts \
-H "Authorization: Bearer hbr_live_****" \
-H "Accept: application/json"
{
"data": [
{"id": "pst_01HX9", "title": "Designing a calmer changelog", "status": "published"}
]
}

Core endpoints

The mock API is organized around blog post publishing, editorial updates, and post lifecycle events.

GET /v1/posts

List posts

Returns published and draft blog posts for the authenticated workspace.

posts:read 200 OK
Response example
200 OK
{  "data": [    {      "id": "pst_01HX9",      "title": "Designing a calmer changelog",      "slug": "designing-a-calmer-changelog",      "status": "published",      "published_at": "2026-06-14T03:12:00Z"    }  ]}
POST /v1/posts

Create post

Creates a draft blog post and returns the editable resource.

posts:write 201 Created
Request body
application/json
{  "title": "Shipping better release notes",  "slug": "shipping-better-release-notes",  "excerpt": "A short guide to writing product updates readers can scan.",  "body": "Start with the user impact, then include the operational detail.",  "status": "draft",  "author_id": "usr_01H8R",  "tags": ["release-notes", "product"]}
Response example
201 Created
{  "data": {    "id": "pst_01HYA",    "title": "Shipping better release notes",    "slug": "shipping-better-release-notes",    "status": "draft",    "edit_url": "https://harbour.test/posts/shipping-better-release-notes/edit"  }}
PATCH /v1/posts/{post}

Update post

Updates blog post metadata, editorial status, or scheduled publish time.

posts:write 200 OK
Request body
application/json
{  "title": "Shipping better release notes",  "status": "scheduled",  "published_at": "2026-06-20T09:00:00Z"}
Response example
200 OK
{  "data": {    "id": "pst_01HYA",    "title": "Shipping better release notes",    "status": "scheduled",    "published_at": "2026-06-20T09:00:00Z"  }}
DELETE /v1/posts/{post}

Delete post

Deletes a draft blog post or archives a published post for audit history.

posts:write 204 No Content
Response example
204 No Content
HTTP/1.1 204 No Content No response body is returned for a successful post deletion.

Subscribe to workspace events

Webhooks are delivered with an HMAC signature in the Harbour-Signature header and retried for 24 hours.

Event Description
post.published A blog post moved from draft or scheduled into the published feed.
post.updated A title, body, tag, or editorial status changed.
post.deleted A draft post was deleted or a published post was archived.