Leaves a comment
Returns the comment and its status: approved (live now) or pending (waiting for a moderator) — show the reader which. Spam is accepted silently and reported as pending.
Pass parentId to reply. Render website as a hidden honeypot field and leave it empty. Fails with 403 when comments are closed on the post, 409 on a duplicate.
x-api-keyx-api-key<token>A tenant API key — secret (htk_…) or, where allowed, publishable (hpk_…).
post*stringThe post's slug (recommended) or id.
application/json- body
body*stringauthorName*stringauthorEmail?stringNever shown publicly.
authorUrl?stringparentId?stringThe comment this replies to.
visitorId?stringYour own stable, anonymous id for the reader (e.g. a uuid kept in localStorage). Used to remember their reactions. Falls back to ip + user agent.
website?stringHoneypot — render as a hidden input and leave empty. Anything here marks the comment as spam.
Received. status is approved (live) or pending (awaiting a moderator).
response?unknownapplication/jsoncurl -X POST 'https://api.horbit.ng/v1/public/blog/posts/five-lessons-open-data-hackathon/comments' \ -H 'Content-Type: application/json' \ -d '{ "body": "Great write-up — the bit about licences was new to me.", "authorName": "Ada Obi"}'{ "status": true, "message": "Comment received — it will appear once approved", "data": { "id": "c0ffee00c0ffee00c0ffee00c0ffee00", "parentId": null, "authorName": "Chidi Okafor", "body": "Licences first — exactly what our lab needed to hear.", "status": "pending", "createdAt": "2026-10-25T11:02:00.000Z" }}Approved comments, threaded GET
Top-level comments are paged (`page`/`limit`, max 100); each carries its whole reply tree in `replies`. Pinned comments come first. `bodyHtml` is the comment escaped and split into `<p class="hb-comment__paragraph">`. Emails are never returned; `avatarUrl` is a Gravatar.
Reaction counts, and which ones this reader left GET
Pass the same `visitorId` you react with, so `mine` lights the right buttons.