Pay-per-request API for global padel club data and open matches.
Access detailed information about 11,940 padel clubs across 87 countries worldwide, including photos, amenities, pricing, and open match listings from Playtomic and Raketo platforms.
Other x402 APIs:
Uncensored AI API - Uncensored chat, reasoning, code & image generation via Venice AI - $0.03-$0.08/request
Agent Tools API - General utility endpoints for AI agents (weather, geocoding, Wikipedia, news, etc.) - $0.01/request
Crypto API - Blockchain & DeFi data (token metadata, security analysis, risk scoring) - $0.02+/request
Residential Proxy API - Fetch URLs through residential IPs to bypass datacenter IP blocks - $0.01/request
x402scan.com - Web interface to test any x402 API with your wallet
Payment Token: USDC on Base Mainnet (Chain ID: 8453)
Price: $0.01 USD per request
Receiving Address: 0xd8bA61a0b0974db0EC8E325C7628470526558E9B
Facilitator: PayAI Network
Features: Gasless transactions, 0% fees, ERC-3009 transferWithAuthorization
All endpoints use POST with JSON body parameters.
Get list of countries with padel clubs and club counts.
Body: {} (no parameters required)
Example Response:
{
"count": 89,
"countries": [
{"country_slug": "spain", "club_count": 4852},
{"country_slug": "italy", "club_count": 1375}
]
}
Refundable variant: POST /api/x402r/countries ($0.01, escrow scheme with 10-minute refund window)
Get all clubs in a city with basic information.
Example Response:
{
"city": "barcelona",
"count": 87,
"clubs": [{
"id": 123,
"name": "Padel Barcelona",
"address": "Carrer de Provença, 123, Barcelona",
"latitude": 41.3851,
"longitude": 2.1734,
"google_rating": 4.5,
"slug": "/spain/barcelona/padel-barcelona"
}]
}
Get detailed club information including courts, pricing, amenities, and match counts.
Example Response:
{
"id": 1238,
"name": "TEMPO Padel & Pickleball Club",
"address": "123 Court Street",
"latitude": 54.5169954,
"longitude": -1.3182519,
"google_rating": 4.8,
"website": "https://tempo-padel.com",
"phone": "+44 1234 567890",
"photo_count": 14,
"total_matches_count": 200,
"open_matches_count": 62,
"indoor_courts": 3,
"outdoor_courts": 2,
"peak_hour_price": "38.0",
"currency": "GBP",
"has_parking": true,
"has_restaurant": true
}
Get all photos for a club with URLs and metadata.
Example Response:
{
"club_id": 8624,
"club_name": "AC PADEL LUGO",
"photo_count": 14,
"photos": [{
"id": 82807,
"url": "https://padelmaps.org/uploads/club_photos/8624/photo.jpg",
"photo_type": "google",
"width": 1600,
"height": 1200,
"is_primary": true
}]
}
Get ALL active clubs in a country with full fields (id, name, address, coords, phone, website, rating, courts, public_url). Up to 5,000 clubs per request.
Example Response:
{
"country": "spain",
"count": 2104,
"total": 2104,
"limit": 5000,
"truncated": false,
"clubs": [{
"id": 123,
"name": "Padel Madrid",
"address": "Calle Mayor 1, Madrid",
"latitude": 40.4168,
"longitude": -3.7038,
"phone": "+34 91 123 4567",
"website": "https://padelmadrid.com",
"google_rating": 4.5,
"google_rating_count": 312,
"country_slug": "spain",
"city_slug": "madrid",
"club_slug": "padel-madrid",
"indoor_courts": 4,
"covered_courts": 2,
"outdoor_courts": 2,
"court_surface_type": "artificial grass",
"public_url": "https://padelmaps.org/clubs/spain/madrid/padel-madrid"
}]
}
Get active clubs within a radius, sorted by distance ascending. Each result includes a distance_km field.
Example Response:
{
"lat": 40.4168,
"lon": -3.7038,
"radius_km": 25,
"count": 5,
"clubs": [{
"id": 123,
"name": "Padel Madrid",
"address": "Calle Mayor 1, Madrid",
"latitude": 40.4168,
"longitude": -3.7038,
"google_rating": 4.5,
"public_url": "https://padelmaps.org/clubs/spain/madrid/padel-madrid",
"distance_km": 0.38
}]
}
Case-insensitive full-text search across club name and address. Returns matching active clubs.
Example Response:
{
"q": "padel barcelona",
"count": 3,
"clubs": [{
"id": 123,
"name": "Padel Barcelona",
"address": "Carrer de Provença, 123, Barcelona",
"latitude": 41.3851,
"longitude": 2.1734,
"google_rating": 4.5,
"public_url": "https://padelmaps.org/clubs/spain/barcelona/padel-barcelona"
}]
}
Get open matches in a city (all platforms: Playtomic, Raketo, etc.).
Example Response:
{
"city": "barcelona",
"count": 157,
"playtomic_count": 142,
"raketo_count": 15,
"matches": [{
"id": "abc123",
"platform": "playtomic",
"club_name": "Padel Barcelona",
"start_time": "2025-11-23T10:00:00Z",
"end_time": "2025-11-23T11:30:00Z",
"available_spots": 2,
"price": "19.00",
"currency": "EUR",
"min_level": 2.5,
"max_level": 4.0,
"booking_url": "https://playtomic.io/match/abc123"
}]
}
Fetch any URL through a residential IP. Bypasses datacenter IP blocks, Cloudflare challenges, and geo-restrictions. Fresh IP every request, 3 automatic retries.
Parameters: url (required), method, headers, body, country (2-letter ISO), session_id (1-8 alphanumeric)
Parameters: url (required), country (required, 2-letter ISO)
Every external-API endpoint has a refundable escrow variant at 1.25x the regular price (same price for $0.01 endpoints). Payments are held in escrow with a 10-minute refund window. If the API call fails, your payment is automatically refunded.
URL pattern: replace x402- with x402r- (e.g., /api/x402r-crypto/token-metadata)
| Path | Price |
|---|---|
/api/x402r-crypto/token-metadata | $0.03 |
/api/x402r-crypto/site-trust | $0.05 |
/api/x402r-crypto/contract-decoder | $0.03 |
/api/x402r-crypto/wallet-identity | $0.06 |
/api/x402r-crypto/wallet-identity-crosschain | $0.12 |
/api/x402r-crypto/gas-oracle | $0.01 |
/api/x402r-crypto/price-feed | $0.03 |
/api/x402r-crypto/nft-metadata | $0.03 |
/api/x402r-crypto/token-holders | $0.03 |
/api/x402r-crypto/approval-checker | $0.05 |
/api/x402r-crypto/transaction-decoder | $0.06 |
/api/x402r-crypto/defi-positions | $0.10 |
/api/x402r-crypto/ens-expiry | $0.01 |
| Path | Price |
|---|---|
/api/x402r-uncensored/chat | $0.04 |
/api/x402r-uncensored/reasoning | $0.10 |
/api/x402r-uncensored/code | $0.09 |
/api/x402r-uncensored/image | $0.04 |
/api/x402r-uncensored/image-pro | $0.19 |
| Path | Price |
|---|---|
/api/x402r-tools/crypto/price | $0.01 |
/api/x402r-tools/crypto/prices | $0.01 |
/api/x402r-tools/weather/current | $0.01 |
/api/x402r-tools/geocode | $0.01 |
/api/x402r-tools/reverse-geocode | $0.01 |
/api/x402r-tools/wiki/search | $0.01 |
/api/x402r-tools/wiki/summary | $0.01 |
/api/x402r-tools/news/search | $0.01 |
/api/x402r-tools/stocks/quote | $0.01 |
/api/x402r-tools/countries/info | $0.01 |
/api/x402r-tools/books/search | $0.01 |
/api/x402r-tools/hackernews/top | $0.01 |
/api/x402r-tools/github/repo | $0.01 |
/api/x402r-tools/currency/convert | $0.01 |
The x402r escrow flow works like standard x402, but payments are held in an on-chain escrow contract and automatically refunded if the API call fails. Here's how to make an escrow payment in three languages:
# Step 1: Make initial request (returns 402 with escrow details)
curl -s -X POST https://padelmaps.org/api/x402r-crypto/token-metadata \
-H "Content-Type: application/json" \
-d '{"chain": "ethereum", "contract_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}'
# Response (402 Payment Required):
# {
# "x402Version": 2,
# "accepts": [{
# "scheme": "commerce",
# "network": "eip155:8453",
# "maxAmountRequired": "40000", // $0.04 USDC (6 decimals)
# "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base
# "payTo": "0x1A602eEC594BD9A50D8FD06BCC13D35c18FE68A8",
# "extra": {
# "escrowAddress": "0xb9488351E48b23D798f24e8174514F28B741Eb4f",
# "tokenCollector": "0x48ADf6E37F9b31dC2AAD0462C5862B5422C736B8",
# "operatorAddress": "0x1A602eEC594BD9A50D8FD06BCC13D35c18FE68A8",
# "name": "USD Coin", "version": "2"
# }
# }]
# }
# Steps 2-4 require EIP-712 signing (ReceiveWithAuthorization).
# Use the Python or TypeScript examples below for the full flow,
# or use the interactive "Try It" buttons above.
import requests, json, base64, time, os
from eth_account import Account
from eth_account.messages import encode_typed_data
PRIVATE_KEY = os.environ["PRIVATE_KEY"]
account = Account.from_key(PRIVATE_KEY)
URL = "https://padelmaps.org/api/x402r-crypto/token-metadata"
BODY = {"chain": "ethereum", "contract_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}
# Step 1: Get 402 with escrow requirements
resp = requests.post(URL, json=BODY)
data = resp.json()
req = data["accepts"][0]
extra = req["extra"]
amount = req["maxAmountRequired"]
# Step 2: Build paymentInfo and compute escrow nonce
from web3 import Web3
salt = "0x" + os.urandom(32).hex()
MAX_UINT48 = 281474976710655
payment_info = {
"operator": extra["operatorAddress"],
"receiver": req["payTo"],
"token": req["asset"],
"maxAmount": int(amount),
"preApprovalExpiry": MAX_UINT48,
"authorizationExpiry": MAX_UINT48,
"refundExpiry": MAX_UINT48,
"minFeeBps": extra.get("minFeeBps", 0),
"maxFeeBps": extra.get("maxFeeBps", 0),
"feeReceiver": extra["operatorAddress"],
"salt": salt,
}
# Step 3: Sign EIP-712 ReceiveWithAuthorization
domain = {
"name": extra["name"], "version": extra["version"],
"chainId": 8453, "verifyingContract": req["asset"],
}
message = {
"from": account.address,
"to": extra["tokenCollector"],
"value": int(amount),
"validAfter": 0,
"validBefore": MAX_UINT48,
"nonce": nonce, # computed from paymentInfo hash
}
# (See full nonce computation in the x402r SDK or JS example on this page)
sig = account.sign_typed_data(domain, {"ReceiveWithAuthorization": [...]}, message)
# Step 4: Retry with X-PAYMENT header
payload = {
"x402Version": 2, "scheme": "commerce", "network": "eip155:8453",
"payload": {
"authorization": {
"from": account.address, "to": extra["tokenCollector"],
"value": amount, "validAfter": "0",
"validBefore": str(MAX_UINT48), "nonce": nonce,
},
"signature": sig.signature.hex(),
"paymentInfo": payment_info,
},
}
x_payment = base64.b64encode(json.dumps(payload).encode()).decode()
resp2 = requests.post(URL, json=BODY, headers={"X-PAYMENT": x_payment})
print(resp2.json()) # API result (funds held in escrow, auto-refunded on failure)
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerEscrowScheme } from "@x402r/evm/escrow/client";
import { privateKeyToAccount } from "viem/accounts";
// Setup: create signer and register escrow scheme
const signer = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const client = new x402Client();
registerEscrowScheme(client, { signer, networks: "eip155:8453" });
// Wrap fetch — handles 402 → sign → retry automatically
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
// Make request (payment is handled transparently)
const response = await fetchWithPayment(
"https://padelmaps.org/api/x402r-crypto/token-metadata",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chain: "ethereum",
contract_address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
}),
}
);
const data = await response.json();
console.log(data); // API result
// npm install @x402/fetch @x402/core @x402r/evm viem
No artificial rate limiting - pay $0.01 USDC per request. Use as much or as little as you need.
Optional. If you use these endpoints, honest on-chain feedback helps other agents decide whether to trust them. We publish feedback about endpoints we review the same way, so this is the same mechanism pointed back at us. Rate honestly — we do not ask for a particular score and there is no reward for a good one.
227780x8004BAa17C55a88189AE136b182e5fdA19dE9b63 on Base (chain 8453)
value is 0–100 with valueDecimals 0. Convention for
tag1 is reliable (80+), functional (50–79)
or unreliable (below 50). feedbackURI and
feedbackHash may be left empty.
cast send 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 "giveFeedback(uint256,int128,uint8,string,string,string,string,bytes32)" 22778 YOUR_SCORE 0 "reliable" "x402-endpoint" "https://padelmaps.org/api/x402/clubs/bulk" "" 0x0000000000000000000000000000000000000000000000000000000000000000 --rpc-url https://mainnet.base.org --private-key $PRIVATE_KEY
Full snippets, including web3.py, are in llm.txt.