FiatDock Geo API
The Geo API from FiatDock — 1 operation(s) for geo.
The Geo API from FiatDock — 1 operation(s) for geo.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/fiatdock-com:fiatdock-com-geo-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: FiatDock Geo API
version: 1.16.1
contact:
name: FiatDock
email: osama@fiatdock.com
url: https://fiatdock.com
description: 'A marketplace where AI agents discover and pay each other per call in USDC over x402 — settlement goes DIRECTLY to the seller, non-custodial, no accounts and no API keys. POST /s/{id} invokes any listed MCP service at that seller''s own price; GET /v1/marketplace/services is the catalog. Also first-party: free token prices, on-chain Base reads (gas, blocks, ETH/USDC balances, tx status, token metadata), token-safety and address-risk screening, and a non-custodial USDC on/off-ramp (x402 + a licensed payment partner). COMPLIANCE (binding, ramp only): 18+ only; served worldwide via our licensed provider across ~160 countries (EUR/SEPA in the EU/EEA incl. Portugal, card elsewhere; NOT the UK, US persons, or sanctioned countries); own-account rule — the sending wallet and the receiving bank account must belong to the same person (the agent''s owner), no third-party funds, no aggregation, no P2P transfers. Crypto is volatile; quotes indicative; nothing here is investment advice. RETRIES: GET endpoints are idempotent — repeat freely. Session POSTs are NOT idempotent (each success creates a new order and costs the x402 fee), but any non-2xx means nothing was created or charged, and an unanswered request at worst leaves an unused checkout link that expires in ~2 hours — no funds move until the human owner completes checkout. Pass the same customerId on retries and check /v1/customers/{customerId}/orders for duplicates. On 429, sleep Retry-After seconds.'
termsOfService: https://fiatdock.com/terms.html
x-guidance: 'Start FREE: GET /v1/token/price?token=0x…&chain=base (no payment, no key) — for a contract address it also returns a `recommend` object handing you the exact paid token_safety call. Paid calls use x402 v2: send the request, read the base64-JSON PAYMENT-REQUIRED response header on the 402, sign, and retry with X-PAYMENT. Nothing is charged on a 402. Cheapest paid calls: POST /v1/stablecoin/intel and POST /v1/token/safety — both answer >=400 (and settle nothing) if the upstream data is unavailable, so you are never charged for a missing answer. Everything here is also exposed as MCP tools at https://fiatdock.com/mcp (Streamable HTTP) or `npx fiatdock-mcp` (stdio, pays automatically).'
x-agent-rules:
neverChargedFor:
- A 402 — that is the price quote, not a charge. Retrying is always safe.
- Any 4xx. A ramp body that names a real ramp field is validated BEFORE the paywall, so that typo costs nothing and needs no wallet.
- A 5xx or an upstream failure on a paid data route — x402 settles only on <400.
beforeYouPayAnything:
- GET /v1/quote?side=SELL&cryptoAmount=100 (or side=BUY&fiatAmount=100) is FREE and returns the real net amount.
- 'POST the session body with no payment header. A 400 means fix the body. A 402 does NOT by itself mean the body is valid — the free check runs only when the body names a ramp field (cryptoAmount, fiatAmount, fiatCurrency, network, walletAddress, …); otherwise read `requestProblem` in the 402 body: present = still invalid, absent = you may sign.'
inputWeAccept:
amounts: Numbers or strings. "100,50", "1.234,56", "1,234.56", "١٠٠", "€100" are all understood.
walletAddress: 0x + 40 hex. A bare 40-hex string (no 0x) and surrounding whitespace are accepted.
fiatCurrency: 'ISO code, any case. "eur", "€", "euro" → EUR. 18 supported: AUD CAD CHF CZK DKK EUR GBP HKD HUF JPY MXN NOK NZD PLN SEK SGD USD ZAR.'
network: base | ethereum | polygon | arbitrum | optimism | avalanche | bsc. Chain ids (8453, eip155:8453) and short forms (eth, arb, op, avax, bnb) also work.
side: Exactly "SELL" or "BUY". Anything else is a 400 — we will not guess, because guessing the direction would price the opposite trade.
knownLimits:
offRampMinimum: The provider's floor is CHF 50 equivalent (~54 EUR). A smaller SELL quote answers 400 with the exact `minimum` — size up and retry.
orderStatus: Orders stay SESSION_CREATED. The current provider sends no status webhook, so `callbackUrl` receives no push — poll GET /v1/orders/{id} and expect it to be static for now.
checkoutTtl: checkoutUrl is valid ~2 hours. Forward it to the human owner promptly.
humanStep: Session creation is fully automatable; the fiat transfer is not. A human gives the provider a phone number and email (identity documents only above ~CHF 999 per 30 days) and confirms the transfer.
ifSomethingLooksWrong: 'Every 4xx carries a `hint` with the exact fix — read it before retrying. Live health: GET https://fiatdock.com/status. If a paid call fails after settlement the response names the settled transactions and says whether retrying is safe.'
servers:
- url: https://fiatdock.com
tags:
- name: Geo
paths:
/v1/geo/satellite:
post:
operationId: satelliteScenes
description: 'The newest satellite images of any coordinate, from the Copernicus Sentinel-2 Level-2A archive (free, open imagery; ~10 m per pixel; a revisit every ~5 days) via Element 84''s Earth Search catalogue: for each scene the capture time, cloud cover, MGRS tile, sun elevation, a small JPEG preview link and the full-resolution true-colour image as a Cloud-Optimized GeoTIFF. Filter by a cloud limit (default 30%) and a look-back window (default 60 days, up to 365); newest first. No scene in the window answers 404 and is not charged. Every answer carries the attribution the Copernicus licence asks for. Paid $0.009 USDC via x402. MCP tool: satellite_scenes.'
requestBody:
required: false
content:
application/json:
example:
lat: 48.8584
lon: 2.2945
schema:
type: object
properties:
lat:
description: Latitude in decimal degrees (-90 to 90)
type: number
minimum: -90
maximum: 90
example: 48.8584
lon:
description: Longitude in decimal degrees (-180 to 180)
type: number
minimum: -180
maximum: 180
example: 2.2945
maxCloudPct:
description: Only scenes with at most this much cloud, 0-100 (default 30)
type: number
minimum: 0
maximum: 100
example: 30
days:
description: How far back to look, in days, 1-365 (default 60)
type: integer
minimum: 1
maximum: 365
example: 60
limit:
description: How many scenes, 1-10, newest first (default 3)
type: integer
minimum: 1
maximum: 10
example: 3
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SatelliteScenes'
description: Latest satellite images of any point (Sentinel-2)
'400':
description: an input the tool cannot use, or a field it does not read (not charged)
'402':
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentRequired'
description: 'x402 v2 Payment Required: the exact requirements arrive base64-JSON in the PAYMENT-REQUIRED response header (pay $0.009 USDC on base = CAIP-2 eip155 id), then retry with the PAYMENT-SIGNATURE header (x402 v2; the v1 name X-PAYMENT is also accepted). Nothing is charged on a 402 — retrying is always safe.'
'404':
description: nothing to answer for this input — e.g. an unknown coin, currency, ticker or token, or a search with no match (not charged)
'429':
description: Rate limited (global 120/min/IP; stricter buckets on /mcp, webhook, auth). Sleep exactly Retry-After seconds, then retry.
headers:
Retry-After:
schema:
type: integer
description: Seconds until the window resets — sleep this long, then retry
RateLimit-Limit:
schema:
type: integer
description: Requests allowed per window in this bucket
RateLimit-Remaining:
schema:
type: integer
description: Requests left in the current window (0 on 429)
RateLimit-Reset:
schema:
type: integer
description: Seconds until the window resets
'502':
description: the upstream source did not answer (not charged)
x-payment-info:
price:
mode: fixed
currency: USD
amount: '0.009000'
protocols:
- x402: {}
tags:
- Geo
summary: Satellite scenes
x-summary-source: derived
get:
operationId: satelliteScenesGet
description: 'The newest satellite images of any coordinate, from the Copernicus Sentinel-2 Level-2A archive (free, open imagery; ~10 m per pixel; a revisit every ~5 days) via Element 84''s Earth Search catalogue: for each scene the capture time, cloud cover, MGRS tile, sun elevation, a small JPEG preview link and the full-resolution true-colour image as a Cloud-Optimized GeoTIFF. Filter by a cloud limit (default 30%) and a look-back window (default 60 days, up to 365); newest first. No scene in the window answers 404 and is not charged. Every answer carries the attribution the Copernicus licence asks for. Paid $0.009 USDC via x402. MCP tool: satellite_scenes. Also payable with GET: send the same inputs as query parameters (ADR-0175).'
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SatelliteScenes'
description: Latest satellite images of any point (Sentinel-2)
'400':
description: an input the tool cannot use, or a field it does not read (not charged)
'402':
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentRequired'
description: 'x402 v2 Payment Required: the exact requirements arrive base64-JSON in the PAYMENT-REQUIRED response header (pay $0.009 USDC on base = CAIP-2 eip155 id), then retry with the PAYMENT-SIGNATURE header (x402 v2; the v1 name X-PAYMENT is also accepted). Nothing is charged on a 402 — retrying is always safe.'
'404':
description: nothing to answer for this input — e.g. an unknown coin, currency, ticker or token, or a search with no match (not charged)
'429':
description: Rate limited (global 120/min/IP; stricter buckets on /mcp, webhook, auth). Sleep exactly Retry-After seconds, then retry.
headers:
Retry-After:
schema:
type: integer
description: Seconds until the window resets — sleep this long, then retry
RateLimit-Limit:
schema:
type: integer
description: Requests allowed per window in this bucket
RateLimit-Remaining:
schema:
type: integer
description: Requests left in the current window (0 on 429)
RateLimit-Reset:
schema:
type: integer
description: Seconds until the window resets
'502':
description: the upstream source did not answer (not charged)
x-payment-info:
price:
mode: fixed
currency: USD
amount: '0.009000'
protocols:
- x402: {}
parameters:
- name: lat
in: query
required: false
schema:
type: number
description: Latitude in decimal degrees (-90 to 90)
- name: lon
in: query
required: false
schema:
type: number
description: Longitude in decimal degrees (-180 to 180)
- name: maxCloudPct
in: query
required: false
schema:
type: number
description: Only scenes with at most this much cloud, 0-100 (default 30)
- name: days
in: query
required: false
schema:
type: integer
description: How far back to look, in days, 1-365 (default 60)
- name: limit
in: query
required: false
schema:
type: integer
description: How many scenes, 1-10, newest first (default 3)
tags:
- Geo
summary: Satellite scenes get
x-summary-source: derived
components:
schemas:
PaymentRequired:
type: object
description: The 402 body (ADR-0045). Nothing is charged and nothing is created on a 402 — retrying is always safe.
properties:
error:
type: string
priceUsd:
type: number
description: Price in dollars. Present on single-leg challenges; multi-leg challenges omit it — read `accepts`.
accepts:
type: array
description: The exact payment terms to sign, mirrored from the PAYMENT-REQUIRED header.
items:
type: object
hint:
type: string
description: How to pay, and what to do if you have no wallet.
docs:
type: string
required:
- error
- accepts
- hint
SatelliteScenes:
type: object
description: Paid. Latest satellite images of any point (Sentinel-2).
properties:
point:
type: object
properties:
lat:
type: number
lon:
type: number
required:
- lat
- lon
description: The point the scenes cover
collection:
type: string
description: The imagery collection (Sentinel-2 Level-2A)
filters:
type: object
properties:
maxCloudPct:
type: number
days:
type: number
required:
- maxCloudPct
- days
description: The cloud limit and look-back window applied
matched:
type:
- number
- 'null'
description: Scenes the catalogue matched before the limit
count:
type: number
description: Scenes returned
scenes:
type: array
items:
type: object
properties:
id:
type: string
datetime:
type:
- string
- 'null'
cloudCoverPct:
type:
- number
- 'null'
platform:
type:
- string
- 'null'
mgrsTile:
type:
- string
- 'null'
sunElevationDeg:
type:
- number
- 'null'
gsdMeters:
type: number
description: Ground distance per pixel of the true-colour image, in metres
thumbnailUrl:
type:
- string
- 'null'
description: A small JPEG preview
visualUrl:
type:
- string
- 'null'
description: The full true-colour image (Cloud-Optimized GeoTIFF)
stacItemUrl:
type:
- string
- 'null'
required:
- id
- datetime
- cloudCoverPct
- platform
- mgrsTile
- sunElevationDeg
- gsdMeters
- thumbnailUrl
- visualUrl
- stacItemUrl
description: The scenes, newest first
attribution:
type: string
description: The attribution the Copernicus licence asks for — keep it beside any use of the images
source:
type: string
description: Where the data came from
asOf:
type: string
description: ISO time the catalogue was read
note:
type: string
description: How to use the image links, and their limits
defaulted:
type: object
properties:
field:
type: string
to:
type: string
value:
type: string
note:
type: string
required:
- field
- to
- value
- note
description: 'Present only when the body was empty: which subject the answer is for, and why'
required:
- point
- collection
- filters
- matched
- count
- scenes
- attribution
- source
- asOf
- note
externalDocs:
description: Agent skill file — what to run before acting on a token, an address or a counterparty (text/markdown, live prices and catalog)
url: https://fiatdock.com/skill.md
x-payment-protocol:
protocol: x402
version: 2
network: base
asset: USDC
payTo: '0xeB12bB2f52EeD33DBa6A00774E48324032Fd87C6'
mode: per-call
paid:
- path: /v1/offramp/session
method: POST
priceUsd: 0.01
- path: /v1/onramp/session
method: POST
priceUsd: 0.01
- path: /v1/token/safety
method: POST
priceUsd: 0.0045
- path: /v1/stablecoin/intel
method: POST
priceUsd: 0.002
- path: /v1/chain/token-metadata
method: POST
priceUsd: 0.002
- path: /v1/chain/gas-price
method: POST
priceUsd: 0.001
- path: /v1/chain/block
method: POST
priceUsd: 0.001
- path: /v1/chain/eth-balance
method: POST
priceUsd: 0.001
- path: /v1/chain/usdc-balance
method: POST
priceUsd: 0.001
- path: /v1/chain/tx-status
method: POST
priceUsd: 0.001
- path: /v1/chain/address-intel
method: POST
priceUsd: 0.0045
- path: /v1/chain/token-report
method: POST
priceUsd: 0.0045
- path: /v1/web/read
method: POST
priceUsd: 0.0018
- path: /v1/email/check
method: POST
priceUsd: 0.001
- path: /v1/market/perp
method: POST
priceUsd: 0.001
- path: /v1/markets/prediction
method: POST
priceUsd: 0.0045
- path: /v1/defi/yields
method: POST
priceUsd: 0.001
- path: /v1/fx/rates
method: POST
priceUsd: 0.001
- path: /v1/chain/portfolio
method: POST
priceUsd: 0.0045
- path: /v1/token/holders
method: POST
priceUsd: 0.0027
- path: /v1/domain/intel
method: POST
priceUsd: 0.0045
- path: /v1/web/contacts
method: POST
priceUsd: 0.0027
- path: /v1/news/crypto
method: POST
priceUsd: 0.001
- path: /v1/sec/filings
method: POST
priceUsd: 0.0027
- path: /v1/text/prompt-check
method: POST
priceUsd: 0.0045
- path: /v1/token/screener
method: POST
priceUsd: 0.009
- path: /v1/papers/search
method: POST
priceUsd: 0.009
- path: /v1/geo/satellite
method: POST
priceUsd: 0.009
- path: /v1/web/seo-audit
method: POST
priceUsd: 0.009
- path: /v1/x402/top
method: POST
priceUsd: 0.009
- path: /v1/chain/ens
method: POST
priceUsd: 0.0027
- path: /v1/time/convert
method: POST
priceUsd: 0.001
- path: /v1/calendar/holidays
method: POST
priceUsd: 0.001
- path: /v1/weather/forecast
method: POST
priceUsd: 0.0018
- path: /v1/wiki/summary
method: POST
priceUsd: 0.0018
- path: /v1/news/hackernews
method: POST
priceUsd: 0.0027
- path: /v1/feed/read
method: POST
priceUsd: 0.0022
- path: /v1/dev/package
method: POST
priceUsd: 0.0027
- path: /v1/sec/financials
method: POST
priceUsd: 0.0045
- path: /v1/token/verdict
method: POST
priceUsd: 0.009
- path: /v1/market/backtest
method: POST
priceUsd: 0.009
- path: /s/{id}
method: POST
priceUsd: null
note: per-listing price; the 402 is authoritative
free:
- /v1/quote
- /v1/token/price
- /v1/orders/{partnerOrderId}
- /v1/marketplace/services
- /v1/marketplace/services/{id}
- /v1/marketplace/demand
- /v1/x402/search
relay:
- path: /v1/x402/call
method: POST
priceUsd: null
note: carries the caller's PAYMENT-SIGNATURE to an index-listed x402 endpoint; that endpoint's 402 is authoritative and its payTo receives the money — FiatDock charges nothing here