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
- Open Panel → Developer Portal → Earnings tab
- Click Request Payout
- Enter amount in tokens (max = your pending_payout)
- 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/payoutsResponse:
{
"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| Status | Meaning |
|---|---|
pending | Submitted, awaiting admin review |
approved | Admin approved; Stripe transfer in progress |
paid | Funds disbursed to your connected account |
rejected | Admin rejected (see admin_note for reason) |
What admin checks
Before approving, Imperal admin verifies:
- Your Stripe Connect account is set up + verified (you complete this during developer onboarding)
- Your earnings balance covers the requested amount (no overdraft)
- No suspicious patterns (e.g. self-inflating earnings via your own usage)
- 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:
- Panel → Developer Portal → Settings → Connect Stripe Account
- Redirected to Stripe Connect onboarding (3-step KYC: identity, bank, terms)
- Once complete, your
imperal_id↔ Stripe account is linked inusers.attributes.stripe_connect_account
If you skip this during onboarding, you can still earn — payouts just queue with
status=pendinguntil 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)
| Reason | What 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:
| Endpoint | What |
|---|---|
GET /v1/developer/admin/payouts/pending | Admin's queue of payouts awaiting review |
POST /v1/developer/admin/payouts/{id}/approve | Mark approved (+ optional admin_note) |
POST /v1/developer/admin/payouts/{id}/reject | Mark rejected with reason |
Both record processed_at so you see exactly when admin actioned your request.