Skip to navigation

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

AuthorizationBearer

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

This endpoint expects an object.
subjectobjectRequired

What the report is about. {kind: "event_id"} matches the old per-event behavior; {kind: "external_user_id"} is the dispute-webhook shape.

outcomeenumRequired

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.

Allowed values:
notestringOptional<=2000 characters
Optional free text for your own records, up to 2000 characters.

Response

Feedback recorded (or already recorded — the endpoint is idempotent on (subject, outcome)).

oktrue

Always true. The endpoint has no failure mode that returns 200.

Errors

400
Bad Request Error
401
Unauthorized Error
404
Not Found Error
429
Too Many Requests Error
500
Internal Server Error