Feedback and error reports

Send private, account-attributed feedback and error reports through MCP or the JSON API.

Send suggestions or report Kourier problems from an agent, a script, or an API client. Reports are saved privately to Kourier's database, associated with the account that owns your API key. They do not create a public issue.

Authentication

Use a Kourier API key in the Authorization: Bearer <key> HTTP header. A dashboard key or the access_token obtained through agent sign-in works. Browser sign-in alone does not authenticate a submission. Never put credentials in the request body or tool arguments.

A valid key can report problems even without an active inference subscription. Unknown, legacy, revoked or expired keys and currently banned accounts cannot submit.

Submit through MCP

Connect to https://kourier.sh/mcp and configure the connection's Authorization header. Call submit_feedback with:

{
  "kind": "error",
  "message": "The response stream stopped unexpectedly with HTTP 500. Expected a complete response.",
  "request_id": "your-request-id",
  "client_name": "Codex CLI"
}

Pricing, setup and onboarding tools still work without a key. Only feedback submission requires authentication.

Submit through the JSON API

Send a JSON body to POST https://kourier.sh/api/feedback. This endpoint is on kourier.sh, not the inference origin api.kourier.sh. It uses exactly the same input fields, account attribution and limits as the MCP tool.

curl --fail-with-body https://kourier.sh/api/feedback \
  -H "Authorization: Bearer $KOURIER_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
    "kind": "feedback",
    "message": "Please add a downloadable usage report.",
    "client_name": "My integration"
  }'

Successful API submissions return 201 Created with id (the report UUID) and created_at (an ISO 8601 timestamp). The MCP tool returns the same fields in structuredContent and text content. Keep the ID when referring to a report.

Fields and limits

FieldRequiredMeaning
kindYesfeedback for suggestions or general feedback; error for a problem report.
messageYes1–8,000 characters, not blank. For errors, include expected/actual behavior and reproduction steps.
request_idNo1–200 characters. Include the associated Kourier request ID when available.
client_nameNo1–80 characters. Client or harness name and version.

Extra fields, including account IDs, are rejected. Ownership is derived only from the authenticated key. NUL bytes are not accepted in any text field. The complete request must fit within 16 KiB of UTF-8; for MCP this includes the JSON-RPC envelope.

Attempts are limited to 60/minute per client before credential lookup and 20/hour per account, shared across its keys and both API/MCP submissions, per server process. On rate_limited, wait the returned retry_after seconds. Limits are per process, not distributed; they reset on restart.

Errors

The API returns an error body with error and error_description. Rate-limit errors also include retry_after and an HTTP Retry-After header. Responses are not cached.

HTTP statusErrorMeaning
400invalid_argumentsInvalid JSON, report fields, or UTF-8.
401unauthorizedMissing or unusable bearer credential, or an active account ban.
413request_too_largeRequest exceeds the 16 KiB body limit.
415unsupported_media_typeUse Content-Type: application/json.
429rate_limitedClient or account submission limit reached.
503service_unavailableReceipt could not be confirmed.

MCP tool errors use isError: true with the corresponding error code in structuredContent, rather than these HTTP statuses. Invalid or oversized MCP envelopes are rejected by the MCP transport itself.

Neither interface automatically retries. If receipt cannot be confirmed, the report may already have been saved; resubmitting can create a duplicate.

What to share

Only share information you want Kourier to receive. Never include API keys, tokens, passwords, personal data, or private code or logs. Content is not automatically redacted. Prefer a minimal reproduction and a request ID over copying an entire conversation or log file.

Reports are not public, and there is no public read/list endpoint. Deleting an account also deletes its reports.