If you don’t pass an
Api-Version-Date or have a stored API-key pin, the stable API model is used. Requests with neither are served by the pre-versioning behavior, so existing integrations keep working unchanged. Pin a dated version to opt into the latest API.Application programming interface key version pins
API keys carry their own API version pin. Requests authenticated with an API key use that pin when they omitApi-Version-Date. Existing keys without a stored pin use 2025-01-01. Newly created keys use the latest released version.
An explicit Api-Version-Date header always takes precedence over the API key’s pin, so you can test an upgrade before changing the saved version.
Every version automatically gets new endpoints and optional fields. Breaking changes create a new dated version, which the changelog below lists.
Changelog
Account balance breakdowns now expose
in_transit alongside pending.- Add
pendingandin_transitto present the total amount awaiting settlement. - Callers pinned to earlier versions continue receiving the combined amount in
pending.
Webhook API version input removed
The
api_version input on POST /webhooks and PATCH /webhooks/{id} is removed.- New webhooks always use the
v1events and payloads. Requests passingapi_versionare rejected with a400. - Pin a webhook’s payload shape with
api_version_dateinstead. - Existing
v2andv5webhooks keep delivering. You can no longer create or switch webhooks to these versions.
Native dispute alert endpoints
Dispute alerts are now a native REST resource and remain dual-served with the legacy proxy.
GET /dispute_alertslists an account’s alerts with cursor pagination, and filters byaccount_id,payment_id,type, and a creation window.typereplacesalert_typeand names the two kinds an issuer sends:early_fraud_warning(Visa TC40 / Mastercard SAFE fraud reports) anddispute_alert(pre-dispute notices).fee_chargedreplacescharge_for_alertand reports whether Whop actually billed the account. Early fraud warnings are never billed.actionablereports whether refunding the payment can still prevent a chargeback.paymentanddisputeobjects are replaced by thepayment_idandaccount_idtags. Timestamps are ISO 8601, withreported_atfor when the issuer filed the report.
Fiat currency conversion on swaps
Fiat-pair swaps (
POST /swaps with two fiat currencies) now support free-form currency conversion, and amount matches crypto swap semantics.amountis the amount offrom_tokento convert at the mid-market rate — no negative balance required.- Sizing a partial repayment of a negative
to_tokenbalance moved to the newto_amountfield (denominated into_token, capped at the debt).amountandto_amountare mutually exclusive. - Omitting both still repays the full negative
to_tokenbalance. - Callers pinned to earlier versions keep the previous behavior: their fiat
amountis treated as theto_tokenrepayment amount.
Flat verification requirements
A verification’s
requested_information is now a flat list: one requirement per entry, one write per answer.- Each entry names what’s needed in
requirement— a document such asbank_statement, or a field key such asssn— with alabelto show the user. - Answer
fileentries withfile(a direct upload ID). Answertext,date,phone, andselectentries withvalue, andaddressentries withaddress. Nothing from the response is echoed back. - An entry marked
multipletakes several files in one answer, in slot order — front first for a two-sided document. - An entry listing
optionsalso takes avalue. Forselectentries, the options are the allowed answers. For identity documents, the options are the accepted ID types. - Keys that don’t apply are omitted, and rejected submissions carry structured
errorswith a stablecodeand areason. - The nested
requested_files/categoryform shape is gone from this version. Callers pinned to earlier versions keep it, and their answers are translated automatically.
Native promo code endpoints
Promo codes are now a complete top-level REST resource and remain dual-served with the legacy proxy.
GET /promo_codeslists an account’s promo codes and usesaccount_idinstead ofcompany_id.POST /promo_codescreates promo codes.GETandDELETE /promo_codes/{id}retrieve and archive them.POST /promo_codes/{id}/activateandPOST /promo_codes/{id}/deactivatereplace the legacyPATCHstatus write.- List responses use cursor pagination and support status, product, plan, timestamp, and sorting filters.
- Callers pinned to earlier versions keep the legacy proxy contract unchanged.
Richer parent accounts
Account responses now expose a richer parent account relationship for connected accounts.
parent_accountreplacesparent_account_id.- The parent account includes its
id,title,route, andlogo_url.
Supported payout methods
Supported payout methods now have their own paginated endpoint.
GET /payouts/supported_methodslists the payout methods an account or user is eligible to add.- Supported methods use
object: "supported_payout_method", and theirpodst_IDs are passed assupported_payout_method_id. - Saved payout methods expose
supported_payout_method. Payouts exposepayout_method.supported_payout_method. - Use
countryto list supported methods for a country other than the payout account’s country. GET /payouts/methodsno longer acceptsinclude_availableor returnsavailable_destinations.- Callers pinned to earlier versions keep
destination_id,payout_destination, andpayout_token.
Native card transactions, payout method arrival estimates
Card transactions now use native REST endpoints and remain dual-served with the legacy proxy.
GET /card_transactionslists an account’s card transactions, andGET /card_transactions/{id}retrieves one by itscitx_id. The list also takes atransaction_idsfilter to fetch specific transactions in one request.- Card transactions are account-scoped: the owner is selected with
account_id, defaulting to the account the credential belongs to. - Filters on
transaction_ids,card_id,cardholder_id,status,created_after, andcreated_before. Timestamp filters are ISO 8601. cardholder_idis new on the response: the user the card is assigned to.
- Each payout method returns
fee_structure(percentage, fixed amount, and currency) andestimated_arrival(per-speed timestamps) without requiring anamount. - The quote’s
standardandinstantobjects no longer includeestimated_arrival. Read it from the method’s top-levelestimated_arrivalfield.
Native Resolution Center endpoints
Resolution Center cases now use native REST endpoints and remain dual-served with the legacy proxy.
status,escalated,outcome,refund,reason, andavailable_actionsexpose case state and permitted actions.- Events are available from paginated
GET /resolution_center_cases/{id}/events. Summaries are available fromGET /resolution_center_cases/summary. - Writes use
messageandattachments.due_dateis renamedresponse_due_at. Listing no longer requiresaccount_id.
Native shipments endpoints
Shipments now use native REST endpoints and remain dual-served with the legacy proxy.
GET /shipmentslists shipments.GET /shipments/{id}retrieves by shipment id or payment id.POST /shipmentscreates a shipment, andPATCH /shipments/{id}updates its tracking number.- Responses use
account_idandtracking_number, alongsidecarrier,tracking_url,order_id, andpayment_id. - Callers pinned before this date keep the legacy proxy contract unchanged.
Native disputes endpoints
Disputes now use native REST endpoints and remain dual-served with the legacy proxy.
PATCH /disputes/{id}edits evidence, andPOST /disputes/{id}/submitsubmits it. Evidence is nested underevidence.GET /disputes/summaryprovides totals grouped bystatusandcurrency. List and retrieve return the same fields.- Responses use
account_id,product_id, andplan_id, plusbuyeralongsidepayment. Listing no longer requiresaccount_id. statusandreasonare normalized enums, andneeds_response_by,rdr, andeditableare replaced by their new fields.- Callers pinned before this date keep the legacy proxy contract unchanged.
Members and memberships
Members and memberships now use native resources with an account-oriented membership model and redesigned lifecycle actions.
- Membership responses return
plan_idandproduct_idinstead of nestedplanandproductobjects. - Listing memberships returns everything the caller can read — their own plus their managed accounts’ — and
account_id/user_idnarrow that list instead of switching modes or erroring. - Set
cancel_at_period_endto schedule cancellation. Thecancelaction ends access immediately. - The
extendaction replacesadd_free_days.
REST response and timestamp consistency
The Experimental API now uses consistent delete responses, timestamp inputs, and Account naming.
- Delete endpoints for products, plans, checkout configurations, ads, ad groups, ad campaigns, social accounts, and bounty submissions return
{ id, deleted: true }instead of a bare boolean. - Timestamp filters on products, plans, checkout configurations, transfers, and financial reports accept ISO 8601 only instead of also accepting epoch seconds.
- Product responses return
accountinstead ofcompany.
Partner business payout percentages
Partner businesses now expose separate payout rates for every income source.
payout_percentageis replaced bypayout_percentages.- The nested object includes
sales,ad_spend,transfer, andcard_interchangerates.
Products and checkout configurations
Products and checkout configurations now use the Account model consistently.
- Product request parameters use
account_idinstead ofcompany_id. - Checkout configuration requests use
account_idat the top level and inside inlineplanobjects. - Checkout configuration responses return
account_idinstead ofcompany_id.
Checkout configuration timestamps
Checkout configuration timestamps now use the same format as the rest of the API.
created_atandupdated_atare ISO 8601 strings instead of Unix epoch integers.
User balances
User balances now provide a complete, structured balance summary.
- The flat
total_usdandbalancesfields are replaced by a nestedbalanceobject. - The summary separates cash, crypto, in-flight treasury deposits, and balances for accounts the user owns.
Business referral earnings resources
Business referral earnings now identify the polymorphic resource that generated the earning.
receiptis replaced byresource.access_passis replaced byproduct.- Receipt-backed earnings return
resource.object: "receipt"with receipt payment details. - The
resourcefield can support additional earning resources in future versions without reusing receipt-specific fields.
Business referrals resource
Business referral volume and earnings are now reported as reconciling groups.
processing_volume,total_earnings,pending_payout, andcompleted_payoutare replaced by nestedvolume_usdandearnings_usdobjects.- Earnings rename
base_amount/amounttotransaction_amount_usd/commission_amount_usdand expresspayout_percentageas a fraction.
Plans resource
Plans now use the Account model consistently.
- Request parameters and request bodies use
account_idinstead ofcompany_id. - Plan responses return
accountinstead ofcompany.
Users resource
User access requests now use the Account model consistently.
- Request parameters and request bodies use
account_idinstead ofcompany_id. - Response shapes are unchanged.
Original version
The original Experimental API behavior before dated versioning existed.Requests without
Api-Version-Date use this version so existing integrations keep working.
