Request body
url— Required canonical URL the contribution describes.content— Required Markdown string with the proposed copy or summary.source— Optional citation or dataset name for audit trails.contributors— Optional array of workspace member IDs who should review the submission; defaults to the maintainers group.expiresAt— Optional ISO timestamp to automatically retire the contribution.
Sample request
Response
Returns202 Accepted with a unique submissionId. The payload includes:
status— Starts aspending_consensus.requiredVotes— Minimum number of approvals needed (defaults to 2 unless overridden).reviewers— List of users who must review and their current vote.statusUrl— Endpoint to poll (or embed in Slack) for live updates.
Consensus workflow
- Each reviewer receives a notification with the rendered Markdown diff.
- Reviewers record their vote in the console or through the contributions review API.
- When the threshold is met, the contribution transitions to
acceptedand becomes searchable. - If any reviewer rejects, the submission moves to
changes_requested; resubmit once updated.
Tips
- Keep
contentconcise; the service automatically chunks longer docs during ingestion. - Include
expiresAtwhen posting time-sensitive announcements so the system retires them automatically.
x402 flow
Moderation bandwidth for contributions is paid through Coinbase’s x402 protocol. When extra quota is needed, Horizon returns a structured402 response:
- Forward the
acceptsobject to your facilitator per Client & server responsibilities and call/verify+/settle. - Replay
POST /contributewith the facilitator’s Base64 payload inside the standardX-PAYMENTheader: - Horizon validates the proof, enqueues the submission for consensus, and returns
202 Accepted. When settlement succeeds you receive anX-PAYMENT-RESPONSEheader with the facilitator receipt.
Body
application/json