Shipeasy
APIOperations

File a feature request

Files one feature request onto a project's queue, awaiting human approval. The feature-request counterpart to POST /ops/bug, with the same three gates: a…

Files one feature request onto a project's queue, awaiting human approval. The feature-request counterpart to POST /ops/bug, with the same three gates: a client key carrying tickets:public_create, a project that has opted in, and a pending_approval state forced server-side.

The project is the key's own project; there is no X-Project-Id to pass. 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

An in-product "request a feature" form posts what the user asked for — { "title": "Dark mode", "useCase": "Reduce eye strain at night" }.

POST
/ops/feature-request

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/feature-request" \  -H "Content-Type: application/json" \  -d '{    "title": "Dark mode for the dashboard"  }'
{
  "number": 7,
  "deduped": true
}
{
  "id": "fb_01j7w8a1b2c3d4e5f6g7h8i9j0",
  "number": 8
}
{
  "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