Skip to content

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:

bash
curl -H "X-API-Key: $CHAINDADDY_API_KEY" \
  "https://api.chaindaddy.io/api/v2/deals/fee-preview?dealValue=1000000000&currency=USDC"
json
{ "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:

bash
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:

bash
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 ​

  1. The holder answers with POST /api/v2/deals/{dealId}/accept or /reject. Only the wallet holding the registration may. Accepting is not an on-chain transaction, and it fixes the fee.
  2. The acquirer pays (EVM deals that carry a fee). POST /api/v2/deals/{dealId}/escrow/quote returns the escrow contract and signed terms; pass them to the contract's deposit, sending exactly price for the native coin or approving price first for the stablecoin. Then POST …/escrow/deposit with the txHash. A quote is good for two hours and asking again replaces it.
  3. 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.
  4. Either party can cancel with POST /api/v2/deals/{dealId}/cancel until the burn lands. A deposit already made goes back to the acquirer. A canceled deal cannot be reopened.

Reading a deal ​

bash
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, not status. stage says who the deal is waiting on (awaiting_response, awaiting_deposit, awaiting_consent, settling, …) and deadline when that step runs out.
  • seller_address is the wallet that made the offer (the acquirer). The holder is crown_holder, and becomes buyer_address on accepting.
  • A session shows more. A party reading GET /api/v2/deals/{dealId} with a session also gets actions (what they may do now) and a collab's agreed terms; anyone else gets actions: null and no terms. GET /api/v2/deals/mine is the only list that includes terms.
  • Don't poll. deal.created, deal.accepted, deal.rejected, deal.cancelled, deal.completed and deal.failed arrive as webhooks.

If a call is refused ​

StatuscodeMeaning
400VALIDATION_INVALID_INPUTA missing or invalid field, an amount below the minimum (the message names it), or a currency with no USD price.
400, 409DEAL_INVALID_STATEThe deal cannot move that way from where it is, for example a deposit before the holder accepts.
401No session, or it expired (they last 15 minutes).
402VALIDATION_INVALID_INPUTNo passing funds check from the last hour covers the offer.
403A wallet not on your session, a holder who is not taking offers, or not a party to the deal.
409DEAL_CONFLICTA swap window is already open on that registration.
422DEAL_TOKEN_NOT_READYThe token is not ready for a priced deal; check names the reason.
429Over your weekly offers or standing offer value, or more than 10 offer or cancel requests a minute.
503PROVIDER_UNAVAILABLE, DEAL_TOKEN_UNVERIFIEDA temporary failure. Try again.