# FlexYield > One API key, one meter, one bill for multi-chain JSON-RPC access, with automatic multi-provider failover and a public measured status page. No wallet, no crypto required. FlexYield is a unified RPC gateway: point your application at a single endpoint and every JSON-RPC 2.0 request is routed to the best healthy upstream provider, with automatic failover and per-key usage metering. Accounts are email-based, plans are card-billed, and a live dashboard shows volume, latency, and spend per API key. ## Getting started 1. Sign up (free tier included): https://flexyield.io/registration/new 2. Create an API key in the dashboard — the plaintext token is shown exactly once. 3. Relay JSON-RPC requests: curl -X POST https://flexyield.io/rpc/eth_mainnet \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber"}' ## Agent Skill Full agent instructions (keys, budgets, fleet pattern, MCP): https://flexyield.io/skill.md ## Supported chains Relay to any of these with POST https://flexyield.io/rpc/{chain}: - arbitrum_one — Arbitrum One - base_mainnet — Base Mainnet - eth_mainnet — Ethereum Mainnet - optimism_mainnet — OP Mainnet - polygon_pos — Polygon PoS - solana_mainnet — Solana Mainnet ## Data API (beyond raw RPC) Same bearer API key and metering as /rpc. Requires a paid plan (free-tier keys receive error -32010). Status: premium data upstreams are onboarding — these endpoints answer 503 until a data-capable provider is live. - GET https://flexyield.io/data/{chain}/balances/{address} — native balance (all chains); ERC-20 token balances on chains with a data-capable upstream - GET https://flexyield.io/data/{chain}/history/{address} — recent asset transfers, newest first (chains with a data-capable upstream) - GET https://flexyield.io/toolbox/gas/{chain} — EIP-1559 gas recommendations (slow/standard/fast) computed from the multi-provider pool, EVM chains, 1 unit/call, every tier; also the get_prices(kind: "gas") MCP tool. Toolbox services can be disabled per account — a disabled service answers -32012 (HTTP 403) with the enable path; an optional per-service monthly cap answers -32014 (HTTP 429) once reached. - GET https://flexyield.io/toolbox/tx/{chain}/{hash} — transaction status on any supported chain (confirmed/failed/pending/unknown; confirmations + gas on EVM, slot + commitment on Solana), 2 units/call (computed per hash); also the get_tx_status MCP tool. - GET https://flexyield.io/toolbox/ens/resolve/{name} and /toolbox/ens/reverse/{address} — on-chain ENS resolution (Ethereum mainnet), 1 unit/call; also the resolve_ens MCP tool. Reverse records are self-declared — forward-verify before trusting. - GET https://flexyield.io/toolbox/prices?symbols=eth,btc — USD prices read on-chain from Chainlink aggregator feeds (no third-party price API; symbols eth, btc, link — more on request), honest stale flags, 1 unit/call; also the get_prices(kind: "token") MCP tool. - GET https://flexyield.io/toolbox/abi/{chain}/{address} — verified contract ABI + name from Sourcify's open dataset (unverified answers verified:false with the fix path); POST /toolbox/decode/{chain}/{address} with data=0x… decodes calldata to function signature + arguments. 1 unit each; MCP tools get_abi, decode_calldata. - GET https://flexyield.io/toolbox/utils/checksum/{address} · /toolbox/utils/convert?value=&from=&to= · /toolbox/utils/selector?signature= · /toolbox/utils/keccak?text= — stateless EVM utilities (EIP-55, unit conversion, 4-byte selectors + topic0, keccak256), 1 unit each; MCP tool convert_evm. POST /toolbox/utils/verify-signature (EIP-191 personal_sign: message + signature + optional expected address) and POST /toolbox/utils/verify-siwe (EIP-4361: exact signed message + signature — signature + expiry verified, domain/nonce policy is yours), 1 unit each; MCP tool verify_signature. Recovery only — no keys held. ## x402 — pay-per-use, no signup (for agents) Machine customers can use the gateway WITHOUT an account, paying per use on-chain. GET https://flexyield.io/x402 returns the measured route menu (cheap = public supply · balanced = wholesale blend · fast = premium slice — priced from OUR OWN instruments, not a supplier's card) and the payment challenge. Settle on the stated network, then POST /x402/redeem { tx_hash, tier, signature } — the signature is an EIP-191 personal_sign by the paying wallet over "FlexYield x402 redeem\n" (proof you own the settlement; the tx hash alone is public) — to receive a one-time credential (fyx_…); call the gateway with header X-PAYMENT: until units or the window are used up. Prices are net; VAT is added by your location where it applies. TESTNET ONLY for now — real-money settlement opens after regulatory sign-off. ## How we count (weighted units) Quotas and rate windows count weighted units, not raw calls: - standard calls = 1 unit - heavy calls = 2 units — the debug_* / trace_* family, eth_simulateV1, eth_getLogs over more than 128 blocks, and state reads deeper than 128 blocks from the chain head - data API calls = 10 units - toolbox calls = 1 unit (tx status: 2 — computed per hash); served from community supply and heavily cached — deliberately the cheapest line on the meter - served from our cache = 0 units — an identical request inside the published TTL, RPC and toolbox alike; the rate window still counts it ## Caching (what we cache, for how long) Cache hits cost 0 units and carry the header X-FlexYield-Cache: hit. Quota, per-key caps and per-service caps are never consumed by a hit; rate windows count every request. Only deterministic answers, only for an identical request inside the TTL — never eth_call, eth_getLogs, balances, nonces or anything relative to "latest": - chain constants (eth_chainId, net_version): 1 week - head reads: eth_blockNumber (2 s), eth_gasPrice (2 s), getSlot (1 s) - by-hash lookups (eth_getBlockByHash, eth_getTransactionByHash, eth_getTransactionReceipt): 1 week, only once the block is 64 blocks below the head - toolbox gas oracle: 12 s - toolbox transaction status: 5 s - toolbox ens resolve: 5 min - toolbox token prices: 30 s - toolbox contract intelligence: 24 h - toolbox evm utilities: computed every call (never cached) This table is identical on EVERY tier, free included — same catalog, same weights, same parameter caps, same doorways. Upgrading changes how much you can use and which supply serves you, never how we count. ## Method catalog and parameter limits FlexYield serves an explicit catalog of JSON-RPC methods. - A method outside the catalog answers error -32601 (HTTP 404). The error carries data.contact — that is an invitation, not a wall: write to hello@flexyield.io with what you are building and we enable or tailor it, usually within a day. - eth_getLogs ranges are capped at 1,000 blocks and eth_feeHistory at 1,024 blocks; beyond that the answer is -32602 (HTTP 400). Paginate, or ask us for a tailored package. - getProgramAccounts is not served today (every upstream we measured fences it); the same doorway applies. ## Pricing - Free: free — 1,000,000 requests/month included · burst up to 100 requests per 15 minutes - Builder: $12.00/month — A steady 30 requests/second on community supply, around the clock — soft ceiling 20M units a month, then 10 req/s; no overage billing - Pro: $99.00/month — 15,000,000 requests/month included · burst up to 6,000 requests/min - Scale: $299.00/month — 60,000,000 requests/month included · burst up to 12,000 requests/min - Growth: $899.00/month — 200,000,000 requests/month included · burst up to 18,000 requests/min - Pro (yearly): $990.00/year — 15,000,000 requests/month included · burst up to 6,000 requests/min - Scale (yearly): $2,990.00/year — 60,000,000 requests/month included · burst up to 12,000 requests/min - Growth (yearly): $8,990.00/year — 200,000,000 requests/month included · burst up to 18,000 requests/min - Enterprise: custom plans with dedicated capacity — hello@flexyield.io ## The price ladder (one rule, machine-readable at https://flexyield.io/openapi.json → x-pricing) Rule: price per unit falls with commitment, never with identity — more volume committed per month → lower USD per 1M units; yearly < monthly; per call is the dearest lane, no pack ever undercuts the yearly tier, and at its included volume a subscription is the cheapest per unit. Route tiers on every door: cheap ×0.5 · balanced ×1 · fast ×2 (standard units only). USD per 1,000,000 standard units, balanced tier; "planned" = decided, not yet purchasable: - Scale (yearly): $4.15/M (subscription, premium supply) - Growth (yearly): $3.75/M (subscription, premium supply) - Pro (yearly): $5.50/M (subscription, premium supply) - Scale: $4.98/M (subscription, premium supply) - Growth: $4.50/M (subscription, premium supply) - Pack L: $6.25/M (pack, premium supply) - Pro: $6.60/M (subscription, premium supply) - Pack M: $7.14/M (pack, premium supply) - Pack S: $8.33/M (pack, premium supply) - Per call (x402) / PAYG: $9.00/M (per_call, premium supply, planned) - Builder: $0.60/M (flat, public supply) - Free: $0.00/M (free, public supply) - Anonymous key (door 1): $0.00/M (free, public supply, planned) - Founding (Pro locked 12 months; until 2026-12-05 or while seats last): $5.27/M (subscription, premium supply) An account is always at least as cheap per unit as paying per call on the same supply, and the account is where the features live: fleet keys with budgets, service fences, premium allowances, statements per key, support with evidence. Full pricing: https://flexyield.io/pricing ## MCP (for AI agents) FlexYield exposes its capabilities as an MCP server at https://flexyield.io/mcp (Streamable HTTP: POST JSON-RPC, stateless, one JSON answer per request; the legacy HTTP+SSE door at https://flexyield.io/mcp/sse closed on 2026-09-26 (announced for 2026-09-28) and answers 410 Gone with the pointer). Public tools need no authentication; account tools authenticate with your API key as a bearer token in the Authorization header. Tools: - get_key: Get a FlexYield API key with no signup: public supply, 10,000 weighted units per UTC day, 5 requests/s, every tool. Use it once, when you have no key yet; then send the key as the bearer on every other call. Not for a key you already hold (use what_can_i_do to see where it stands) and not for a human's paid plan (use list_plans). Returns JSON: key (shown once), key_prefix, door (how the key was obtained: public, wallet-bound or owner-adopted), fences (the limits) with doorways (the path past each limit), terms, skill. Creates a key; at most 3 per IP per day. No key needed. - bind_key_start: Step 1 of binding the API key you are calling with to a wallet: returns the exact SIWE (EIP-4361) message that wallet must sign. Use it when your key came from get_key and you want it to persist across sessions with 1M units/month. Not for claiming an agent you already run on another key (use claim_agent_start) and not for a key that is already bound. Returns JSON: message_to_sign, expires_in_seconds, note. Follow with bind_key_complete before the message expires. Needs your API key. - bind_key_complete: Step 2 of binding the API key you are calling with to a wallet: pass the wallet's signature over the message from bind_key_start. Use it right after bind_key_start, with the same key. Not for the first step (use bind_key_start) and not for agent claims (use claim_agent_complete). Returns JSON: bound, door (now wallet-bound), key_prefix, bound_address, fences (the limits) with doorways (the path past each), terms, skill. Idempotent for the same wallet. Needs your API key. - claim_agent_start: Step 1 of claiming an agent by its EVM address for the account you are calling with: returns the exact SIWE message the agent's wallet must sign. Use it when an account owner wants a budgeted key for an agent that proves control of a wallet. Not for binding your own key (use bind_key_start) and not for plain key creation without a wallet (use create_api_key). Returns JSON: address, message_to_sign, expires_in_seconds, note. Follow with claim_agent_complete. Needs your API key. - claim_agent_complete: Step 2 of claiming an agent: verify the wallet's signature over the message from claim_agent_start and equip the agent with its own budgeted API key (default 50000 requests/month). Use it right after claim_agent_start. Not for the first step and not for changing a budget later (use configure_key). Returns JSON: agent, address, monthly_request_cap, plaintext_token (shown once — store it), note. Creates a key. Needs your API key. - create_api_key: Create an additional API key on the account you are calling with (a name, optional monthly unit cap). Use it to give a service or a teammate its own key with its own budget. Not for your first key (use get_key, no signup) and not for a wallet-proven agent key (use claim_agent_start). Returns JSON: id, name, monthly_request_cap, prefix, plaintext_token (shown once — store it, it cannot be read again), note. Creates a key; a key obtained from get_key cannot mint further keys. Needs your API key. - configure_key: Configure one API key of your account by id: monthly_request_cap (a monthly unit budget; omitted = unchanged, 0 = remove the cap), enabled (the list of services it may use: rpc, data, gas, tx_status, ens, prices, contracts, utils) and caps ({service_key: units} per service). Use it to budget or restrict one key; key ids come from list_api_keys. Not for account-wide service settings (use configure_services) and not for revoking (use revoke_api_key). Returns JSON: id, name, monthly_request_cap, note when the budget changed; id, name, window, key_id, services when services changed. Needs your API key. - revoke_api_key: Revoke one API key of your account by id; calls with that key stop working immediately and the key cannot be restored. Use it when a key leaked or a service is retired; ids come from list_api_keys. Not for pausing a key (set its budget to a small cap with configure_key instead) and not for the key you are calling with unless you hold another. Returns JSON: id, name, revoked_at. Idempotent. Needs your API key. - list_api_keys: List the API keys of your account (scope='keys', default) or its agent fleet with wallet claims and budgets (scope='agents'). Use it to find a key id before configure_key or revoke_api_key, or to see which keys are in use. Not for usage numbers (use get_usage) and not for your own key's standing (use what_can_i_do). Returns JSON: count, keys[{id, name, prefix, status, monthly_request_cap, created_at, last_used_at, agent}] for keys; an array of {name, address, claimed_via, claimed_at, key_id, key_prefix, monthly_request_cap, services_off} for agents. Read-only. Needs your API key. - get_billing_status: Billing state of your account: tier, whether payments are live, the subscription (plan, interval, price in USD cents, status, period end, cancel-at-period-end), the card on file (brand, last4, expiry — never the number), prepaid pack balances, any founding-price reservation and the soft-landing state. Use it before buy_pack or when a call was refused for budget reasons. Not for usage numbers (use get_usage), invoices (use get_statement) or plan prices (use list_plans). Returns JSON: tier, payments_live, billing_customer, subscription, payment_method, founding_reservation, packs, soft_landing. Read-only; plan changes happen in the web console. Needs your API key. - configure_services: Read or change the account-wide service settings: which gateway services (rpc, data, gas, tx_status, ens, prices, contracts, utils) are enabled and an optional monthly unit cap per service. Use it with no arguments to read; pass enabled and/or caps to change. Not for one key's budget or services (use configure_key). Returns JSON: window, key_id, services[{service, enabled, cap, used}]. A capped service answers error -32014 once month-to-date units reach the cap; a disabled one answers -32012. Needs your API key. - update_account: Update your account's preferences: notifications (notify_incidents, time_zone) and/or the insights that tailor the service (use_case, team_size, volume, region, previous_provider, referral_source, chains, wish_chains, wish_chain_other). Use it when the owner's preferences change; only the fields you pass change. Not for keys (use configure_key), services (use configure_services) or billing (web console). Returns JSON: notify_usage_80, notify_usage_100, notify_incidents, time_zone after a notification change; insights after an insights change. Needs your API key. - join_enterprise_wishlist: Send FlexYield an enterprise wishlist: what would need to be true for you to run on FlexYield (chains, SLAs, compliance, features, prices; max 1000 chars) plus a contact email; the founders reply by email. Use it when the public plans do not fit and a human wants to talk. Not for bugs or account questions (use manage_tickets) and not for product ideas from a signed-in account (use manage_feedback). Returns JSON: sent, contact. Creates a record and a mail. No key needed. - join_waitlist: Join the FlexYield early-access waitlist with an email and a qualifier (developer, investor or curious). Use it only when a human asked to be kept informed; an agent that needs access now should call get_key instead. Not for support (use manage_tickets) or enterprise needs (use join_enterprise_wishlist). Returns JSON: joined, already_on_list. Creates a waitlist entry. No key needed. - list_plans: List FlexYield's public plans: price in integer USD cents, billing interval, monthly included units and burst rate limits, plus the enterprise line and the signup URL. Use it to compare plans or before telling an owner what an upgrade costs. Not for what a single call costs (use get_quote), your own tier or balances (use get_billing_status) or the break-even at your volume (use what_can_i_do). Returns JSON: plans[{key, name, price_cents, interval, included_units, rate_limit, …}], enterprise, signup_url. Read-only. No key needed. - get_usage: Your account's usage in one of three views. view='report': requests, weighted units, errors and latency per key, method and chain over a look-back window (hours, default 24; optional chain). view='stats': one console report — report='latency' | 'errors' | 'spend' | 'cache' — for a window ('24h', '7d', '30d'). view='volume': request counts over time (optional chain). Use it to answer 'how much did we use, where, and how fast'. Not for invoices (use get_statement), balances (use get_billing_status) or one key's settings (use list_api_keys). Returns JSON: report → since, total_requests, weighted_units, by_class, cache_hits, success_rate, p50/p95_duration_ms, by_key, by_method, by_chain; stats → window, buckets, series, summary and report-specific totals; volume → window, bucket_seconds, buckets. Read-only. Needs your API key. - get_statement: Your account's statement for one billing period (default: the current one): invoice facts plus usage grouped by API key or agent, chain and method class — requests, weighted units, cache hits, refusals; period='list' enumerates the periods available. Use it for month-end reconciliation or to show an owner what a period cost. Not for live usage (use get_usage) or the card and subscription (use get_billing_status). Returns JSON: account, period, scope, plan, invoices, totals, at_the_limit, keys, generated_at; for 'list' → scope, periods. An agent's own key sees only that agent's usage; periods follow the subscription cycle or calendar months. Read-only. Needs your API key. - manage_tickets: Your support tickets with FlexYield. action='create' (subject, message, optional request_id of the failing call, optional category) opens a ticket with the call's evidence attached; action='list' (optional status); action='get' (reference); action='reply' (reference, message, optional resolve/reopen). Use it when a call was refused or failed and the doorway said to file it, or to follow up. Not for reading what an error code means (use explain_error first) and not for product ideas (use manage_feedback). Returns JSON: create/reply → reference, subject, status, category, priority, channel, created_at, last_activity_at, url; list → tickets; get → the same plus messages, evidence, suggested_paths. Needs your API key. - manage_feedback: Product feedback to FlexYield. action='submit' (kind: 'feature' | 'chain' | 'praise' | 'complaint' | 'other', title, optional body, optional chain) files it and we answer on the feedback page; action='list' (optional status) shows what you filed and our replies. Use it for ideas, a chain you want added, or praise and complaints that need no fix on your account. Not for a failing call or a refusal (use manage_tickets, it carries the evidence) and not for enterprise terms (use join_enterprise_wishlist). Returns JSON: submit → id, kind, title, chain, status, reply, created_at; list → feedback. Needs your API key. - get_balances: Native balance and ERC-20 token balances of an address on one chain (eth_mainnet, base_mainnet, arbitrum_one, optimism_mainnet, polygon_pos, solana_mainnet; tokens where a data-capable upstream exists). Use it for a portfolio or a pre-flight funds check. Not for transfer history (use get_history) and not for a raw eth_getBalance you want to shape yourself (use rpc_call). Returns JSON: chain, address, native, tokens, tokens_note. Read-only; costs 10 weighted units, metered on your key. Needs your API key. - get_history: Recent asset transfers (sent and received, newest first) of an address on one EVM chain with a data-capable upstream. Use it to answer 'what moved in or out of this address lately'. Not for current balances (use get_balances), one transaction's state (use get_tx_status) or Solana. Returns JSON: chain, address, transfers[]. Read-only; costs 10 weighted units, metered on your key. Needs your API key. - get_prices: Prices. kind='gas' (chain): EIP-1559 gas recommendations (slow/standard/fast) computed from our pool on an EVM chain, 1 weighted unit. kind='token' (symbols, comma-separated e.g. 'ETH,USDC'): current token prices in USD. Use it before sending a transaction (gas) or to value a balance (token). Not for what a FlexYield call costs in units (use get_quote) and not for plan prices (use list_plans). Returns JSON: gas → chain, base_fee_per_gas, recommendations, computed_from, computed_at, unit_weight; token → prices, quote, source, checked_at. Read-only. Needs your API key. - get_tx_status: Status of one transaction hash on any supported chain: confirmed, failed, pending or unknown, with confirmations and gas on EVM chains or slot and commitment on Solana. Use it to poll a transaction you sent or were told about. Not for an address's transfers (use get_history) and not for decoding what the transaction did (use decode_calldata). Returns JSON: chain, hash, status, checked_at, unit_weight, plus block_number, confirmations, gas_used, effective_gas_price_wei (EVM) or slot, confirmation_status (Solana). Read-only; metered on your key. Needs your API key. - resolve_ens: ENS resolution on Ethereum mainnet: pass a name ('vitalik.eth') to get its address, or an address (0x…) to get its reverse-record name, read on-chain through our pool. Use it whenever a user gives you a .eth name instead of an address. Not for other name systems and not for balances (use get_balances with the resolved address). Returns JSON: forward → name, address, resolved, checked_at; reverse → address, name, resolved, note, checked_at. Reverse records are self-declared — forward-resolve the name before trusting it. Read-only. Needs your API key. - get_abi: The verified ABI of a contract (with its name and match level) from Sourcify's open dataset on eth_mainnet, base_mainnet, arbitrum_one, optimism_mainnet or polygon_pos. Use it before calling or decoding a contract you do not have the ABI for. Not for decoding a specific calldata blob (use decode_calldata, it fetches the ABI itself) and not for a function selector (use convert_evm). Returns JSON: chain, address, verified, name, match, abi, source; an unverified contract returns verified=false with a note on how to verify it. Read-only. Needs your API key. - decode_calldata: Decode a transaction's calldata against the target contract's verified ABI (Sourcify): the function signature, its selector and the argument values (static types decoded; dynamic types shown raw and labelled). Use it to explain what a pending or past transaction does. Not for the whole ABI (use get_abi), a transaction's status (use get_tx_status) or computing a selector from a signature (use convert_evm). Returns JSON: chain, address, function, selector, args, source. Read-only. Needs your API key. - convert_evm: Offline EVM utilities, no chain call: op='checksum' (EIP-55 checksum and validity of input=address), op='convert' (unit conversion wei…gwei…eth: input=value, from=unit, to=unit), op='selector' (4-byte selector and topic0 of input=function signature) and op='keccak' (keccak256 of input text). Use it for address hygiene and unit maths before an rpc_call. Not for verifying a signature (use verify_signature) or decoding calldata (use decode_calldata). Returns JSON: checksum → valid_address, checksummed; convert → value, from, to, result; selector → signature, selector, topic0; keccak → input, keccak256. Read-only, deterministic. Needs your API key. - verify_signature: Verify a signature offline: mode='personal' checks an EIP-191 personal_sign signature (message, 65-byte 0x signature, optional expected address); mode='siwe' checks a SIWE / EIP-4361 message (the exact signed text plus signature — parses the fields, checks signature and expiry; domain and nonce policy stay with you). Use it to authenticate a wallet-holder or validate a login message. Not for binding or claiming keys on FlexYield (use bind_key_complete / claim_agent_complete, they verify themselves) and not for hashing (use convert_evm). Returns JSON: personal → recovered_address, valid, expected_address; siwe → valid, recovered_address, expired, fields, note. Recovery only — FlexYield never holds keys. Read-only. Needs your API key. - what_can_i_do: The status overview of the API key you are calling with: its door (how it was obtained: public via get_key, wallet-bound, or adopted by a paying owner), its tier, the budgets left (month, day, prepaid packs), the fences (its limits) each with a doorway (the path past that limit: bind, adopt, buy a pack, or a ticket), your last-30-day volume priced on every lane (a lane = a price tier: cheap, balanced, fast), the break-even sentence (the volume at which a paid plan beats pay-per-call, for your owner), the account features and the other doors. Use it first in a session, and whenever a call was refused, to decide what to do next. Not for detailed usage (use get_usage), billing facts (use get_billing_status) or a single call's price (use get_quote). Returns JSON: you, budgets, fences_as_doorways, volume_30d_units, ladder_at_your_volume, break_even, recommendation, active_advice, account_features, doors, pricing. Read-only; no parameters. Needs your API key. - get_quote: Quote one JSON-RPC call before making it: the weighted units it costs (standard 1, heavy 2, or not offered) and the USD per 1M units on every lane (a lane = a price tier: cheap, balanced, fast). Use it when an owner asks what a workload would cost or before a heavy method. Not for gas or token prices (use get_prices), plan prices (use list_plans) or your own balances (use get_billing_status). Returns JSON: chain, method, offered, units, tier, multiplier, lanes, note; a method we do not offer returns offered=false with a reason. Read-only. No key needed. - explain_error: Explain a FlexYield error code (e.g. -32007): what it means, the steps to take and its doorway (the path past the limit that caused it). Use it whenever a call returned an error with a code you do not know, before retrying or filing a ticket. Not for upstream chain errors that are not ours and not for filing the problem (use manage_tickets with the request_id). Returns JSON: code, http, title, meaning, steps, doorway, decoder; an unknown code returns known=false with a hint. Read-only. No key needed. - recommend: A recommendation from our live measurements. what='chain': which chain fits a task (optional family, candidates, prefer), ranked from our probes and method rules. what='route': which lane (price tier: cheap, balanced, fast) to use for one call (chain, method, optional need). Use it when you can choose the chain or the lane and want the measured answer. Not for the price itself (use get_quote), current gas (use get_prices) or making the call (use rpc_call). Returns JSON: chain → pick, reason, ranked, measured_at, note; route → chain, method, offered, units, weight_class, pick, reason, tiers, note. Read-only. No key needed. - migrate: A compatibility report for switching your RPC provider to FlexYield: paste your current config as text (endpoint URLs, env lines, code) and get every endpoint mapped to our chain URL, every JSON-RPC method you name with its unit weight and limits, and the list of what changes (auth header, units instead of compute units, no overage, refusals as doorways, measured status). Use it before you swap URLs. Not for pricing your volume (use get_quote or what_can_i_do) or for making calls (use rpc_call). Keys in the pasted text are masked and nothing is stored. Returns JSON: ready, summary, endpoints (source, chain, served, replacement, key_in_url, note), methods (name, weight, offered, note), changes (what, before, after), next_steps. Read-only. No key needed. - buy_pack: Start the purchase of a prepaid unit pack (size 's': 1.2M units $10, 'm': 7M $50, 'l': 32M $200, +5 % units when bought here) and get a checkout URL the account owner completes on a card; units become available when the payment lands, are consumed after the plan's monthly quota and stay valid 12 months. Use it when what_can_i_do or a refusal says the monthly budget is running out. Not for changing the plan (web console) and not for reading balances (use get_billing_status). Returns JSON: checkout_url, size, units, bonus_units, total_units, price_usd, note. Creates a checkout; no money moves until a human pays. Needs your API key. - rpc_call: Send one JSON-RPC call through the FlexYield gateway — the same routing, failover, cache and meter as POST /rpc/{chain}. chain: 'eth_mainnet' | 'base_mainnet' | 'arbitrum_one' | 'optimism_mainnet' | 'polygon_pos' | 'solana_mainnet'; method e.g. 'eth_blockNumber'; params as the method expects. Use it for any read the shaped tools do not cover (blocks, logs, eth_call, storage) and for sending signed transactions. Not for balances, transfers or transaction status when a shaped tool exists (use get_balances, get_history, get_tx_status — one call, decoded) and not for pricing a call first (use get_quote). Returns JSON: the raw JSON-RPC body — jsonrpc, id, result — or jsonrpc, id, error with our request_id and the doorway in error.data when refused. Metered on your key (standard 1 unit, heavy 2; cache hits 0). Needs your API key. Resources: - flexyield://plans: FlexYield subscription plans: prices in integer USD cents, billing interval, and rate limits. - flexyield://getting-started: How to go from zero to a relayed JSON-RPC request on FlexYield. - flexyield://reliability: Measured per-chain gateway reliability: uptime over 24h/7d/30d windows and latency percentiles (last 24h), from synthetic probes every 5 minutes. ## Pages - Home: https://flexyield.io/ - Docs (API reference): https://flexyield.io/docs - Integration guides (viem, ethers, web3.py, Solana web3.js, LangChain, CrewAI, OpenAI Agents SDK, MCP): https://flexyield.io/docs/guides - Methods and limits (per-method weight, cache class, limit, doorway): https://flexyield.io/docs/methods - Error decoder (every gateway error code, meaning, what to do, exact body): https://flexyield.io/docs/errors - Chain pages (measured uptime/latency, methods per dialect): https://flexyield.io/chains - Pricing: https://flexyield.io/pricing - Status (measured per-chain uptime and latency): https://flexyield.io/status - Sign up: https://flexyield.io/registration/new --- --- name: flexyield-gateway description: > Use FlexYield as your blockchain access layer: one API key per agent with a monthly budget, JSON-RPC for 6 chains, a toolbox of higher-level tools (gas, ENS, prices, tx status), free response caching, and full account control over MCP. Card-billed by the key owner — no wallet needed. license: Proprietary — see https://flexyield.io/terms --- # FlexYield Gateway — Agent Skill FlexYield is a unified access layer for blockchain infrastructure. You (an agent) get a key, a budget, and measured routing; the human who runs you gets one dashboard and one invoice. ## Three doors — nothing logs in | Door | How | You get | |---|---|---| | 1 anonymous | `POST https://flexyield.io/keys` (no body) or MCP `get_key` | a capability key at once: public supply, 10,000 weighted units per UTC day, 5 req/s, every tool; 3 keys per IP address per day | | 2 bound | `POST /keys/bind/start {address}` → sign the SIWE message with your wallet → `POST /keys/bind {address, signature}` (MCP: `bind_key_start`, `bind_key_complete`) | the same key, persistent across sessions, 1M units/month; one key per wallet | | 3a pay per call | x402: `GET /x402` for the menu, settle, `POST /x402/redeem {tx_hash, tier, signature}` (signature = EIP-191 personal_sign by the paying wallet over the message the menu states), send the returned one-time credential as `X-PAYMENT` | premium units without an account (testnet rehearsal until mainnet) | | 3b adopted | show your owner the `claim_code` from the welcome; they paste it at /agents | the owner's plan: premium supply, fast, packs, fleet budgets, statements, support with evidence | Every refusal on a door key is a doorway with the next door in the body (`-32016` = daily units used up). ## Authentication Every call authenticates with an API key in the Authorization header: Authorization: Bearer fy_... A key comes through any of the three doors above — no human needed. A human can also create an account and keys at https://flexyield.io (free tier, no card required); an adopted door key inherits that account. Everything else is done by agents over MCP. ## JSON-RPC relay POST https://flexyield.io/rpc/{chain} Content-Type: application/json {"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]} Chains: - `arbitrum_one` - `base_mainnet` - `eth_mainnet` - `optimism_mainnet` - `polygon_pos` - `solana_mainnet` Weighted metering: standard calls count 1 unit, heavy calls (traces, wide getLogs) 2, data-API calls 10, toolbox calls 1 (tx status 2). **Cache hits count 0** — repeated identical reads inside the freshness window are free. Details: https://flexyield.io/docs#caching ## Toolbox (higher-level tools, one call instead of many) POST https://flexyield.io/toolbox/{service} Services: gas (fee oracle), ens (resolve), prices (token prices), tx (status/decode), abi (contract ABI), utils (EVM helpers). Same key, same meter. Reference: https://flexyield.io/toolbox ## MCP — full account control for agents https://flexyield.io/mcp (Streamable HTTP, POST JSON-RPC; Authorization: Bearer ) The legacy HTTP+SSE door (/mcp/sse, /mcp/messages) closed on 2026-09-26 (announced for 2026-09-28); it answers 410 Gone with this pointer. Tools (35, verb-first, one job each): keys — `create_api_key(name, monthly_request_cap?)` · `configure_key(id, monthly_request_cap?, enabled[]?, caps{}?)` — budget and the services one key may use, with per-service unit caps (a fenced service answers -32012 with `blocked_by: key`, a capped one -32014 with `scope: key`; a key is never wider than its account) · `revoke_api_key(api_key_id)` · `list_api_keys(scope: keys|agents)`. Account — `get_billing_status` · `configure_services(enabled?, caps?)` (no arguments = read) · `update_account(notify_incidents?, time_zone?, use_case?, …)` · `list_plans`. Usage — `get_usage(view: report|stats|volume, …)` per key, per report, over time · `get_statement(period?)` (`period: "list"` lists the periods). Support — `manage_tickets(action: create|list|get|reply, …)` · `manage_feedback(action: submit|list, …)`. The relay itself — `rpc_call(chain, method, params?)`: one JSON-RPC call through the same routing, cache and meter as `POST /rpc/{chain}`. Data and toolbox — `get_balances`, `get_history`, `get_prices(kind: gas|token)`, `get_tx_status`, `resolve_ens`, `get_abi`, `decode_calldata`, `convert_evm`, `verify_signature`. Same meter, same fences on both doors: MCP data tools burn the same units and answer the same doorways as their HTTP twins (-32005 rate, -32006 budget, -32007 quota, -32014 service cap); management tools are rate-limited only. **The agent menu, no key needed:** `get_key` · `bind_key_start` / `bind_key_complete` · `what_can_i_do` (your door, budgets, fences as doorways, the ladder priced at your own volume, the break-even sentence) · `get_quote(chain, method, tier?)` · `explain_error(code)` · `recommend(what: chain|route, …)` — recommendations from our probes, never|route, …)` — recommendations from our probes, never hearsay · `migrate(config)` — paste your current provider config, get every endpoint mapped and every method weighed, keys masked, nothing stored · `buy_pack` inside an adopted account. The pre-v2 names (usage_report, quote, pick_chain, set_key_budget, …) went with the legacy door on 2026-09-26 (announced for 2026-09-28); the 35 names above, on POST /mcp, are the tool set. ## The fleet pattern (one owner, many agents) **Already have an agent? Claim it.** An existing agent (any EVM wallet identity) joins the fleet by proving ownership: `claim_agent_start(name, address)` returns a standard sign-in message (EIP-4361); the agent's wallet signs it; `claim_agent_complete(address, signature)` verifies and equips a budgeted key (default 50000 requests/month) — shown once. `list_api_keys(scope: "agents")` shows the fleet. Humans do the same on https://flexyield.io/agents with one "Sign with wallet" click (the message is issued for the site you are on, so the wallet shows no domain warning; no transaction, no gas). 1. The owner creates the account and one owner key. 2. For each agent, mint a key with a budget: `create_api_key(name: "agent-7", monthly_request_cap: 50000)`. 3. Each agent uses only its own key. Budgets are enforced per key on the hot path; an over-budget key gets a clear refusal with an upgrade doorway, and every other key keeps working. 4. `get_usage(view: "report")` shows spend per key; `configure_key` adjusts the budget and fences a key to e.g. gas + prices only (the robot may reach the charger, not the bank); `revoke_api_key` kills a leaked or retired key instantly. Worked example: https://flexyield.io/docs · demo script in the repo (`bin/demo/fleet_keys.rb`). ## Fair-use & doorways Rate and plan limits answer with structured errors that say what to do next — never a bare 429. If you need more than the fences allow, the response tells you (or your human) exactly where the doorway is. A transaction submission (`eth_sendRawTransaction`, `sendTransaction`) is posted to exactly one endpoint and never re-sent by us: a failure after it left answers `-32017 unknown outcome` — look the hash up before re-signing (`explain_error(-32017)`). ## When a call fails: file it, with the request_id Every error body — HTTP and MCP — carries `data.request_id` and `data.support` (`/support/new?request_id=…`); the `X-Request-Id` header on every answer, success included, is the same id — quote it when a 200 was slow or wrong. Over MCP: `manage_tickets(action: "create", subject, message, request_id)` opens a ticket for the account; we attach that exact call, the last 24 h of refusals, the key's caps and the chain status, plus the steps that usually fix it. `manage_tickets(action: "get", reference)` shows the thread and the suggested path; `manage_tickets(action: "reply", reference, message, resolve: true)` closes the loop when it is fixed. The same symptom within an hour joins the open ticket instead of opening a new one. Wishes and chain requests: `manage_feedback(action: "submit", kind, title, chain?)` — private to the account, answered on the item (`action: "list"`). ## Your statement, without a dashboard `get_statement(period: "list")` → the account's billing periods (its own subscription cycle, or calendar months); `get_statement(period?)` → invoice facts plus usage grouped by key and agent, by chain and method class: requests, weighted units, cache hits (free), refusals. **A key that belongs to an agent gets that agent's usage only** — every agent can read its own bill. Same over HTTP with the bearer key: `GET https://flexyield.io/api/statements/` (JSON) or `.csv`. ## Three intentions — which lane is yours - **Try it:** a door-1 key (10,000 units/day), a wallet-bound key (1,000,000/month) or a Free account — public supply, no card. - **Run production:** Pro / Scale / Growth — premium supply, measured failover, packs, a soft landing at the limit; your owner adopts your key by claim code. - **Govern a fleet:** Enterprise, or any plan with fleet keys — a budget per agent, service fences, statements per key, a premium allowance on request. ## Paying for it — the ladder, in your numbers One rule: price per unit falls with commitment, never with identity. Per call (x402, testnet rehearsal today) is the uncommitted lane; packs are cheaper per unit; a subscription is cheaper still and carries the features an owner wants: fleet keys with budgets, service fences, a premium allowance on request, statements per key, support that arrives with the failing call. Route tiers on every door: cheap ×0.5 · balanced ×1 · fast ×2 on standard units. Every price is net; VAT is added where it applies — at checkout for cards, in the x402 menu by your location for per call. - Pro (yearly): $5.50 per 1M standard units - Pro: $6.60 per 1M standard units - Pack M: $7.14 per 1M standard units - Per call (x402) / PAYG: $9.00 per 1M standard units (planned) - Builder: $0.60 per 1M standard units - Free: $0.00 per 1M standard units Break-even you can relay to your owner: every pack is cheaper per unit than per call when its units are used within the year (leftover units stay valid 12 months; below a twelfth of the pack per month, per call is cheaper); Pro yearly beats per call above ~9.2M units/month and is the cheapest committed lane up to its quota. The full table with your own volume priced on every lane is the `what_can_i_do` tool; the same numbers sit in https://flexyield.io/openapi.json → x-pricing. ## Status & trust - Live measured status: https://flexyield.io/status (public, per chain) - Terms: https://flexyield.io/terms · Privacy: https://flexyield.io/privacy - Machine summary of the whole site: https://flexyield.io/llms.txt - Third parties: FlexTrust is mentioned for information only. FlexYield does not endorse FlexTrust and accepts no liability for its service; FlexTrust's own terms apply to it.