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
| Field | Required | Meaning |
|---|---|---|
kind | Yes | feedback for suggestions or general feedback; error for a problem report. |
message | Yes | 1–8,000 characters, not blank. For errors, include expected/actual behavior and reproduction steps. |
request_id | No | 1–200 characters. Include the associated Kourier request ID when available. |
client_name | No | 1–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 status | Error | Meaning |
|---|---|---|
| 400 | invalid_arguments | Invalid JSON, report fields, or UTF-8. |
| 401 | unauthorized | Missing or unusable bearer credential, or an active account ban. |
| 413 | request_too_large | Request exceeds the 16 KiB body limit. |
| 415 | unsupported_media_type | Use Content-Type: application/json. |
| 429 | rate_limited | Client or account submission limit reached. |
| 503 | service_unavailable | Receipt 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.