---
title: "Deployer creator-fee rewards — collected vs attributed"
method: GET
path: "/deployer-hunter/{wallet}/rewards"
tags: ["Deployer Hunter"]
---

# Deployer creator-fee rewards — collected vs attributed

`GET /deployer-hunter/{wallet}/rewards`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/deployer-hunter/{wallet}/rewards`
- Auth: HTTP bearer

pump.fun **creator-fee rewards** for a wallet, answered two ways that are never merged. **`collected`** = what actually reached the wallet: `direct_claims` (collect_creator_fee — these rows carry no mint; history since 2026-08-17 is retained, archive policy pending), `social_claims` (social-handle PDA claims paid to the wallet) and `share_payouts` (distribute_creator_fees payouts naming the wallet as a shareholder, on any token — `on_own_tokens` isolates the ones it deployed). **`attributed`** = every distribute_creator_fees payout on the tokens the wallet **deployed**, whoever received it, split `to_self` / `to_others` with `redirected_pct`. A deployer whose attributed total dwarfs its collected total is redirecting fees (launch tool, KOL, social handle) — that gap is the signal. Each money block carries `sol`, `usdc` and `usd` (quotes are summed separately; `usd` is null when a SOL amount exists and no SOL price is available, never a silent zero). `top_tokens` / `top_recipients` (≤10 each) show where the attributed fees went, with social PDAs labelled. Works for non-deployers too (`is_deployer: false`, attributed empty). Shareholder payouts and social claims since 2026-08-17. Tokens on the default config (100% to the creator) pay via direct claims, so `attributed` only covers tokens whose fees were ever split. PRO+.

## Path parameters

- `wallet` string, required

## Response `200`

OK

- object
  - `wallet` string
  - `is_deployer` boolean
  - `tokens_in_scope` integer: tokens attributed to the wallet in our token table — the universe `attributed` is computed over; not the profile's total_tokens_deployed
  - `collected` object
    - `sol` number
    - `usdc` number
    - `usd` number, nullable
    - `direct_claims` object
      - `count` integer
      - `sol` number
      - `usdc` number
      - `usd` number, nullable
      - `first_at` string, nullable
      - `last_at` string, nullable
      - `window_days` integer
    - `social_claims` object
      - `count` integer
      - `sol` number
      - `usdc` number
      - `usd` number, nullable
      - `first_at` string, nullable
      - `last_at` string, nullable
    - `share_payouts` object
      - `count` integer
      - `tokens` integer
      - `sol` number
      - `usdc` number
      - `usd` number, nullable
      - `on_own_tokens` object
        - `sol` number
        - `usdc` number
        - `usd` number, nullable
      - `first_at` string, nullable
      - `last_at` string, nullable
  - `attributed` object
    - `count` integer
    - `sol` number
    - `usdc` number
    - `usd` number, nullable
    - `to_self` object
      - `sol` number
      - `usdc` number
      - `usd` number, nullable
    - `to_others` object
      - `sol` number
      - `usdc` number
      - `usd` number, nullable
    - `redirected_pct` number, nullable: share of attributed fees that went to wallets other than the deployer (0–100)
    - `tokens_with_payouts` integer
    - `distributions` integer
    - `recipients` integer
    - `first_at` string, nullable
    - `last_at` string, nullable
  - `top_tokens` object[]
    - `mint` string
    - `quote` 'SOL' | 'USDC'
    - `total` number
    - `total_usd` number, nullable
    - `to_self` number
    - `to_self_usd` number, nullable
    - `payouts` integer
    - `recipients` integer
    - `last_at` string
  - `top_recipients` object[]
    - `address` string
    - `quote` 'SOL' | 'USDC'
    - `total` number
    - `total_usd` number, nullable
    - `tokens` integer
    - `payouts` integer
    - `last_at` string
    - `is_self` boolean
    - `is_social_pda` boolean
    - `social` object, nullable
      - `platform` integer
      - `user_id` string
  - `quote` object
    - `sol_usd` number, nullable
  - `coverage` object
    - `payouts_since` string, date
    - `direct_claims_window_days` integer
    - `note` string

## Other responses

- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: Forbidden. One of: the key's tier is below this endpoint's or parameter's gate (`tier_required` with an `upgrade` block); the public demo key used outside its allow-list (`demo_key_endpoint_not_allowed`); an invalid or revoked key; an origin-restricted key called from a disallowed origin (`code` `origin_not_allowed` / `origin_required`). `X-RateLimit-*` headers are present only on `tier_required`.
- `429`: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
- `500`: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
- `503`: Temporarily unavailable — a Postgres statement timeout while the dataset is under load or maintenance (`statement_timeout`, with `X-RateLimit-*` and `_rid`), or the API-key lookup itself unavailable (`auth_backend_unavailable`, authentication stage: no `X-RateLimit-*`, no `_rid`, not counted as a failed authentication). Always carries `Retry-After`; honour it.

---

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