Report a real-world outcome about a subject
Tell Portreeve what actually happened. The subject names what the report is about: an event_id, an external_user_id (the natural shape from a payment provider’s dispute webhook — “this account charged back”), or an email. Feedback propagates across the subject’s linked identity cluster, so a confirmed_abuse or chargeback report sharpens future decisions about every account linked to it, and a false_positive suppresses the pattern that misfired.
The subject kind set is deliberately closed: feedback convicts, and identifiers that cannot safely convict (IPs, user agents) will never be accepted as subjects. New kinds are added as enum values — the route never changes.
Safe to retry. An identical repost — same subject, same outcome — is deduplicated server-side and returns 200 { "ok": true } without recording a second row, so no Idempotency-Key is needed. The same subject with a different outcome records both.
Authentication
Authorization: Bearer sk_live_… (or sk_test_…). Server-side only — never ship a secret key to a browser or a mobile app. The key determines the tenant and the mode; there is no mode parameter on any request.
Request
What the report is about. {kind: "event_id"} matches the old per-event behavior; {kind: "external_user_id"} is the dispute-webhook shape.
confirmed_abuse: the actor turned out to be abusive — marks their whole linked cluster. false_positive: we were wrong — send these even when they feel minor, they are the metric we hold ourselves to. chargeback: a dispute was filed.
Response
Feedback recorded (or already recorded — the endpoint is idempotent on (subject, outcome)).
Always true. The endpoint has no failure mode that returns 200.