Read skills
How to read Keeta. The dashboard is free. Each paid call is 0.01 USDC. Sending, bridging, banks, cards, and identity stay on Keeta's own skill pack. Do not send KeeSpecs a seed.
Check x402 health
x402 healthWhether the Keeta x402 facilitator answers right now. If it is down, paid reads cannot settle. Free.
/skills/read-x402-health.mdWhen to use
Call this before a paid read. If facilitator.up is false, stop. Paid reads return 402 but cannot settle. Free reads still work. This is not a payment and not a forecast.
Request
GET /api/x402-health. No query and no payment. A missing payment does not return 402.
Fields
- facilitator.up is true only when the facilitator returns 2xx and the body lists keeta:21378.
- facilitator.httpStatus is the HTTP status, or null when the call did not finish.
- facilitator.error is HTTP 526, timeout, or another short reason. It is null when up is true.
- facilitator.checkedAt is when this result was taken. facilitator.latencyMs is how long that check took. The result is reused for about a minute.
- facilitator.url is the /supported address that was called.
- Facilitator: {facilitator}
- A 402 from a paid read may include x-keespecs-facilitator: down. That means the same thing as up false.
- This is not a settlement, not a quote, and not a promise the facilitator will stay up.
KeeSpecs
IndexChoose which KeeSpecs read to buy. Username, the KTA price, and simple lookups are free. Most other reads are 0.01 USDC, and free with limits while payments cannot settle. Stablecoin FX is 0.01 USDC. Desk, Network, and Convert Check are 0.02 USDC. Sending, bridging, banks, cards, and identity are at https://keeta.ai/llms.txt.
/skills/keespecs.mdWhich skill
- Whether paid reads can settle: read-x402-health. Free. If the facilitator is down, do not pay. Free reads still work.
- A keeta.xyz username, or the address that holds it: resolve-username. Free. Send only if verified is true. The name is not an on-chain proof.
- Whether the ledger, settlement, and the price sources are pass, fail, or unknown: read-status. 0.01 USDC. Free while payments are down (rate-limited). There is no score.
- Transactions per second or blocks per second alone: read-throughput. Do not quote lifetimeTps as the live rate.
- Settlement time, median and 95th: also read-throughput. It is a different call from the live rate.
- Base pool tape, whether the score is withheld, and whether Keeta itself is quiet: read-regime. The score is not a forecast.
- One token, or every token on an address: read-balance.
- Head, height, representative, and the published name: read-account.
- Events that touched an address, or only blocks it published: read-history.
- One block, when you already have the hash: read-block.
- Name, decimals, and supply for one token, or KTA, USDC, EURC, and cbBTC together: read-token.
- A ticker to the addresses that use it: search-tokens. Free. Official addresses come first.
- Whether a ticker or address is the official token, and which other tokens copy the code: read-token-check. 0.01 USDC. Free while payments are down (rate-limited). Not an audit. Stop if the address is not the official one.
- The moments the price sources crossed 1%, or agreed again: read-prices. GET /api/price-crossings. 0.01 USDC. Free while payments are down (rate-limited). Empty means no crossing since the baseline. moved may be keeta-fx.
- Which community token was sent most, or which official stablecoin moved: read-movers. largest is the five biggest amounts on that same page, in token units, not dollars. If covers12h is false, do not call it a 12-hour rank.
- AlpacaDEX 24-hour volume, price, and market cap in KTA: read-alpaca. Not 12 hours and not dollars.
- Every named token and its supply: read-directory. Not a price.
- Whether the Base anchor or the Bivo anchor moved: read-anchors. An empty list is not an outage.
- Who the resolver lists as an anchor, and what they connect: read-providers. Not a quote. A missing movement is not an outage.
- Which rail to use for a payout: read-corridors, the choose call. It returns one local rail and why the others were set aside. Not a quote.
- Whether a token can move from one chain to another: check-bridge-route. 0.01 USDC. Free while payments are down (rate-limited). It checks LayerZero, Bridge.xyz, and Keeta's Base bridge. canMove false means stop. It is not a quote and it does not start a bridge.
- How far a $K or $KB stablecoin is from 1:1: read-stablecoin-fx. 0.01 USDC. Free while payments are down (rate-limited). Not a quote. USDC and EURC are not on this anchor.
- Whether to convert or bridge right now: read-convert-check. 0.02 USDC. While payments are down, a bridge check returns the last paid answer marked stale:true with its asOf, for up to 10 minutes, then 503. A conversion still answers 503. no-go means stop. Not a quote or a guarantee.
- What changed since a date, for rails, fees, the KTA price, or the live rate: read-corridors, the changes call. An empty list is a quiet baseline, not an outage.
- Where money can move between Keeta and a bank or card, and the published fee: read-corridors. Not a quote and not an FX rate. verification.designator copied means the fee was copied from the publisher. The signature is not checked.
- Which apps are in the KeeSpecs registry, and which Keeta products are named: read-ecosystem. Not a ranking.
- Who may act on an account: read-permissions. This does not change permissions.
- Who holds voting weight: read-representatives.
- Network id and token addresses: mainnet-constants. That skill is free.
- Keeta storage limits, in bytes: read-storage-quotas. 0.01 USDC. Free while payments are down (rate-limited). 10 MiB per object, 100 MiB per user. live is false when an older copy is reused.
- Keeta settlement time: read-bridge-speed. 0.01 USDC. Free while payments are down (rate-limited). The timed figure is an internal hop inside one vote staple, not full settlement, so score stays null and label stays unknown. Not a guarantee of future transfer times. Measured on Keeta only. Does not include time spent on the Corridor chain.
- Whether an account can store on Keeta right now: persist-check. 0.02 USDC. It is not free while payments are down: that call returns 503. A bad address returns 400 and is not charged. ready never includes reasons.
How a call is bought
- GET the URL with its required query and no payment header. The response is 402, with a PAYMENT-REQUIRED header for that exact URL.
- Check GET /api/x402-health first. If facilitator.up is false and freeTier.active is true, call Group B without PAYMENT-SIGNATURE. While payments are down, Desk, Network and bridge checks return the last paid answer marked stale:true with its asOf, for up to 10 minutes; after that 503 with Retry-After. Check stale and asOf before acting. A conversion still answers 503. Simple lookups stay free.
- One source is 0.01 USDC, amount 10000. Stablecoin FX is 0.01 USDC, amount 10000. Desk, Network, and Convert Check are 0.02 USDC, amount 20000. Asset keeta_amnkge74xitii5dsobstldatv3irmyimujfjotftx7plaaaseam4bntb7wnna. Network keeta:21378. Pay to keeta_aabz6zxbs2n4r7iiobclndobrnowxdf4pjrb5lwe6bvpeo564bot6krjbrsbbvy. Scheme exact.
- Sign with {skill}. Do not publish that send yourself. The facilitator at {facilitator} settles it and pays the network fee.
- Retry the same URL and the same query with a PAYMENT-SIGNATURE header. JSON is returned only after settlement.
- A missing or malformed query returns 400 and is not charged.
Do not
- Do not send a seed or a private key.
- Do not use a read as a way to send, bridge, pay a card, or pass KYC.
Resolve a Keeta username
UsernameResolve a Keeta username (keeta.xyz) to its account address, or an address to its username. Signed, with an upstream hash and a ledger check. Free.
/skills/resolve-username.mdBuy
- GET /api/username?name={name}. Names are 2–24 characters of a-z, 0-9, and _. A leading @ and a trailing $keeta.xyz are removed. Uppercase is lowercased.
- GET /api/username?account={keeta_address} for the reverse. Free.
- GET /api/username?name={name}&account={keeta_address} checks both directions. match is true only when they agree. Free, and limited like other free reads. Do not cache it for more than 60 seconds.
- A missing or invalid name returns 400 and is not charged. A name that is not claimed returns 200 with found false.
Before you pay someone by username
- Send only if verified is true. found false means nobody holds the name.
- Show the account address, not just the name. Names can be released and claimed again.
- onchain_proof is null. The keeta.xyz service attests the name, not the ledger.
- keespecs_signature is Ed25519 over the canonical envelope. It is not a Keeta SignData signature. The public key is at /.well-known/keespecs-keys.json. POST the response to /api/verify. That check is free.
- info_name on the ledger is whatever the account published. It is often not the username.
Read the status
StatusThree checks for this minute: the ledger, settlement's slow tail, and the price sources. Pass, fail, or unknown. No score. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-status.mdBuy
- GET /api/status. No query. 0.01 USDC. Free while payments are down (rate-limited).
Use it
- lines has three ids: ledger, settlement, and prices. state is pass, fail, or unknown.
- There is no total and no score. Do not average the lines or invent one.
- unknown means that check could not be read. Do not treat it as pass or fail.
- ledger pass means transactions were seen in the last minute. fail means a full minute had none. value is the transaction count.
- settlement needs at least 3 representatives with 100 samples in a 15-minute window. pass means the median of their p95 values is 5000 ms or less, or one window is slow. fail means two slow windows in a row, at least 5 minutes apart. Fewer than 3 is unknown, not a failure. value is that median p95, in milliseconds.
- prices pass means at least two of base-pool, keeta-pricing and coingecko answered, and each is within 1% of their median. The FX quote is not part of that check. value is the mark spread in percent. A miss is unknown, not a disagreement.
- Stop when a line you need is fail or unknown. The live numbers remain on Network and the price check.
Check the KTA price
Price checkCompare the deepest Base pool, Keeta's pricing anchor, and CoinGecko. The FX anchor is shown as the tradable quote and is not part of agree. 0.01 USDC per call. Free while payments are down (rate-limited).
/skills/read-prices.mdBuy
- GET /api/prices. No query. 0.01 USDC. Free while payments are down (rate-limited). The same numbers are free on the dashboard.
- The single pool price remains free at /api/price.
Use it
- sources still lists base-pool, keeta-pricing, coingecko, and keeta-fx. The three marks have kind mark and inAgree true. keeta-fx has kind quote and inAgree false. A leg with ok false did not answer. Do not invent its price. detail is an HTTP code or timeout, not a dollar amount. A detail that says 429 is a rate limit.
- agree compares only base-pool, keeta-pricing and coingecko against their median. It is true when at least two answered and each is within 1% of that median. agreeCount is how many of those marks are inside the band. outliers names the ok marks outside it. medianUsd is null when fewer than two marks answered.
- devPct is how far a mark sits from the median, in percent, to 3 decimal places. withinBand is true when that distance is 1 or less. gapPct and spreadPct use only the marks: the high against the low.
- tradable is the keeta-fx quote. spreadVsMedianPct is how far that quote sits under the median, in percent, to 3 decimal places. It is not a mark. If the anchor fails, tradable is ok false and error.
- base-pool is the deepest Base pool by liquidity. If publisher is geckoterminal, DexScreener failed and the fallback is the same Base contract, not a second market.
- keeta-pricing is an estimate of 1 KTA in Keeta USDC from the pricing anchor named in the service list. provider is that anchor's host. amountOutBase is the integer. It is not a fill. Keeta USDC is treated as $1. The ledger does not store a dollar price.
- keeta-fx is also copied into sources for older clients. The same quote is tradable. boundBase is the worst amount that anchor would give, and boundUsd is that integer scaled by 6 decimals. Not a fill. It is not part of agree.
- coingecko is the broader market price for the id keeta.
- If stale is true, the copy is old and agree is false. Do not treat it as fresh.
- GET /api/price-crossings for the times agreement flipped. 0.01 USDC. Free while payments are down (rate-limited). A row is a crossing, not a sample. moved is the source whose price changed the most, and it may be keeta-fx. An empty list means none since baselineAt.
Read a joined call
Desk, Network, Convert CheckBuy Desk, Network, or Convert Check when one answer needs more than one source. 0.02 USDC. Desk is the market. Network is the live rate and settlement time. Convert Check is go, caution, or no-go.
/skills/read-joins.mdBuy
- GET /api/desk. No query. 0.02 USDC. It replaces price, supply, movers, and alpaca.
- GET /api/network. No query. 0.02 USDC. It replaces pulse and settlement.
- Convert: GET /api/convert-check?kind=convert&from={from}&to={to}&amount={amount}
- Bridge: GET /api/convert-check?kind=bridge&token={token}&toChain={toChain}&amount={amount}. 0.02 USDC. kind is convert or bridge. A parameter from the other kind returns 400 and is not charged.
- Pay the amount in the 402 for that URL. A 0.01 payment does not buy a joined read.
- The price call is free. Supply is free. Stablecoin FX is 0.01 USDC. Movers and Alpaca are free while payments are down when only one of those is needed.
- While payments are down, Desk, Network and bridge checks return the last paid answer marked stale:true with its asOf, for up to 10 minutes; after that 503 with Retry-After. Check stale and asOf before acting. A conversion (kind=convert) still answers 503.
How to read it
- Desk.price is the deepest Base pool for KTA, in dollars, with that pool's 1-hour and 24-hour change. Not a forecast.
- Desk.supply is token amounts for KTA, USDC, EURC, and cbBTC. Not dollar prices.
- Desk.movers ranks by how many times a token was sent. covers12h is true only when the page reaches back 12 hours. Not dollar volume.
- Desk.alpaca is 24-hour volume in KTA, highest first. Not 12 hours and not operated by Keeta.
- Network.pulse.feed.last60sTps is the live rate. If last60sPartial is true, the page of blocks is shorter than a minute. lifetimeTps is not the live rate.
- Network.settlement is the median and 95th percentile across representatives in a 15-minute window, in milliseconds. Fewer than 3 representatives is unknown.
- If a source does not answer, the joined call fails and nothing is sold.
- Convert Check shows every input. no-go means the route or the peg failed, or two inputs failed. Do not convert.
- These calls do not send, bridge, or quote a bank fee.
- A stale answer keeps the original keespecs_signature. stale, staleAgeS, servedAt, access, and an asOf that was not in the paid body sit outside that signature. POST the response to /api/verify. Check stale and asOf before acting. The signature can be older than its expiry because the answer is already marked stale.
Read throughput
Pulse, settlementRead mainnet throughput and settlement time. Use feed.last60sTps for the live rate. Never quote ledger.lifetimeTps as the current rate. 0.01 USDC per call. Free while payments are down (rate-limited).
/skills/read-throughput.mdBuy
GET /api/pulse. No query. 0.01 USDC. Free while payments are down (rate-limited). The dashboard shows the same numbers for free.
Which number is live
- feed.last60sTps is operations on blocks from the last minute. If feed.last60sPartial is true, this page of blocks is shorter than a minute and the rate can read low.
- feed.last60sBlocksPerSec is blocks in that same minute, divided by 60. It is not operations per second.
- ledger.lifetimeTps is total transactions divided by seconds since 22 Sep 2025. It is not the live rate.
- feed.busiestSecond is the busiest one-second bucket in this page of blocks. It is not a network record.
- ledger.transactionCount and ledger.blockCount are totals. Poll them if you need a change over time.
- If feed is null, recent blocks did not load. last60sTps is then absent. Do not treat that as zero.
- The design target is 10 million tx/s. A 2025 stress test reached 11,122,116 tx/s. Neither is live.
Settlement time
- GET /api/settlement. No query. 0.01 USDC. Free while payments are down (rate-limited).
- medianMs and p95Ms are the median of the per-representative medians and p95s, in milliseconds. Only representatives with at least 100 samples in the window are included.
- samples is the settlement times inside the window, not the lifetime histogram. asOf is when this copy was read. windowS is the window length in seconds. reps lists each representative.
- source is how many representatives answered. worstRepP95Ms is the slowest included representative. repsOk is how many cleared 100 samples.
- A p95 over 5 seconds is one slow window. Settlement fails only after two slow windows at least 5 minutes apart. note is one slow window when the first one is slow.
Read the Base tape
RegimeRead the deepest Base pool for KTA, and whether Keeta's own rail is quiet or slow. The score is not a forecast and not a social mood. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-regime.mdBuy
GET /api/regime. No query. 0.01 USDC. Free while payments are down (rate-limited). The dashboard shows the same reading for free.
What moves the score
- tape.token is 0xc0634090f2fe6c6d75e61be2b949464abb498973 on Base. Other tokens that use the KTA ticker are ignored.
- The pool is the one with the most liquidity. tape.dex, tape.pair, and tape.quote name it.
- tape.buys1h and tape.sells1h are that pool's last hour. tape.buyShare1h is buys divided by buys plus sells.
- tape.change24hPct is the pool's 24-hour price change in percentage points. tape.priceUsd is the pool price in dollars.
- score is an integer from -100 to 100. 60% is the hour's buy share, centered on an even split. 40% is the 24-hour change, clamped to ±5 percentage points.
- label is Base bid at 20 or above, Base offered at -20 or below, and balanced in between.
- Below 20 trades in the hour, label is thin tape and score is null. Do not invent a number.
- If change24hPct is null and a score is present, the score is the buy share only. The note says so.
What does not move the score
- rail.medianMs and rail.p95Ms are settlement time across representatives, in milliseconds, from a 15-minute window. A slow tail lowers confidence. It does not add or subtract points.
- rail.txPerSec is operations on the latest explorer page that fall in the last minute, divided by 60. Zero means Keeta is quiet. The tape can still be active on Base.
- If rail.lastMinutePartial is true, the latest explorer page does not cover a full minute and confidence is low.
- rail.topShare is the heaviest representative's fraction of voting weight, from 0 to 1. rail.topRepresentative is a short name when one is known. Concentration is not a buy or a sell.
- confidence is high only when a score is present, p95Ms is 5000 or less, and txPerSec is above zero. Otherwise it is low. Read note before acting on label.
- not is the reminder: this is not a forecast. Do not call the label Keeta sentiment.
Read the Base pool price
PriceRead the dollar price of the deepest Base pool for KTA, and that pool's 1-hour and 24-hour change. Not a forecast. Free.
/skills/read-price.mdBuy
GET /api/price. No query. Free. The same price is on the dashboard.
How to read it
- priceUsd is the deepest Base pool for token 0xc0634090f2fe6c6d75e61be2b949464abb498973. Other tokens that use the KTA ticker are ignored.
- fallback false means source is dexscreener. dex, pair, and quote name that pool. change1hPct and change24hPct are that pool's own windows.
- If DexScreener does not answer, source is geckoterminal for the same Base contract. dex, pair, quote, and both changes are null. Do not invent them.
- If both pool publishers are rate-limited, Keeta's pricing anchor and then its FX anchor are used, and the changes are omitted. source is then keeta-pricing or keeta-fx, fallback is true, and chain is keeta. anchor.amountOutBase is the integer for 1 KTA in Keeta USDC. Keeta USDC is treated as $1. Not a fill.
- If none of those four answer, the call returns 503. It does not return an old price, and that miss is not cached.
- 429 means the publisher refused the call. That publisher is not called again for about a minute.
- asOf is when KeeSpecs read the source, not the time of a trade.
- This is not a forecast and not a Keeta oracle price. The score on read-regime is a separate reading. The four-way check is read-prices.
Read a balance
Balance, portfolioRead one token balance, or every token on an address. Match the token address, not the ticker. The balance call is free. The portfolio is free while payments are down (rate-limited).
/skills/read-balance.mdBuy one token
GET /api/balance?account={account}&token={token}. Both values are keeta_ addresses. amountBase is the ledger integer. amount divides that integer by 10^decimals. If decimals is null, show amountBase only.
Buy the whole portfolio
GET /api/portfolio?account={account}. Up to 40 tokens. A missing name does not mean the balance is zero.
Do not confuse tokens
- KTA is keeta_anqdilpazdekdu4acw65fj7smltcp26wbrildkqtszqvverljpwpezmd44ssg, 18 decimals.
- USDC is keeta_amnkge74xitii5dsobstldatv3irmyimujfjotftx7plaaaseam4bntb7wnna, 6 decimals. Match this address. Another token can reuse the letters USDC.
- If decimals is null, do not show a whole-token amount.
- label is a short name for the account, or null. The balance and account calls include it. The portfolio call does not.
Read an account
AccountRead one account: head block, height, representative, public info, and balances. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-account.mdBuy
GET /api/account?account={account}. A keeta_ address is required.
How to read it
- head is the current head-block hash, or null if that account has never published a block. height is null in that same case.
- representative is who receives this account's voting weight. It is not a spendable balance.
- info.name, info.description, and info.metadata are what the account published. An empty string means unset.
- label is KeeSpecs's short name for a known address, or null. It can differ from info.name.
- balances are the same numbers as the portfolio call.
Read history
Activity, outboxActivity is every recent event that touched an address. Outbox is only blocks that address published. Amounts are base units. 0.01 USDC per call. Free while payments are down (rate-limited).
/skills/read-history.mdWhich call
- GET /api/activity?account={account} for incoming transfers and other events, including ones this address did not sign.
- GET /api/outbox?account={account} for blocks this address published.
- An incoming transfer can be in activity and absent from the outbox.
Limits
- At most 8 events or 8 blocks, newest first. This is not a full history.
- amountBase is on each operation. Activity is events, then blocks, then operations. Outbox is blocks, then operations. The event itself has no amount.
- Use read-token for decimals before showing a whole amount.
- Signatures are removed.
- operation.type is a name such as SEND, RECEIVE, SET_REP, or TOKEN_ADMIN_SUPPLY. An unrecognized type is left as a number.
Read a block
BlockRead one mainnet block by its 64-character hex hash. Signatures are omitted. Free.
/skills/read-block.mdBuy
GET /api/block?hash={hash}. The hash is 64 hex characters with no 0x prefix. Anything else returns 400 and is not charged.
Fields
- chain keeta:21378 means mainnet.
- account is the account the block belongs to. signer is who signed it. They differ when one account sends for another.
- previous is the prior block on that account.
- At most 40 operations. amountBase is not scaled. There is no signature field.
- If the block cannot be read, nothing is charged.
Read a token
Token, supplyRead a token's name, decimals, and supply before scaling a base-unit amount. Pass the token address, not the ticker. Free.
/skills/read-token.mdBuy
GET /api/token?token={token}. The token is its keeta_ address, not its ticker.
How to scale
- supplyBase is the integer. supply is that integer divided by 10^decimals.
- If a balance call has null decimals, use this call.
- Mainnet: KTA keeta_anqdilpazdekdu4acw65fj7smltcp26wbrildkqtszqvverljpwpezmd44ssg (18), USDC keeta_amnkge74xitii5dsobstldatv3irmyimujfjotftx7plaaaseam4bntb7wnna (6), EURC keeta_apblhar4ncp3ln62wrygsn73pt3houuvj7ic47aarnolpcu67oqn4xqcji3au (6), cbBTC keeta_apyez4az5r6shtblf3qtzirmikq3tghb5svrmmrltdkxgnnzzhlstby3cuscc (8). Tickers can collide. Trust the address.
- accessMode and defaultPermissions are the token's default rules, such as PUBLIC and ACCESS. They are not the holder list.
Four assets at once
GET /api/supply. No query. Free. Returns KTA, USDC, EURC, and cbBTC. supply is the token amount. It is not a dollar price. For any other token, use the token call.
Read permissions
PermissionsSee who may act on an account. Flags come back as names. This call does not change permissions. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-permissions.mdBuy
GET /api/permissions?account={account}. At most 40 grants. truncated is true when there are more.
How a grant is shaped
- principal is who receives the right. entity is the account it applies to. target usually limits it to one token.
- permissions is a list of names. external is set only when the second permissions number is not zero. Keep that number. Do not invent a name for it.
- Names: ACCESS, OWNER, ADMIN, UPDATE_INFO, SEND_ON_BEHALF, TOKEN_ADMIN_CREATE, TOKEN_ADMIN_SUPPLY, TOKEN_ADMIN_MODIFY_BALANCE, STORAGE_CREATE, STORAGE_CAN_HOLD, STORAGE_DEPOSIT, PERMISSION_DELEGATE_ADD, PERMISSION_DELEGATE_REMOVE, MANAGE_CERTIFICATE, MULTISIG_SIGNER.
- An empty permissions list means that row has no base flags. It does not mean the account is open to everyone.
Read representatives
RepresentativesSee which mainnet representatives hold voting weight, in KTA. Zero-weight addresses are omitted. Free.
/skills/read-representatives.mdBuy
GET /api/representatives. No query. decimals is 18. weight is whole KTA. weightBase is the integer. share is that row divided by the total weight in the response, from 0 to 1. label is Rep 1 through Rep 4 when the address is known, otherwise null.
How to read it
- Weight is delegated KTA. It is not a fee and not a balance you can spend.
- Heaviest first. Zero-weight addresses are omitted.
- api and p2p are the endpoints that representative publishes. Rank by weight, not by the endpoint list.
- The number of representatives can change. Read this call rather than assuming four.
Read token sends
MoversRank community tokens and official stablecoins by how many times they were sent. Not dollar volume and not an exchange rate. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-movers.mdBuy
GET /api/movers. No query. 0.01 USDC. Free while payments are down (rate-limited). The same board is free at /tokens.
How to read the rank
- community is up to 10 tokens that are not in the Keeta currency map, most sends first.
- stables is official fiat tokens from that map, other than KTA and cbBTC, most sends first. An empty list means none of them were sent in this page.
- sends is a count of SEND operations. amount is the sum of those sends, already scaled by decimals. A mint is not counted.
- largest is up to five individual SEND operations from the same page, biggest whole-token amount first. amount is that token's own units, not dollars.
- accounts is how many addresses signed those sends.
- covers12h is true only when the page reaches back at least 12 hours. If it is false, say the span field instead. Do not call a shorter page a 12-hour volume.
- asOf is when that explorer page was read. A later call can return the same asOf for a few minutes. If the explorer did not answer and there is no earlier page, the call fails and nothing is sold.
- This is not a trade, a pool, or a dollar price. Do not invent a price from amount.
- For Alpaca's volume, use read-alpaca. For the currency map, use read-directory. For the Base and Bivo anchors, use read-anchors.
Read Alpaca volume
AlpacaRead AlpacaDEX pools that traded in the last 24 hours. Price, volume, and market cap are in KTA. Not dollars. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-alpaca.mdBuy
GET /api/alpaca. No query. 0.01 USDC. Free while payments are down (rate-limited). The same board is free at /tokens.
How to read it
- rows lists pools whose 24-hour volume is above zero, highest first, up to 10.
- volumeKta, priceKta, and marketCapKta are Alpaca's figures in KTA. They are not dollars.
- change24h is Alpaca's 24-hour price change. 0% means they reported no change.
- listed is how many pools Alpaca returned. A short rows list means the rest had no volume.
- asOf is when Alpaca's list was read. The same list can be served for 15 minutes, or up to an hour if a refresh gets no answer. Do not treat a repeated asOf as a new trade. If Alpaca did not answer and there is no earlier list, the call fails and nothing is sold.
- The window is 24 hours. Alpaca does not publish a 12-hour volume. Do not call this a 12-hour rank.
- AlpacaDEX is a community exchange. It is not operated by Keeta. If error is set, say they did not answer.
- token is the community token address. pool is the pool account. Do not send a seed.
Read the token directory
DirectoryRead every token in the Keeta currency map, with the supply the explorer reports. Not a price. Free.
/skills/read-directory.mdBuy
GET /api/directory. No query. Free. The same list is free at /tokens.
How to read it
- tokens is the public currency map: code, name, token address, decimals, and supply.
- supply is a token amount from the explorer. It is not a dollar value. A null supply means that figure did not load.
- asOf is when the currency map and the activity page were read. A later call can return the same asOf. If the explorer did not answer and there is no earlier page, the call fails and nothing is sold.
- sends is how many times that token was sent in the same activity page as the movers read. Zero is not a promise that the token is unused.
- This list is the tokens Keeta names. It is not the Alpaca pool list. For Alpaca volume, use read-alpaca.
- For one token you already have an address for, read-token is the smaller call.
Read anchor movement
AnchorsRead the latest movement, by block time, of the Base anchor or the Bivo anchor in one activity page, and the median block fee. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-anchors.mdBuy
GET /api/anchors. No query. 0.01 USDC. Free while payments are down (rate-limited). The same lines are free at /tokens.
How to read it
- anchors has at most one row for the Base anchor and one for the Bivo anchor.
- direction is either "to the anchor" or "from the anchor". amount is scaled when the token's decimals are known.
- An empty list means neither anchor appeared in this page of activity. That is not an outage.
- covers12h and span describe the page that was searched. They are not a promise that the anchor is quiet beyond that page.
- asOf is when that page was read. A later call can return the same asOf. If the explorer did not answer and there is no earlier page, the call fails and nothing is sold.
- medianFee is the median block fee in that page, in KTA. It is not a quote for a future send.
- This call does not move funds and does not start a bridge.
Read anchor providers
ProvidersRead the providers in Keeta's published service list, with address and a short description of what they connect. Not a quote. Free.
/skills/read-providers.mdBuy
GET /api/providers. No query. Free. The same directory is free at /anchors.
How to read it
- providers is one row per listing. Two listings can share a name when the resolver published both. Do not merge them.
- source is Keeta resolver, or Community resolver only when that service type is missing from Keeta's list.
- connects is a short reading of published locations or token counts. It is not a rate, a fee, or a promise that a transfer will work.
- address may be null when the metadata names no keeta_ account.
- movement is the latest operation in the current activity page that touches that address. null means this page did not include it. That is not an outage.
- activityError set means movement was left empty because the activity page did not answer. The directory itself can still be used.
- asOf is when the service list was read. It can be reused for an hour. This call does not move funds and does not start a bridge.
- For only the Base and Bivo movement lines, read-anchors is the smaller call.
- For where money can move, and the published fee, read-corridors. This call does not list rails.
Check a bridge route
Bridge routeCheck whether LayerZero, Bridge.xyz, or Keeta's Base bridge published a path for a token between two chains. Run this before a bridge transfer and stop if no route exists. Not a quote. 0.01 USDC. Free while payments are down (rate-limited).
/skills/check-bridge-route.mdBuy
GET /api/bridge-route?from={from}&to={to}&token={token}. 0.01 USDC. Free while payments are down (rate-limited). The same check is free at /bridges. A missing or unknown chain returns 400 and is not charged.
How to read it
- from and to are base, ethereum, arbitrum, avalanche, polygon, bsc, solana, keeta, or a raw chain id such as chain:evm:8453. token is a ticker such as USDC, or the token address on either chain.
- canMove is true only when routes is not empty. If canMove is false, stop. Do not start a transfer.
- routes is one published hop. provider is layerzero, bridge, or keeta. from and to name the chain, the token id on that chain, the ticker when the metadata printed one, and the rail names that provider printed.
- checked lists all three providers. found is how many paths that provider published. found null and error set means that list did not answer. That is not the same as found 0.
- truncated true means more than 12 paths matched. The ones omitted are not a reason to invent another route.
- KeeSpecs does not join two providers into a longer path. A missing hop is a missing hop.
- This is not a quote, not a fee, and not a promise the transfer will succeed. Bank and card rails are read-corridors. This call does not start a bridge.
Search tokens
Token searchTurn a ticker, name, or description into matching token addresses. Official addresses come first. Free.
/skills/search-tokens.mdWhen to use
Use this before a transfer when you have a ticker and not an address. It does not say which copy is safe. Buy read-token-check for that.
Request
GET /api/token/search?q={q}&limit={limit}. No payment. q is required, 1–32 letters, digits, spaces, or $ . _ -. limit is 1–25 and defaults to 10.
Fields
- candidates is the match list. address is the keeta_ account. name, code, and description are what the index has. decimals may be null until a check.
- isOfficial is true when that address is in Keeta's constants or currency map. impostorOf is the official code when this row copies one, otherwise null.
- coverage is partial until a ledger indexer records every SET_INFO account.
- This is not supply, not a warning list, and not an audit. The paid check is GET /api/token/check.
Check a token
Token checkIs this the real token? Every token with that code or address, which one is official, and warnings such as same code as an official token. Not an audit. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-token-check.mdWhen to use
Use this before treating a ticker as a token. If isOfficial is false, or warnings is not empty, do not send. Match the address, not the ticker.
Request
GET /api/token/check?symbol={symbol} or ?token={token}. 0.01 USDC. Free while payments are down (rate-limited). Pass one of them, not both. A missing payment returns 402. A bad query returns 400 and is not charged.
Fields
- official is the currency-map or constants address for that code, or null when no official token uses it.
- candidates lists each token with that code or the address you asked for. isOfficial true means that address is the official one. impostorOf names the official code this row copies.
- warnings may include same_code_as_official, not_in_currency_map, zero_supply, no_metadata, decimals_mismatch_with_official, and admin_can_mint. An empty list is not an audit.
- supplyBase is the ledger integer. supply is that integer scaled by decimals. headHeight is the account height. sends24h is the count from the movers page, or null. That page can be shorter than 24 hours.
- coverage is partial. Tokens no source has seen are absent. This is not a quote and not a forecast.
Read the ecosystem directory
EcosystemRead the KeeSpecs app registry: verified apps, Keeta products, and the companies named on keeta.com. Not a ranking. Free.
/skills/read-ecosystem.mdBuy
GET /api/ecosystem. No query. Free. The same directory is free at /ecosystem.
How to read it
- rows in the Keeta group are products and companies named by Keeta. Test network rows are the test wallet, explorer, and faucet.
- Apps rows are the registry, alphabetical by name. A person registered the app here, and that site's HTML contains the KeeSpecs verification tag. KeeSpecs reads that page again after 14 days. If the tag is gone, the row leaves. If the site does not answer twice, a day apart, it leaves too. contact is the email or X handle they published. url is the website. app is an optional link a phone tries first, or null. logo is a path on this site, or null.
- There is no Keeta.Dev feed. An app that is not in Apps has not verified a link on KeeSpecs.
- A url may be keeta.com when that is the page that names a Keeta product or company.
- This is not a ranking, a review, or a list of every builder. Unnamed partners are left off.
- Anchor providers, with addresses, are read-providers. This call does not move funds.
Read payment corridors
Corridors, corridor index, corridor changesRead where Keeta can move money to or from a bank or card, which provider and rail, which recipient fields, who is excluded, and the fee that provider published. Not a quote. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-corridors.mdBuy
- GET /api/corridors/choose with country, currency, or location. 0.01 USDC. Free while payments are down (rate-limited). direction defaults to out. residency sets excluded countries aside. This is the call to buy before a payout.
- GET /api/changes for rails, fees, the KTA dollar price, and live-rate samples. 0.01 USDC. Free while payments are down (rate-limited). since is an optional ISO date. Buy this to see what moved. The full corridor list is only for every rail.
- GET /api/corridors/changes is the corridor portion alone. 0.01 USDC. Free while payments are down (rate-limited).
- GET /api/corridors with the same filters when every rail is required. 0.01 USDC. Free while payments are down (rate-limited). kind defaults to bank.
- GET /api/corridors/index for every location and currency, with no fees. Free.
- The same lookup is free at /corridors. A missing or invalid query returns 400 and is not charged.
- Then follow https://keeta.ai/llms.txt for the send. This read does not send.
How to read it
- choice is the one rail to use. It is null when every row was set aside. setAside.reason says why. The rank uses the published fixed fee because the unit is not named. Do not rank by basis points until that unit is known.
- verification.designator copied means KeeSpecs copied the publisher. signed-copy means a signature was attached. published-copy means there was no signature. The signature is not checked, and the fee is not covered by that signature. Do not treat either mark as verified.
- estimatedFee is what that provider published. fixed is an integer. The metadata does not name the unit. Do not call it dollars. variableBps is basis points. null means the provider published no fee. That is not zero.
- direction out is a payout. direction in is a deposit. A common rail is returned once in each direction.
- recipientFields come from the Keeta pay-out and card skill docs. An empty list means this location's fields were not copied. Do not invent them. For a card, do not collect the card number.
- typicalDelivery is doc text, not a measurement.
- excludedResidency is the provider's published limit, as text. KeeSpecs does not block the transfer. residency=XX adds eligible and kycCountrySupported. A US address is not marked ineligible for Texas. The text still names Texas.
- bivo-v2 metadata requires a signed-in Keeta account, so those routes are absent. The note says so.
- This is the public list. A signed-in account can be offered fewer routes. operationsAuth keeta-account means simulateTransfer and initiateTransfer need that sign-in.
- asOf is when KeeSpecs read the service list. A stale note means a later fetch failed and this copy was kept. An empty corridors list after a valid query means no published rail matched. That is not an outage.
- changes is empty on the first baseline. After that, added, removed, and fee are the only kinds. An empty list means nothing in the copy changed. verification.designator on that call is compared.
- This call does not quote FX, does not move funds, and does not start KYC.
Mainnet constants
NoneMainnet and testnet ids, plus the addresses for KTA, USDC, EURC, and cbBTC. Free. Nothing to buy.
/skills/mainnet-constants.mdNetworks
- Mainnet is keeta:21378. Testnet is keeta:1413829460. Paid reads are mainnet only.
- A block chain of keeta:21378 is mainnet. Hex 0x5382 is the same number.
- Explorer: https://explorer.keeta.com. Test explorer: https://explorer.test.keeta.com.
Assets
- KTA, the base token, 18 decimals: keeta_anqdilpazdekdu4acw65fj7smltcp26wbrildkqtszqvverljpwpezmd44ssg.
- USDC, 6 decimals: keeta_amnkge74xitii5dsobstldatv3irmyimujfjotftx7plaaaseam4bntb7wnna. KeeSpecs prices are in this token.
- EURC, 6 decimals: keeta_apblhar4ncp3ln62wrygsn73pt3houuvj7ic47aarnolpcu67oqn4xqcji3au.
- cbBTC, 8 decimals: keeta_apyez4az5r6shtblf3qtzirmikq3tghb5svrmmrltdkxgnnzzhlstby3cuscc.
- Do not scale KTA by 6. If an amount looks wrong, call the token read.
Paying KeeSpecs
- Price 0.01 USDC. Amount 10000. Network keeta:21378.
- Pay to keeta_aabz6zxbs2n4r7iiobclndobrnowxdf4pjrb5lwe6bvpeo564bot6krjbrsbbvy.
- Facilitator: {facilitator}. How to sign: {skill}.
Check stablecoin FX rates
Stablecoin FXCheck the peg on Keeta's $K/$KB same-currency anchor (mainnet, thin). Only $KB→$K is offered today. Not an FX rate or a quote. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-stablecoin-fx.mdBuy
GET /api/stablecoin-fx. Optional currency=USD, or from= and to= as token addresses or tickers like $KUSD. Peg check for Keeta's $K/$KB same-currency anchor (mainnet, thin). Only $KB→$K is offered today. Not an FX rate or a quote. 0.01 USDC. Free while payments are down (rate-limited).
How to read it
- deviation_bps is distance from 1:1. state is par at or under 10, drift at or under 50, depeg over 50, no_price, or unknown.
- A positive deviation means the from-token is worth more than the to-token.
- no_price reason is direction_not_offered when the pair is not listed in serviceMetadata, no_ratio_returned when it is listed but the price call returned no ratio, or upstream_error when the anchor call fails or times out. Only $KB→$K is offered today.
- unknown means a source failed, or the decimals were not published. It is not 0.
- USDC and EURC are not pairs on this anchor.
- To convert, get a signed quote with https://keeta.ai/skills/convert-via-anchors/SKILL.md.
Check before you convert
Convert CheckOne call before you convert or bridge on Keeta. go, caution, or no-go, with every input shown: peg, settlement time, ledger activity, anchor liveness, route. Not a quote. 0.02 USDC.
/skills/read-convert-check.mdBuy
- Convert: GET /api/convert-check?kind=convert&from={from}&to={to}&amount={amount}
- Bridge: GET /api/convert-check?kind=bridge&token={token}&toChain={toChain}&amount={amount}
- kind is convert or bridge. A parameter from the other kind returns 400 and is not charged.
- 0.02 USDC. While payments are down, Desk, Network and bridge checks return the last paid answer marked stale:true with its asOf, for up to 10 minutes; after that 503 with Retry-After. Check stale and asOf before acting. A conversion (kind=convert) still answers 503.
How to read it
- no-go: the route or peg failed, or two inputs failed. Do not convert.
- caution: one check failed or warned, or more than one input was unknown. Read reasons, then decide or ask the user.
- go: all checks passed, with at most one unknown. Still get a fresh quote and confirm with the user.
- A bridge that is not a $K or $KB pair has no peg line. That is not an unknown.
- The stablecoin FX anchor does not publish an operating account, so anchor liveness is unknown on a conversion. One unknown does not block go.
- A fresh ledger at 0 transactions per second is a warning, not a failure. Idle and stale together fail.
- The rules are in each input's rule field and rules_version. There are no hidden weights.
- Older than 60 seconds: check again.
- A stale bridge answer keeps the original signature. The stale fields sit outside it. POST the response to /api/verify, then check stale and asOf before acting.
Check an address
Address checkWhether a Keeta address has blocks, what type it is, and a published score. 0.01 USDC. Not proof of personhood. The name is from keeta.xyz.
/skills/check-address.mdBuy
- GET /api/address-check?account={keeta_address}. 0.01 USDC. Free while payments are down (rate-limited).
- A bad checksum returns 400 invalid_account and is not charged. The node is not called.
- exists is true only when the account has at least one block.
How to read it
- type is user, token, or other, from the address prefix.
- name is a keeta.xyz name or null. nameSource is keeta.xyz. It is not the ledger info name.
- truncated means chain or history was cut at 4 pages or 100 blocks. firstSeen is then { olderThan }. Counterparties are in the last N blocks.
- score.value is 0 to 100. parts are age (up to 40), blocks (up to 30), counterparties (up to 20), and username (10 or 0). The formula is at /docs/address-check#score. Do not treat it as proof of personhood.
- schema is address-check/1. Do not depend on a field that is not in that list.
- The same account is cached for 5 minutes. keespecs_signature is Ed25519. POST the response to /api/verify.
Read storage quotas
Storage quotasKeeta storage limits from storage-area1: max object size, objects and bytes per user, searchable fields, and the anchor account. 0.01 USDC. Free while payments are down (rate-limited).
/skills/read-storage-quotas.mdBuy
GET /api/storage-quotas. No query. 0.01 USDC. Free while payments are down (rate-limited). Sizes are bytes: 10 MiB per object, 100 MiB per user. The copy is reused for 5 minutes.
How to read it
- maxObjectSize, maxObjectsPerUser, maxStoragePerUser, maxSearchLimit, and maxSignedUrlTTL come from quotas. signedUrlDefaultTTL and searchableFields sit beside quotas. A missing field is null. Nothing is invented.
- anchorAccount is the storage anchor. auth is keeta-account.
- live is true when this copy was fetched within the last 5 minutes. live is false when the service failed or timed out and the last good copy is reused. checkedAt stays the time of that fetch.
- If there is no copy to reuse, the call is 503 upstream_unavailable and nothing is sold.
- schema is storage-quotas/1. Fields are listed at /docs/storage-quotas. POST the response to /api/verify.
Check before you store
Persist checkready, caution, or blocked before storing data on Keeta, from the storage quotas, the account, its permissions, and the status checks. 0.02 USDC. Not free while payments are down.
/skills/persist-check.mdBuy
- GET /api/persist-check?account={keeta_address}. 0.02 USDC.
- A missing account or a bad checksum returns 400 invalid_account and is not charged. The node is not called.
- While payments are down this returns 503 payments_unavailable. It is not a Group B read.
- The same account is cached for 60 seconds.
How to read it
- verdict is ready, caution, or blocked. ready never includes reasons.
- blocked: storage_unreachable, account_not_found, not_user_account, or ledger_fail.
- caution: storage_stale, ledger_unknown, no_kta_for_fees, delegated_permissions, settlement_slow, settlement_unknown, or price_unknown. settlement_unknown: Settlement data is still collecting; not enough samples in the last 15 minutes.
- The rule is at /docs/persist-check#rule and is also in the rule field.
- storage is the quota fields without a signature. accountInfo.exists is true only when the account has at least one block. type is user, token, or other from the address prefix. ktaBalance is the KTA amount, or 0.
- delegated_permissions means some other account holds ADMIN or ACCESS. Self does not count.
- This does not read how much the account already stores. That needs the account's own signature. It does not store anything.
- schema is persist-check/1. A new field may be added. A rename or removal bumps it to persist-check/2. POST the response to /api/verify.
Keeta settlement time
Keeta settlement timeHow fast and how reliably transfers move into and out of Keeta. 0.01 USDC. Free while payments are down (rate-limited). timing_label is Keeta settlement time. The measured interval is an internal hop, not full settlement, so score is null and label is unknown. Measured on Keeta only. Does not include time spent on the Corridor chain. Not a guarantee of future transfer times.
/skills/read-bridge-speed.mdBuy
- GET /api/bridge-speed. Optional window is 1h, 24h, or 7d. Optional direction is in, out, or all. Optional asset is a keeta_ token address. Default window is 24h and default direction is all. 0.01 USDC. Free while payments are down (rate-limited).
- A bad window, direction, or asset returns 400 bad_param and is not charged.
- If the stored sample cannot be read, the last good result is returned marked stale for up to 10 minutes. After that the call is 503 upstream_unavailable with Retry-After 60, and nothing is sold.
How to read it
- timing_label is Keeta settlement time. timing_note says: Measured on Keeta only. Does not include time spent on the Corridor chain.
- timing_method same_staple_amount_token: Time between two linked blocks in the same Keeta vote staple (same token and amount). This is an internal hop, not full settlement. median_ms and p95_ms are that gap in milliseconds. median_seconds and p95_seconds are the same gap to one decimal, not a whole second.
- Do not score or label that hop. score is null, label is unknown, and reason is settlement_not_observable. The message is: Only an internal Keeta hop inside one block bundle can be timed. Full bridge settlement time isn't observable from Keeta alone.
- timing_basis is end_to_end only when the Keeta block and a public block time were both measured. Otherwise it is keeta_side. The two are never combined into one median or p95.
- completion_basis is not_observable when completion cannot be paired. completion_rate is null in that case. It is not 100%. The staple gap is a duration, not a completion.
- A transfer with no match after 30 minutes counts as not completed, when pairing is possible.
- When completion was measured, score is 100 fast when completion is at or above 99% and p95 is at or under 60 seconds. score is 70 normal when completion is at or above 95% and p95 is at or under 300 seconds. Otherwise score is 30 slow.
- Fewer than 20 transfers sets label to unknown, score to null, and reason to bridge_unknown. The message is: Not enough bridge transfers in this window to score.
- When no Keeta-side interval can be measured and there are 20 or more transfers, reason is timing_not_observable. The message is: Keeta settlement time isn't observable for these transfers. median_seconds and p95_seconds are null. label is unknown and score is null.
- external_chain_id is a machine field. Do not turn it into a chain name in anything you say to a person. Call that chain the Corridor.
- volume amounts use the token's decimals. amountBase is the integer. symbol comes from the known token list, or null.
- note says this is not a guarantee of future transfer times. The rule text is in score_rule and at /docs/bridge-speed.
- POST the response to /api/verify. Stale fields sit outside the signature.