Documentation
Buyer Guide
Access powerful APIs through a single ZAM credential
Getting Started
To start using APIs on the ZeroClick Marketplace, you need a ZAM API key. This single credential gives you access to every adapter listed on the marketplace.
- 1Sign up — Create an account on the ZeroClick Marketplace at
marketplace.zeroclick.ai - 2Get your API key — Navigate to Settings → API Keys and generate a new ZAM API key
- 3Add funds — Load your account balance. You pay per call, with rates determined by each adapter's contract.
Note: Your ZAM API key authenticates you with the marketplace. You never need the seller's API keys — that is handled transparently by the seller's local daemon.
Finding Services
The ZeroClick Marketplace catalog lists all available adapters. Each adapter exposes a standard set of endpoints you can inspect before making calls.
- Browse the catalog — Visit the marketplace or use the API to list all available services with descriptions and pricing.
- Check the contract — Every adapter exposes a
GET /contractendpoint that returns the full input/output schema, rate limits, and pricing.
# Get adapter info
GET https://<tunnel-url>/<adapter>/
# Get full contract (schema, limits, pricing)
GET https://<tunnel-url>/<adapter>/contractMaking Requests
All adapter calls use the same pattern: a POST to the adapter's /run endpoint with your ZAM API key in the Authorization header.
POST https://<tunnel-url>/<adapter>/run
Content-Type: application/json
Authorization: Bearer <zam-api-key>
{ "q": "search query" }Example: SerpAPI Google Search
curl -X POST https://abc123.trycloudflare.com/serpapi/run \
-H "Content-Type: application/json" \
-H "Authorization: Bearer zam_live_abc123..." \
-d '{ "q": "best AI frameworks 2026" }'Example: Brave Web Search
curl -X POST https://abc123.trycloudflare.com/brave-search/run \
-H "Content-Type: application/json" \
-H "Authorization: Bearer zam_live_abc123..." \
-d '{ "q": "latest machine learning papers" }'Response Format
Every adapter returns a consistent ZamRunResponse structure, making it easy to handle responses uniformly across different services.
Successful response
{
"ok": true,
"data": {
"results": [
{
"title": "Example Result",
"url": "https://example.com",
"snippet": "A relevant search result..."
}
]
},
"meta": {
"adapter": "serpapi",
"durationMs": 342,
"timestamp": "2026-03-11T12:00:00.000Z"
}
}Error response
{
"ok": false,
"error": {
"code": "UPSTREAM_ERROR",
"message": "The upstream API returned a 429 status"
},
"meta": {
"adapter": "serpapi",
"durationMs": 120,
"timestamp": "2026-03-11T12:00:00.000Z"
}
}| Field | Type | Description |
|---|---|---|
| ok | boolean | Whether the request succeeded |
| data | object | Adapter-specific response payload (present when ok: true) |
| error | object | Error details with code and message (present when ok: false) |
| meta | object | Request metadata: adapter slug, duration in milliseconds, timestamp |
Error Handling
When a request fails, the response includes an error object with a machine-readable code and a human-readable message. Here are the common error codes:
| Code | HTTP Status | Description |
|---|---|---|
| VALIDATION_ERROR | 400 | The request body does not match the adapter's input schema. Check the contract for required fields and types. |
| UPSTREAM_ERROR | 502 | The upstream API returned an error. This could be a rate limit, server error, or invalid response from the third-party service. |
| SECRET_MISSING | 503 | The seller has not configured the required API key for this adapter. The service is temporarily unavailable. |
| ADAPTER_NOT_FOUND | 404 | The requested adapter slug does not exist or is not enabled on the seller's daemon. |
Tip: Always check the ok field before accessing data. When ok is false, use the error.code to determine how to handle the failure programmatically.
Rate Limits
Each adapter enforces its own rate limits, which are set by the seller. Rate limits are applied per buyer and are measured in requests per minute.
- Rate limits vary by adapter. Check the
/contractendpoint to see therateLimit.maxPerMinutevalue for each service. - When you exceed the rate limit, the adapter returns an HTTP
429status with aRetry-Afterheader indicating how many seconds to wait. - Implement exponential backoff in your client to handle rate limits gracefully.
# Check rate limits for an adapter
curl https://<tunnel-url>/<adapter>/contract | jq '.rateLimit'
# Example response
{
"maxPerMinute": 30
}Pricing
The ZeroClick Marketplace uses a pay-per-call pricing model. Each adapter sets its own price per successful call, and you are only charged when a request returns ok: true.
- Per-call pricing — Rates are shown in each adapter's
/contractendpoint under thepricePerCallfield (in USD). - No failed-call charges — If a request fails (returns
ok: false), you are not charged. - Transparent rates — Pricing is always visible before you make a call. Check the contract to see exactly what each request will cost.
# Check pricing for an adapter
curl https://<tunnel-url>/<adapter>/contract | jq '.pricePerCall'
# Example response
0.002Example: If an adapter charges $0.002 per call and you make 1,000 successful requests, your total cost is $2.00. Usage is tracked in real time on your marketplace dashboard.