Imperal Docs
Billing & Earnings

Payouts

How to convert your token earnings to USD payouts

When you can request a payout

You can request a payout any time pending_payout > 0. Pending payout is:

pending_payout = total_earned − (paid_out + approved_pending_disbursement)

There's no minimum threshold today — but Imperal admin may reject very small requests (under $5 USD equivalent) to batch them, depending on Stripe Connect transfer fees.

How to request

Via Dev Portal Panel

  1. Open Panel → Developer Portal → Earnings tab
  2. Click Request Payout
  3. Enter amount in tokens (max = your pending_payout)
  4. Confirm

Via API

curl -X POST \
  -H "Authorization: Bearer $YOUR_JWT" \
  -H "Content-Type: application/json" \
  -d '{"amount_tokens": 5000}' \
  https://auth.imperal.io/v1/developer/payouts

Response:

{
  "id": 42,
  "amount_tokens": 5000,
  "amount_usd": 5.00,
  "status": "pending",
  "requested_at": "2026-05-12T10:30:00Z"
}

USD amount = amount_tokens × plan.topup_rate (default $0.001/token). Locked at request time.

Status lifecycle

pending → approved → paid
         \
          → rejected
StatusMeaning
pendingSubmitted, awaiting admin review
approvedAdmin approved; Stripe transfer in progress
paidFunds disbursed to your connected account
rejectedAdmin rejected (see admin_note for reason)

What admin checks

Before approving, Imperal admin verifies:

  1. Your Stripe Connect account is set up + verified (you complete this during developer onboarding)
  2. Your earnings balance covers the requested amount (no overdraft)
  3. No suspicious patterns (e.g. self-inflating earnings via your own usage)
  4. KYC / compliance flags clear

Typical turnaround: 1-3 business days for first payout (new Connect setup), faster after.

Stripe Connect setup

Required to receive USD payouts. Setup happens during developer onboarding:

  1. Panel → Developer Portal → Settings → Connect Stripe Account
  2. Redirected to Stripe Connect onboarding (3-step KYC: identity, bank, terms)
  3. Once complete, your imperal_id ↔ Stripe account is linked in users.attributes.stripe_connect_account

If you skip this during onboarding, you can still earn — payouts just queue with status=pending until you complete Connect.

Currency + tax

  • All payouts are in USD, sent to your verified bank account via Stripe Connect Transfer.
  • Imperal does not withhold tax. You're responsible for declaring income according to your jurisdiction's rules (1099 forms in US, etc.).
  • Imperal generates an annual earnings statement (PDF) downloadable from Dev Portal → Earnings → Tax docs.

Common questions

How long does a payout take to arrive?

After status=paid (admin marked done), Stripe transfers typically arrive in:

  • US bank: 2-5 business days
  • EU bank: 3-7 business days
  • Non-US/EU: 5-10 business days

Can I cancel a pending payout?

Not via UI today. Contact admin (support@imperal.io) if needed.

What happens if my Stripe Connect account is restricted mid-flight?

Stripe transfer fails → admin reverts your payout to status=pending. You fix the Connect issue → admin re-approves.

Multi-currency?

Imperal pays out only in USD today. Future: native currency conversion via Stripe Connect's currency-of-record feature.

Can I get paid in tokens instead of USD?

Token-to-USD is the model. If you want to keep value in Imperal ecosystem, leave earnings unrequested — they accrue indefinitely and can be redeemed later. There's no expiry on accrued earnings.

Reject reasons (most common)

ReasonWhat to do
"Stripe Connect not set up"Complete onboarding in Settings
"Below minimum threshold"Wait for more earnings or batch with next
"Identity verification needed"Stripe Dashboard → complete KYC
"Suspicious usage pattern"Reach out to support with usage proof
"Outstanding chargebacks"Resolve disputes first

Admin endpoints (visibility for you)

You can't call these (admin-only), but they're documented so you know what admin sees:

EndpointWhat
GET /v1/developer/admin/payouts/pendingAdmin's queue of payouts awaiting review
POST /v1/developer/admin/payouts/{id}/approveMark approved (+ optional admin_note)
POST /v1/developer/admin/payouts/{id}/rejectMark rejected with reason

Both record processed_at so you see exactly when admin actioned your request.

On this page