Resolve what a fan actually bought
For a content-less PPV payment, find the exact media/bundle the fan purchased by reading their live chat.
Who this is for: chatters reconciling a payment that arrived with no linked content.
See content_id vs vault media_id for why this lookup exists at all: OnlyFans never tells us which media a PPV payment paid for. This endpoint answers it the way the OnlyFans app itself would — by opening the fan's chat live and finding the matching purchased message.
curl "https://app.tease.link/api/admin/content/for-payment?fan_id=12345&price_cents=1500&to_ts=1751280000" \
-H "Authorization: Bearer $TEASE_API_KEY"Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
fan_id | string | yes | The fan who paid. |
price_cents | integer | no | The payment amount — matched within ±1¢. |
from_ts / to_ts | integer | no | Bound the payment time; to_ts (the payment instant) is preferred as the "nearest in time" anchor when both are given. |
limit | integer | no | 1–5. How many chat pages to scan (each page ≈ 1 OFAPI credit); stops at the first match. Defaults to 3. |
Response shape
{
"found": true,
"message_id": "m_5521",
"price_cents": 1500,
"sold_at": "2026-08-14T10:22:00Z",
"bundle_size": 3,
"media": [
{ "content_id": 88120, "type": "photo", "preview_url": "https://cdn2.onlyfans.com/..." }
],
"note": "",
"capturing": false
}found: false comes back with a soft note (e.g. "vendor error"), never a 500 — a missing
credential, an empty chat, or a vendor hiccup all degrade the same way.
This result is remembered
A successful resolution is idempotently written into the content_sale ledger, so a repeat
lookup for the same purchase is instant next time and the ledger's coverage improves
permanently — you're not re-spending an OFAPI credit on the same answer twice.
What's next
Once resolved, see the fan's full purchase history with Check a fan's purchase history.