Developers

The suggestion-box API, embedded once.

Pipe user ideas out of your product and into Wishbullet's public, vote-weighted, disputeable record — then pull structured events back into your own roadmap, ticketing, or support tools.

Quickstart

Every request is a Bearer-authenticated HTTPS call to /api/v1. Keys are created per entity in your dashboard settings.

List your top ideas (cURL)
curl -H "Authorization: Bearer wbl_live_..." \
  https://wishbullet.com/api/v1/entities/acme/ideas?limit=5
Submit an idea (JavaScript)
await fetch(
  "https://wishbullet.com/api/v1/entities/acme/ideas",
  {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.WBL_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": crypto.randomUUID(),
    },
    body: JSON.stringify({
      title: "Add dark mode to the mobile app",
      body: "Reading in bed is painful without it…",
      tags: ["mobile", "accessibility"],
      external_user: { id: "u_1234", email: "jane@example.com" },
    }),
  }
);

Authentication

  • API access is available on the Strategic plan. Each entity can create multiple keys (dev, staging, prod).
  • Keys are prefixed with wbl_live_ and shown exactly once on creation. Store them in your secret manager.
  • Send as Authorization: Bearer <key>.
  • Each key is rate-limited at 120 requests/minute (60/minute for POST). When over-limit you get 429 with a Retry-After header.

Endpoints

GET
/api/v1/entities/{slug}/ideas

List ideas for an entity. Supports limit, offset, status, since, and tag filters.

POST
/api/v1/entities/{slug}/ideas

Submit an idea on behalf of one of your end users. Supports Idempotency-Key.

GET
/api/v1/entities/{slug}/ideas/{ideaId}

Fetch a single idea with full body, creator, and verification state.

GET
/api/v1/entities/{slug}/ideas/{ideaId}/events

The status + lifecycle timeline for a single idea.

GET
/api/v1/entities/{slug}/ideas/{ideaId}/comments

Top-level comments and replies on an idea.

GET
/api/v1/entities/{slug}/stats

Aggregate stats — total ideas, votes, responsiveness, top tags.

Full parameters, response schemas, and a try-it-out playground live in the API reference.

Webhooks

Configure a single HTTPS endpoint per entity and subscribe to any subset of the event types below. Deliveries are signed with HMAC-SHA256 using a per-entity secret; verify them before trusting the payload.

Delivery is at least once: a non-2xx response or a timeout is retried after 5 minutes, 15 minutes, 1 hour, 6 hours and 24 hours (6 attempts in total). Every request carries an X-Wishlist-Delivery header that stays the same across retries, so you can safely ignore one you have already processed. Redirects are not followed.

new_idea

An idea was submitted for the entity.

status_change

An idea's status was finalized or reverted.

status_claim

A provisional status claim was opened (e.g. ACK or PLANNED).

claim_challenged

Someone challenged an ongoing status claim.

comment_added

A user commented on one of your ideas.

idea_merged

An idea was merged into another.

response_posted

The entity posted an official response (reserved).

Verifying signatures (Node)

webhook-handler.ts
import crypto from "node:crypto";

function verify(req: Request, rawBody: string, secret: string): boolean {
  const sig = req.headers.get("x-wishlist-signature") ?? "";
  const expected =
    "sha256=" + crypto.createHmac("sha256", secret)
      .update(rawBody)
      .digest("hex");
  // Timing-safe compare
  const a = Buffer.from(sig);
  const b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

Example payload: { event: "new_idea", idea_id, idea_title, data: {...}, timestamp }

Integrations

Every webhook consumer works today — Zapier, n8n, Make, or your own server. Native first-class connectors are landing next so you can wire Wishbullet into the tools your team already uses.

LiveSlack

Native incoming webhook — configure in dashboard.

LiveWebhooks

HMAC-signed POSTs to any HTTPS endpoint.

LiveOpenAPI 3.1

Generate typed clients in any language.

On the roadmap

Linear — auto-file tickets from new ideasJira — push ideas to product backlogsGitHub Issues — for OSS and dev-tool feedbackDiscord — channel notifications + /idea slash commandMicrosoft Teams — adaptive cards for status changesZendesk / Intercom — close the loop with support ticketsZapier / n8n / Make — no-code automationNotion — sync ideas into a shared database

Generate a typed client

The API is documented in machine-readable OpenAPI 3.1. Point any generator at it to get a client in your language of choice.

Generate a TypeScript client with openapi-typescript-codegen
npx openapi-typescript-codegen \
  --input https://wishbullet.com/api/v1/openapi.json \
  --output ./src/wishbullet

Questions or a missing endpoint?

Open an issue or request the integration you need — we treat the API surface as a product, not an afterthought.