---
title: "Ingest Conversions"
method: POST
path: "/v1/conversions/ingest"
tags: ["convert"]
---

# Ingest Conversions

`POST /v1/conversions/ingest`

## Request

- Base URL: `https://app.teetra.com` (the document declares no server; this is the origin it was published from)
- URL: `https://app.teetra.com/v1/conversions/ingest`
- Auth: none declared

Producer conversion self-report ingest with attribution window validation.

Explicitly invokes reconcile() to match producer-reported conversions against
Warrant's token_confirmed referrals and record payout ledger rows.

THE HOLE (found in the security sweep): this endpoint was completely UNAUTHENTICATED
while writing PayoutLedger rows via reconcile() — any anonymous caller could self-report
conversions for ANY ``adapter_id`` and trigger a real payout-ledger write. It is a
producer self-report ingest, so it is now gated the same way every other adapter-scoped
producer surface is: a verified producer bearer token whose principal holds a Membership
in the org that owns ``body.adapter_id`` (mirrors
``app.routes.portal._authenticate_and_authorize_adapter`` / the H1 fix in
``app.routes.consumer``). No report item is validated and reconcile() is never called
until authentication AND ownership both pass.

## Request body

- ConversionIngestRequest: Payload for producer conversion self-report ingest.
  - `adapter_id` string, required: Adapter ID reporting conversions
  - `conversions` ConversionReportItem[], nullable: Reported conversion records
    - `consumer_subject_id` string, nullable: Consumer subject id
    - `subject_id` string, nullable: Alias for consumer_subject_id
    - `converted_at` union: Timestamp or datetime of conversion
      - integer
      - string, date-time
    - `timestamp` union: Alias for converted_at
      - integer
      - string, date-time
    - `amount_cents` integer, nullable: Gross amount in cents
    - `amount_usd` number, nullable: Gross amount in USD
    - `currency` string: Currency (defaults to usd)
  - `events` ConversionReportItem[], nullable: Alias for conversions
    - `consumer_subject_id` string, nullable: Consumer subject id
    - `subject_id` string, nullable: Alias for consumer_subject_id
    - `converted_at` union: Timestamp or datetime of conversion
      - integer
      - string, date-time
    - `timestamp` union: Alias for converted_at
      - integer
      - string, date-time
    - `amount_cents` integer, nullable: Gross amount in cents
    - `amount_usd` number, nullable: Gross amount in USD
    - `currency` string: Currency (defaults to usd)
  - `reports` ConversionReportItem[], nullable: Alias for conversions
    - `consumer_subject_id` string, nullable: Consumer subject id
    - `subject_id` string, nullable: Alias for consumer_subject_id
    - `converted_at` union: Timestamp or datetime of conversion
      - integer
      - string, date-time
    - `timestamp` union: Alias for converted_at
      - integer
      - string, date-time
    - `amount_cents` integer, nullable: Gross amount in cents
    - `amount_usd` number, nullable: Gross amount in USD
    - `currency` string: Currency (defaults to usd)
  - `reported_subject_ids` string[], nullable: Direct list of consumer subject IDs

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/teetra/apis/warrant.md) · [All operations](https://skmtc.dev/teetra/apis/warrant/llms.txt) · [OpenAPI document](https://skmtc.dev/teetra/apis/warrant/revisions/a33505db716f?raw)
