Cursor-paginated event log
GET /api/v1/events returns every public event newest-first. Filter by type or since. Walk the whole log with one cursor field.
OpenAPI 3.1, HMAC-signed webhooks with retry and replay, tenant-isolated keys, per-key rate-limit overrides in the admin UI, and a real spec at /api/docs. Available on Pro and up.
Available on Pro and up. Tenants on Starter get 403 plan_gated.
GET /api/v1/events returns every public event newest-first. Filter by type or since. Walk the whole log with one cursor field.
Users, posts, mobieusMarket listings, files, moderation reports, moderation actions. JSON, scoped per key, paginated.
Every delivery carries Mobieus-Signature: t=<unix>,v1=<hex>. Verify with HMAC-SHA256 + your secret. Replay attack protection via 5-minute timestamp tolerance.
Failed deliveries retry on 0/1/5/30/120/360/1440 minute schedule. Endpoints auto-disable after configurable failures. Replay any past delivery from /admin/webhooks.
Webhook URLs blocked from loopback, RFC1918, link-local, cloud metadata. Validated at registration AND at every delivery.
Rotate the signing secret and both old and new signatures ride in the header for a configurable grace window. Roll over receivers without downtime.
Keys are stored as SHA-256 hashes in your tenant DB. Constant-time compare. A key minted on tenant A literally cannot read tenant B.
Set a rate limit per key on the admin UI. Override the tenant default. Three-layer precedence (per-key → tenant → platform). X-RateLimit headers on every response.
Programmatically list, approve, edit, or reject mobieusCM drafts via the API. Wire approvals into your existing review tools. Every draft still needs an approval. Drafts and decisions appear in the public event log so you can pipe them into your own pipelines, audit trails, or analytics.
The spec is the contract. Browse interactively at /api/docs. Feed the raw YAML at /api/openapi.yaml into any code generator.
The same patterns your team already knows — Bearer tokens, JSON, standard HTTP status codes.
Fetch events
curl https://YOUR-TENANT.mobieus.io/api/v1/events?limit=10 \ -H "Authorization: Bearer mc_live_..." # => { "data": [ { "id": "evt_01j...", "type": "post.created", "created_at": "2026-05-29T13:42:11Z", "data": { ... } } ], "next_cursor": "NDI=", "request_id": "req_..." }
Register a webhook
curl -X POST https://YOUR-TENANT.mobieus.io/api/v1/webhooks \ -H "Authorization: Bearer mc_live_..." \ -H "Content-Type: application/json" \ -d '{ "url": "https://api.you.com/hook", "subscribed_events": ["post.created", "report.created"] }' # => 201 Created (signing_secret shown once)
Verify a webhook (Node)
const crypto = require("crypto"); function verify(rawBody, header, secret) { const parts = Object.fromEntries( header.split(",").map(p => p.split("=")) ); const signed = parts.t + "." + rawBody; const expected = crypto .createHmac("sha256", secret) .update(signed).digest("hex"); return crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(parts.v1) ); }
The spec is the contract. The guide is the quickstart. The release post is the changelog.
Browse the interactive reference at /api/docs, or pull the raw YAML from /api/openapi.yaml into any code generator.
Mint a key, make your first call, paginate the event log, and set up a test webhook endpoint in under ten minutes.
WebhooksStep-by-step verification in Node, Python, PHP, and Ruby. Covers dual-signing rotation and the replay-attack window.
Pro and up. Tenants on Starter receive 403 plan_gated on every API request. The full plan breakdown is on the pricing page.
Every delivery includes a Mobieus-Signature header with a Unix timestamp and an HMAC-SHA256 hex digest. Compute the same HMAC over t.rawBody using your signing secret and compare with a timing-safe equality check. The webhooks guide has copy-paste examples in Node, Python, PHP, and Ruby.
Yes. Dual-signing lets you rotate the secret while both the old and new signatures ride in the header for a configurable grace window. Roll over your receiver, confirm it is verifying with the new secret, then close the window.
API keys are stored as SHA-256 hashes in the per-tenant database. A constant-time compare authenticates every request. A key minted on tenant A has no path to tenant B’s data — not through shared state, not through the platform layer.
Yes, on Pro and up. The API exposes endpoints to list, read, approve, edit, and reject drafts. Wire them into Slack, Linear, GitHub Actions, or any review tool you already use. Every draft still requires a human approval before it sends.
Yes. Your members, content, custom domain, and Stripe account are yours, exportable any time through the REST API and signed webhooks. We do not hold your data hostage.
No credit card. Bring your own Stripe. Cancel any time. Your data stays yours.