Shipeasy
APIOperations

File a bug

Files one bug onto a project's queue, awaiting human approval. This is the public intake: it authenticates with a *client* SDK key rather than an admin key,…

Files one bug onto a project's queue, awaiting human approval. This is the public intake: it authenticates with a client SDK key rather than an admin key, so it can be called from a CLI, an installer script, a devtools overlay, or any shipped code — the same places a client key already lives.

Three gates decide whether a ticket is filed, and nothing else the caller sends can widen them:

  1. the key is a client key carrying the tickets:public_create scope,
  2. the key's project has public ticket creation enabled, and
  3. the item is filed as pending_approval — parked out of the work queue until a human promotes it in the dashboard.

The project is the key's own project; there is no X-Project-Id to pass and no way to file into someone else's queue. Repeat submissions of the same title dedupe against the open ticket already tracking it, which returns 200 with deduped: true instead of filing again.

This endpoint is served by the Shipeasy edge worker (api.shipeasy.ai), not the admin API — see servers below.

Use case

shipeasy setup fails on a customer's machine and self-reports the failure with the user's consent — { "title": "Setup failed at Feature installs", "stepsToReproduce": "…", "actualResult": "…" }.

POST
/ops/bug

Authorization

clientSdkKey
X-SDK-Key<token>

Pass a client SDK key as X-SDK-Key: sdk_client_…. Used only by the public ticket intake (POST /ops/bug, POST /ops/feature-request), which is served by the edge worker rather than the admin API.

Client keys are designed to be embedded in shipped code — a CLI, an installer, a browser bundle — so presenting one here is safe by construction: it can do nothing but file a rate-limited ticket into its own project, in a state a human must approve. It carries no read access and cannot reach any other operation in this contract.

The key must additionally carry the tickets:public_create scope, and its project must have public ticket creation enabled.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://api.shipeasy.ai/ops/bug" \  -H "Content-Type: application/json" \  -d '{    "title": "Checkout button misaligned on mobile"  }'
{
  "number": 7,
  "deduped": true
}
{
  "id": "fb_01j7w8a1b2c3d4e5f6g7h8i9j0",
  "number": 7
}
{
  "error": "Malformed request (bad JSON, missing project scope).",
  "code": "BAD_REQUEST"
}
{
  "error": "Missing or invalid admin SDK key.",
  "code": "UNAUTHORIZED"
}

{
  "error": "Key is valid but not allowed to act on this project.",
  "code": "FORBIDDEN"
}

{
  "error": "Body too large",
  "code": "BAD_REQUEST"
}
{
  "error": "Too many requests",
  "code": "BAD_REQUEST"
}
{
  "error": "Unavailable"
}
Was this page helpful?
Updated August 8, 2026