Deals API
A deal is an offer on a token's registration: a buyout, a project acquisition, a consolidation or a collab. What each type means, and the rules an offer must meet, are in Ownership Deals. Every route, field and status is in the API Explorer under Deals.
Credentials. Reading deals needs only your API key. Making, answering or canceling one also needs a session as Authorization: Bearer <token>; an API key is not accepted as the bearer on any deal route. A wallet named in a request body must be one the session controls, or the answer is 403.
Make an offer
1. Price it. Check the amount against the minimum offer and see Chain Daddy's fee. Amounts here are dollars times 1,000,000, so 1000000000 is $1,000:
curl -H "X-API-Key: $CHAINDADDY_API_KEY" \
"https://api.chaindaddy.io/api/v2/deals/fee-preview?dealValue=1000000000¤cy=USDC"{ "facilitationFee": 25000000, "protocolFee": 20000000, "totalFee": 45000000, "launchDiscount": true,
"feesEnabled": true, "minimumOffer": 500000000, "effectiveRate": 4.5, "dealValueUsd": 1000000000, "currency": "USDC" }The fee comes out of the price: the holder receives the amount less totalFee. Pass tokenAddress and chainId to size minimumOffer by the token's market cap. Collabs and consolidations pay no fee.
2. Prove the funds. Nothing is locked; the server reads your balance and records that it covers the offer. Here offerAmount is the amount as a person types it:
curl -X POST https://api.chaindaddy.io/api/v2/deals/verify-funds \
-H "X-API-Key: $CHAINDADDY_API_KEY" -H "Authorization: Bearer $SESSION" -H "Content-Type: application/json" \
-d '{ "walletAddress": "0x1234…5678", "currency": "USDC", "offerAmount": 25000, "chainId": 8453 }'
# {"verified":true,"balance":"31000000000","requiredAmount":"25000000000","requiredPct":100,"attestation":{…}}A passing check lasts one hour, for that wallet, currency and chain. When verified is false, shortfall says how much more is needed, in the token's base units.
3. Make the offer within the hour:
curl -X POST https://api.chaindaddy.io/api/v2/deals/offer \
-H "X-API-Key: $CHAINDADDY_API_KEY" -H "Authorization: Bearer $SESSION" -H "Content-Type: application/json" \
-d '{ "deal_type": "buyout", "symbol": "PEPE", "chain_id": 8453, "agreed_amount": "25000",
"agreed_currency": "USDC", "buyout_terms": { "redemptionWindow": 60 } }'
# {"success":true,"dealId":"7b1e5c2a-…","status":"draft","deal":{…},"message":"Offer created. The token owner will be notified."}The checks run in this order, and the first to fail is the one you get: the minimum offer (400), the holder's own settings, offers off or below their floor (403), verified funds (402), then your weekly offer count and standing offer value (429).
Answer, pay, settle
- The holder answers with
POST /api/v2/deals/{dealId}/acceptor/reject. Only the wallet holding the registration may. Accepting is not an on-chain transaction, and it fixes the fee. - The acquirer pays (EVM deals that carry a fee).
POST /api/v2/deals/{dealId}/escrow/quotereturns the escrowcontractand signed terms; pass them to the contract'sdeposit, sending exactlypricefor the native coin or approvingpricefirst for the stablecoin. ThenPOST …/escrow/depositwith thetxHash. A quote is good for two hours and asking again replaces it. - The holder signs consent on the deal's page in the app; that step and Solana settlement are not in the API. Chain Daddy then settles in one transaction: the old registration is burned, a new one minted to the acquirer, and the holder paid the price less the fee.
- Either party can cancel with
POST /api/v2/deals/{dealId}/canceluntil the burn lands. A deposit already made goes back to the acquirer. A canceled deal cannot be reopened.
Reading a deal
curl -H "X-API-Key: $CHAINDADDY_API_KEY" "https://api.chaindaddy.io/api/v2/deals/symbol/FLUXGP?chainId=8453"
# {"deals":[],"total":0,"limit":20,"offset":0,"symbol":"FLUXGP"}- Read
stage, notstatus.stagesays who the deal is waiting on (awaiting_response,awaiting_deposit,awaiting_consent,settling, …) anddeadlinewhen that step runs out. seller_addressis the wallet that made the offer (the acquirer). The holder iscrown_holder, and becomesbuyer_addresson accepting.- A session shows more. A party reading
GET /api/v2/deals/{dealId}with a session also getsactions(what they may do now) and a collab's agreed terms; anyone else getsactions: nulland no terms.GET /api/v2/deals/mineis the only list that includes terms. - Don't poll.
deal.created,deal.accepted,deal.rejected,deal.cancelled,deal.completedanddeal.failedarrive as webhooks.
If a call is refused
| Status | code | Meaning |
|---|---|---|
400 | VALIDATION_INVALID_INPUT | A missing or invalid field, an amount below the minimum (the message names it), or a currency with no USD price. |
400, 409 | DEAL_INVALID_STATE | The deal cannot move that way from where it is, for example a deposit before the holder accepts. |
401 | No session, or it expired (they last 15 minutes). | |
402 | VALIDATION_INVALID_INPUT | No passing funds check from the last hour covers the offer. |
403 | A wallet not on your session, a holder who is not taking offers, or not a party to the deal. | |
409 | DEAL_CONFLICT | A swap window is already open on that registration. |
422 | DEAL_TOKEN_NOT_READY | The token is not ready for a priced deal; check names the reason. |
429 | Over your weekly offers or standing offer value, or more than 10 offer or cancel requests a minute. | |
503 | PROVIDER_UNAVAILABLE, DEAL_TOKEN_UNVERIFIED | A temporary failure. Try again. |