Skip to content

Quickstart

Put a stablecoin balance to work in about ten minutes: run an auction for your deposit, sign once, and watch shares land in your own address. Gas is relayed — the depositing account needs no native token.

1. Get an API key

Requests carry your key in the api-key header — Get API access.

export EDITH_API_KEY="your-api-key"

2. See what the market pays

curl "https://meadow.example.com/v1/rates?asset=0xUSDC…&chain=84532" \
  -H "api-key: $EDITH_API_KEY"

Indicative APYs per venue, in basis points. To commit real money you don't take these — you run an auction.

3. Request a quote (this runs the auction)

curl -X POST https://meadow.example.com/v1/quotes \
  -H "api-key: $EDITH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "userAddress": "0xYourAddress",
    "chain": 84532,
    "asset": "0xUSDC…",
    "amount": "900000000",
    "riskTier": "balanced"
  }'
const res = await fetch("https://meadow.example.com/v1/quotes", {
  method: "POST",
  headers: { "api-key": process.env.EDITH_API_KEY!, "Content-Type": "application/json" },
  body: JSON.stringify({
    userAddress: account.address,
    chain: 84532,
    asset: USDC_ADDRESS,
    amount: "900000000",       // 900 USDC, smallest units, as a string
    riskTier: "balanced",
  }),
});
const { data: quote } = await res.json();

Solvers bid for your deposit; the response is the winning bid plus everything you must sign:

{
  "success": true,
  "data": {
    "quoteId": "68fa41c2…",
    "netApy": 4.87,
    "grossApy": 5.2,
    "feeBps": 25,
    "allocation": [{ "venueId": "usdc-vault-1", "vault": "0x…", "shareBps": 10000 }],
    "txPayload": {
      "authorization": { "chainId": 84532, "address": "0xDelegate…", "nonce": 3 },
      "executeDigest": "0x…",
      "calls": [ { "target": "0xUSDC…", "value": "0", "data": "0x095ea7b3…" },
                 { "target": "0xVault…", "value": "0", "data": "0x6e553f65…" } ],
      "executeNonce": "0"
    },
    "expiresAt": 1753795200
  },
  "timestamp": "2026-07-29T12:00:00.000Z"
}

4. Sign twice, submit once

Two signatures from the depositing wallet — an EIP-7702 authorization and a signature over executeDigest:

const auth = await walletClient.signAuthorization({
  contractAddress: quote.txPayload.authorization.address,
  chainId: quote.txPayload.authorization.chainId,
  nonce: quote.txPayload.authorization.nonce,
});
const executeSignature = await account.sign({ hash: quote.txPayload.executeDigest });

await fetch("https://meadow.example.com/v1/deposits", {
  method: "POST",
  headers: { "api-key": process.env.EDITH_API_KEY!, "Content-Type": "application/json" },
  body: JSON.stringify({ quoteId: quote.quoteId, authorization: auth, executeSignature }),
});

The response is an order. Quotes expire (expiresAt) — deposit promptly or re-quote.

5. Watch it confirm

curl https://meadow.example.com/v1/orders/$ORDER_ID -H "api-key: $EDITH_API_KEY"

status runs relaying → confirmed (or failed). Once confirmed:

curl "https://meadow.example.com/v1/positions?userAddress=0xYourAddress" \
  -H "api-key: $EDITH_API_KEY"

Your vault shares sit in your own address — not in a pool. Withdraw any time; there is no lock-in.

Next