---
title: "List attribution attempts"
method: GET
path: "/attribution/attempts"
tags: ["Attribution"]
---

# List attribution attempts

`GET /attribution/attempts`

## Request

- Base URL: `https://api.warplink.app/v1`
- URL: `https://api.warplink.app/v1/attribution/attempts`
- Auth: HTTP bearer

Lists every attribution attempt of the organization, matched or not, newest first. An attempt is one request from an SDK asking which click led to an install. Use it to see why installs were not tied to a click: fail_reason names the reason (no_signals, no_match, no_candidates, candidates_filtered, candidates_claimed, scored_zero, key_app_mismatch), and it is also set to ambiguous_app on a matched attempt that looked up a device-wide signal across several apps. match_source is claim when the attempt created an install and replay when it answered from an existing one, so the claims equal the records of GET /installs. No IP address, match key or device id is stored on an attempt or returned; ip_class says only whether the request came from a carrier-grade NAT, IPv4 or IPv6 address. Requires an API key with the analytics:read or links:read scope. SDK keys are refused with 403 SDK_KEY_ROUTE_FORBIDDEN. Attempts are filtered by created_at: from is inclusive and to is exclusive. Retention and the Free plan's 30-day look-back apply: a Free organization whose from is earlier than the last 30 days gets 403 LOOKBACK_EXCEEDED with details.earliest_allowed, and a from earlier than the plan's data retention is raised to it. The list is not frozen when a Free organization reaches its click limit. Attempts carry no link, so there is no link_id filter, and a member limited to their own links is refused. Page with pagination.next_cursor and send the same filters with it. A parameter this endpoint does not accept is a 400 VALIDATION_ERROR.

## Query parameters

- `app_id` union
  - string, uuid
  - 'none'
- `matched` boolean
- `from` string, date-time
- `to` string, date-time
- `limit` integer
- `cursor` string

## Response `200`

One page of attribution attempts

- object
  - `data` AttributionAttempt[], required
    - `id` string, required: Stable attempt id, a decimal string because the stored id is a 64-bit integer.
    - `app_id` string, uuid, nullable: The app the attempt came from. Null when it could not be determined, including every attempt before app ids were stored.
    - `platform` 'ios' | 'android', required
    - `sdk_version` string, nullable: Self-reported by the SDK.
    - `strategy` string, required: The cascade branch that ran: referrer, device_id, fingerprint (the probabilistic match), raw or none.
    - `matched` boolean, required
    - `match_source` string, nullable: claim when the attempt created an install, replay when it answered from an existing one. Null on unmatched attempts and on attempts before this was stored.
    - `fail_reason` string, nullable: Why the attempt did not match, or ambiguous_app on a matched attempt that looked up a device-wide signal across several apps. Null otherwise.
    - `fingerprint_version` string, nullable: The match variant the SDK declared. Null when no match key was sent.
    - `tried_version` string, nullable: The match variant the server tried last. Null when no probabilistic branch ran.
    - `candidate_count` integer, nullable: Clicks stored under the key the server tried, before any filter. Null when no probabilistic branch ran.
    - `ip_class` 'cgnat' | 'ipv4' | 'ipv6' | 'null', nullable: The class of the requesting address. The address itself is never stored.
    - `is_reinstall` boolean, nullable: The SDK's own claim. Null when the SDK did not send it.
    - `created_at` string, date-time, required
  - `pagination` CursorPagination, required
    - `limit` integer, required
    - `has_more` boolean, required
    - `next_cursor` string, nullable, required: Send as cursor, with the same filters, to read the next page. Null on the last page.
  - `window` ExportWindow, required: The window that was read.
    - `from` string, date-time, required: Inclusive. Raised to the start of the plan's data retention when the request asked for older rows.
    - `to` string, date-time, required: Exclusive.

## Other responses

- `400`: Invalid query: an unknown or repeated parameter, a value of the wrong type, a from that is not before to (VALIDATION_ERROR), or a cursor that does not belong to this list (CURSOR_INVALID)
- `401`: Unauthorized
- `403`: Forbidden. An SDK key, a key without the analytics:read or links:read scope, or a Free organization whose from is earlier than its last 30 days (LOOKBACK_EXCEEDED, with details.earliest_allowed)
- `404`: Not found
- `422`: No part of the requested window is within your plan's data retention (RETENTION_WINDOW_UNAVAILABLE)

---

[API](https://skmtc.dev/warplink/apis/warplink-api.md) · [All operations](https://skmtc.dev/warplink/apis/warplink-api/llms.txt) · [OpenAPI document](https://skmtc.dev/warplink/apis/warplink-api/revisions/2a90ae8c44e8?raw)
