# Agent Data API — x402 pay-per-call data APIs for AI agents > Data APIs an AI agent can pay for per request with USDC on Base using the x402 protocol (v1, scheme "exact"). > No API key, no signup. YouTube transcript API, Airbnb listing scraper API, Airbnb search API. Base URL: https://agent-data-api.netlify.app Network: Base mainnet (x402 network id "base", chain id 8453) Asset: USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 decimals, EIP-712 domain name "USD Coin" version "2") payTo: 0x4F77782B5A7Be537F161631569D661F93b6e1ae6 Facilitator: https://facilitator.payai.network (verify + settle, no key needed) Request header: X-PAYMENT (base64 JSON payment payload) Response header: X-PAYMENT-RESPONSE (base64 JSON settlement receipt) ## Endpoints ### GET /api/airbnb/listing — USD 0.02 (20000 USDC atomic units) Scrape one public Airbnb room page into structured JSON: title, description, location, coordinates, rating, reviews, host, amenities, bedrooms/beds/baths, guests and photos. No browser, no login. Input: airbnb.com/rooms/ URL. Params: - url (string, required): Airbnb listing URL, e.g. https://www.airbnb.com/rooms/577971748947083358 (any airbnb.* domain; the numeric id is extracted) - currency (string, optional, default USD): ISO 4217 currency used to render the page (reserved for price fields). Default: USD. Example: curl -s "https://agent-data-api.netlify.app/api/airbnb/listing?url=https%3A%2F%2Fwww.airbnb.com%2Frooms%2F577971748947083358¤cy=USD" Output example (trimmed): {"id":"577971748947083358","url":"https://www.airbnb.com/rooms/577971748947083358","title":"Quality townhouse luxury living","description":"Relax and soak up views on waterfront balcony. You will be sharing with the Host. ...","propertyType":"Private room in townhouse","roomType":"Private room","location":"Hope Island, Queensland, Australia","city":"Hope Island","state":"Queensland","country":"Aus Errors: 400 = missing/invalid `url` (not charged); 404 = listing not found / removed (not charged); 502 = Airbnb blocked or changed the page after payment was verified (not settled, not charged) ### GET /api/airbnb/preview — USD 0 (0 USDC atomic units) Free x402 resource (price 0): a compact preview of one public Airbnb room page as JSON: title, location, rating, review count, property type and photo count. Same parser as the paid /api/airbnb/listing endpoint, which returns the full record (description, host, amenities, rooms, coordinates, photos) for USD 0.02. Input: airbnb.com/rooms/ URL. Params: - url (string, required): Airbnb listing URL, e.g. https://www.airbnb.com/rooms/577971748947083358 (any airbnb.* domain; the numeric id is extracted) Example: curl -s "https://agent-data-api.netlify.app/api/airbnb/preview?url=https%3A%2F%2Fwww.airbnb.com%2Frooms%2F577971748947083358" Output example (trimmed): {"id":"577971748947083358","url":"https://www.airbnb.com/rooms/577971748947083358","title":"Quality townhouse luxury living","propertyType":"Private room in townhouse","location":"Hope Island, Queensland, Australia","city":"Hope Island","country":"Australia","rating":4.92,"reviewsCount":52,"photosCount":13,"fullRecord":{"endpoint":"https://agent-data-api.netlify.app/api/airbnb/listing","priceUsd": Errors: 400 = missing/invalid `url`; 404 = listing not found / removed; 502 = Airbnb blocked or changed the page ### GET /api/airbnb/search — USD 0.05 (50000 USDC atomic units) Scrape the first page of any public Airbnb search URL (city, dates, guests, filters) into an array of listing cards with id, title, nightly price, currency, rating, review count and cover photo. Up to 18 results per call. Params: - url (string, required): Airbnb search URL, e.g. https://www.airbnb.com/s/Lisbon/homes (dates, guests and filters in the URL are respected) - max (integer, optional, default 18): Maximum number of results to return (1-18). Default: 18. - currency (string, optional, default USD): ISO 4217 currency for prices. Default: USD. Example: curl -s "https://agent-data-api.netlify.app/api/airbnb/search?url=https%3A%2F%2Fwww.airbnb.com%2Fs%2FLisbon%2Fhomes&max=18" Output example (trimmed): [{"id":"1390047236924985312","url":"https://www.airbnb.com/rooms/1390047236924985312","title":"Expo Flat | Free Parking | Airport | Meo Arena","pricePerNight":223.13,"priceTotal":1084.67,"nights":5,"checkIn":"2026-12-02","checkOut":"2026-12-07","currency":"USD","rating":4.92,"reviewsCount":152,"lat":38.75618,"lng":-9.0987,"bedrooms":3,"beds":3,"baths":2,"photo":"https://a0.muscache.com/im/pictures Errors: 400 = missing/invalid `url` (not charged); 502 = Airbnb blocked or changed the page after payment was verified (not settled, not charged) ## The 402 flow (x402 v1) 1. GET the endpoint with no payment. You receive HTTP 402 and a JSON body: { "x402Version": 1, "error": "X-PAYMENT header is required", "accepts": [ { "scheme": "exact", "network": "base", "maxAmountRequired": "", "resource": "", "payTo": "0x4F77782B5A7Be537F161631569D661F93b6e1ae6", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "maxTimeoutSeconds": 120, "extra": { "name": "USD Coin", "version": "2" }, "outputSchema": { "input": {...}, "output": {...} } } ] } 2. Pick the entry in accepts (there is one: exact / base / USDC). 3. Sign an EIP-3009 transferWithAuthorization (EIP-712 typed data, domain = USDC on Base) from your wallet to payTo for exactly maxAmountRequired, validBefore <= now + maxTimeoutSeconds, random 32-byte nonce. 4. Build the payment payload { "x402Version": 1, "scheme": "exact", "network": "base", "payload": { "signature": "0x...", "authorization": { "from", "to", "value", "validAfter", "validBefore", "nonce" } } }, base64-encode the JSON and send it as the X-PAYMENT header on the same GET. 5. The server verifies with the facilitator, fetches the data, settles the payment on-chain, and returns 200 with the JSON body and the X-PAYMENT-RESPONSE header. If the data fetch fails you get 4xx/502 and nothing is settled. Client libraries that do steps 2-4 automatically: npm "x402-fetch" / "x402-axios" (v1), or "@x402/fetch" (v2 clients also speak v1 with the payai facilitator). A wallet with a few cents of USDC on Base and a little ETH is NOT needed for gas: settlement gas is paid by the facilitator. ## Discovery - OpenAPI: https://agent-data-api.netlify.app/openapi.json (x-x402 fields carry the payment terms) - x402 resource list: https://agent-data-api.netlify.app/.well-known/x402 - ARD manifest: https://agent-data-api.netlify.app/.well-known/ard.json - API catalog (RFC 9727): https://agent-data-api.netlify.app/.well-known/api-catalog - PayAI Bazaar: https://facilitator.payai.network/discovery/resources?payTo=0x4F77782B5A7Be537F161631569D661F93b6e1ae6