Specie
Arc Testnet
Data

API reference

Two endpoints, both public, both the same ones the interface itself calls. They read the chain and build calldata. They never hold a key, never sign anything and never see funds.

No authentication and no rate plan. There is also no stability promise yet: these routes exist to serve this site, and a field can change while the product is unfinished.

GET /api/quote?list=1

What can actually be routed right now. Add &token=EURC to ask about one asset.

curl "https://app.usespecie.xyz/api/quote?list=1&token=EURC"
FieldMeaning
tokens[].symbolthe asset, always quoted against USDC
tokens[].tradablea pool with liquidity exists and prices a small order
tokens[].smallOnlya thousand unit order cannot be filled near the pool mid
tokens[].impactPercentwhat a thousand unit order would cost against that mid
tokens[].hops1 for a direct pool, 2 through USDC
referencealways pool-mid

GET /api/quote

A price for an exact amount. side=buy spends USDC, side=sell spends the asset.

curl "https://app.usespecie.xyz/api/quote?token=EURC&amount=100&side=buy"

POST /api/swap

The same quote, plus the calldata to sign and a simulation of it from your address. Nothing is signed here: the answer is a transaction you may choose to send.

curl -X POST https://app.usespecie.xyz/api/swap \
  -H "content-type: application/json" \
  -d '{
    "token": "EURC",
    "side": "buy",
    "amount": "100",
    "address": "0xYourAddress",
    "slippageBps": 50
  }'

What comes back

FieldMeaning
routablefalse when no pool with liquidity exists, with reason
safefalse when the fill lands more than 3% under the pool mid; no calldata is returned
amountOutwhat the pool returns before the fee
lossPercentprice impact against midRate, the pool priced at one unit
feeBpsthe Specie fee in basis points, taken from the output
minimums.grossminimum the pool must return, enforced on the swap
minimums.netminimum that must reach your wallet after the fee
poolthe winning route: fee tier and pool id, or the hops and legs
approvals[]ERC-20 and Permit2 steps to send first, each with to and data
txthe swap transaction: to, value, data
preflight.okthe simulation passed; the interface arms only on true
preflight.willReceivewhat the simulation says lands in your wallet
preflight.feeTakenwhat the simulation says the fee takes
preflight.gasUsedgas the simulated transaction used
quotedAtwhen this answer was built, in milliseconds

Status codes

CodeWhen
200answered, including the honest refusals: routable: false and safe: false
400unknown asset, missing address, or an amount that is not a positive number
502the chain could not be read
503Uniswap is not deployed at the configured addresses; the error names what is missing

A 503 is the answer you will get on this network today, and it is the reason the swap panel says swaps are not open instead of drawing an empty market.

Sending a swap yourself

  1. Post to /api/swap and check preflight.ok is true.
  2. Send every entry in approvals in order, waiting for each.
  3. Send tx.
  4. Re-post before signing if more than a few seconds passed. A quote and its simulation are statements about one block.