> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abstractapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Report an outcome

> Risk API reference: report what an account turned out to be (conversion, fraud or dispute) so you can compare recommendations with real results.

Attaches a business outcome to an earlier check: the account converted to a paid plan, turned out to be fraud, or caused a chargeback. Outcomes never change the stored recommendation. They show you which recommendations were right, so you can tune your policies.

Send them from your systems, for example from your payment provider's webhooks.

```http theme={null}
POST https://protection-api-service.vercel.app/v1/outcomes
Authorization: Bearer sk_...
Content-Type: application/json
```

```bash cURL theme={null}
curl -X POST 'https://protection-api-service.vercel.app/v1/outcomes' \
  -H 'Authorization: Bearer sk_...' \
  -H 'Content-Type: application/json' \
  -d '{
    "run_id": "chk_123",
    "outcome_type": "dispute",
    "outcome_label": "fraudulent",
    "reported_at": "2026-11-05T16:00:00Z",
    "context": { "source": "stripe", "outcome_id": "evt_123" }
  }'
```

## Request body

Identify the check with one of `run_id`, `event_id` or `email`.

**run\_id** `string`

The `check_id` returned by the check.

**event\_id** `string`

The event ID you sent with the check. Use it when you didn't keep the check ID, for example after a timeout.

**email** `string`

The email of the signup. Matches the earliest signup check for that address before `reported_at`. If no check matches, the response is `200` with `"resolved": false` and nothing is stored, because reporting on a user who was never checked is normal.

**outcome\_type** `string` *required*

`conversion`, `fraud` or `dispute`.

**outcome\_label** `string` *required*

Your or your provider's label for the event, such as `approved`, `chargeback` or `fraudulent`.

**reported\_at** `string`

When the event happened, as an RFC 3339 timestamp.

**context** `object`

Where the event came from. Set `source` (for example `stripe`) and a stable `outcome_id` so retries don't create duplicates: resending the same data with the same `outcome_id` returns the original outcome.

## Response

`200` with the stored outcome, or `{"resolved": false, "reason": "no_matching_check"}` when an email matched no check.

## Errors

| Status | Meaning |
| - | - |
| 400 | Unsupported outcome type or label, or missing check identifier. |
| 401 | Missing or invalid Secret key. |
| 404 | No check with this `run_id` or `event_id`. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.