Key point: Discovery registration happens on every payment verification. This means your listing stays current automatically. If you change your pricing, description, or schemas, the listing updates the next time a client pays.
| Feature | Description |
|---|---|
| Provider information | Your organization details appear as a dedicated top-level field, making it easy for consumers to identify who built the API |
| Top-level HTTP method | The HTTP method (GET, POST, etc.) is exposed at the resource level for immediate visibility, not buried inside nested schemas |
| Schema enrichment | Each payment option includes a description, MIME type, structured input/output schema, and pricing metadata |
| Automatic registration | APIs are registered from payment requests with zero manual intervention |
| Full x402 v2 compliance | Response format follows the industry standard, ensuring compatibility across the ecosystem |
GET https://gateway.kobaru.io/discovery/resources| Parameter | Type | Default | Description |
|---|---|---|---|
type | string | all | Filter by resource type: http, websocket, or grpc |
tags | string | all | Filter by tags (comma-separated, AND logic - resource must have ALL specified tags) |
limit | number | 20 | Results per page (1--100) |
offset | number | 0 | Pagination offset |
extensions.bazaar. It contains an info field with your API metadata.info fieldSDK limitation & storage: The standard SDK's declareDiscoveryExtension()doesn't expose parameters for tags, title, and provider. Use manual construction or our helper function to include these fields. Additionally, Kobaru stores them only for registered accounts (spam prevention). Schemas, pricing, and descriptions work for everyone.
{
"extensions": {
"bazaar": {
"info": {
"title": "Real-time Weather API",
"description": "Get current weather conditions for any location worldwide",
"method": "GET",
"input": {
"type": "application/json",
"schema": {
"properties": {
"location": {
"type": "string",
"description": "City name or coordinates"
}
}
}
},
"output": {
"type": "application/json",
"schema": {
"properties": {
"temperature": { "type": "number" },
"conditions": { "type": "string" },
"humidity": { "type": "number" }
}
}
},
"provider": {
"name": "WeatherCo",
"description": "Leading weather data provider",
"url": "https://weatherco.example.com",
"contact": "api@weatherco.example.com"
},
"tags": ["weather", "data", "real-time"],
"pricing": {
"model": "pay_per_request",
"amount": "1000",
"asset": "USDC"
}
}
}
}
}| Field | Type | Description |
|---|---|---|
title | string | A short, descriptive name for your API endpoint. SDK limitation: Use manual construction or helper. Stored only for registered accounts. |
description | string | What your API does, in one or two sentences |
method | string | HTTP method: GET, POST, PUT, PATCH, DELETE, HEAD, or OPTIONS |
input | object | Request format: type (MIME type) and schema (JSON Schema for parameters) |
output | object | Response format: type (MIME type) and schema (JSON Schema for the response body) |
provider | object | Your organization: name, description, url, and contact. SDK limitation: Use manual construction or helper. Stored only for registered accounts. |
tags | string[] | Categories and keywords for filtering. Use 2-5 specific, lowercase tags (e.g., ["ai", "video-processing"]). SDK limitation: Use manual construction or helper. Stored only for registered accounts. |
pricing | object | Pricing details: model (e.g., pay_per_request), amount, and asset |
http:// and https:// schemes are accepted{
"x402Version": 2,
"items": [
{
"resource": "https://api.example.com/weather",
"type": "http",
"method": "GET",
"x402Version": 2,
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"maxAmountRequired": "1000",
"asset": "USDC",
"payTo": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"maxTimeoutSeconds": 60,
"description": "Get current weather conditions for any location worldwide",
"mimeType": "application/json",
"outputSchema": {
"input": {
"method": "GET",
"type": "http",
"queryParams": {
"location": { "type": "string" }
}
},
"output": {
"type": "application/json",
"schema": {
"properties": {
"temperature": { "type": "number" },
"conditions": { "type": "string" },
"humidity": { "type": "number" }
}
}
}
},
"extra": {
"asset": "USDC",
"pricing": {
"model": "pay_per_request",
"amount": "1000",
"asset": "USDC"
}
}
}
],
"lastUpdated": "2026-01-27T12:30:00.000Z",
"provider": {
"name": "WeatherCo",
"description": "Leading weather data provider",
"url": "https://weatherco.example.com"
},
"metadata": {
"title": "Real-time Weather API",
"description": "Get current weather conditions for any location worldwide",
"tags": ["weather", "data", "real-time"]
}
}
],
"pagination": {
"total": 42,
"limit": 20,
"offset": 0
}
}accepts -- description, mimeType, outputSchema, and extra -- are automatically extracted from your bazaar metadata. AI agents use these fields to understand your API's interface without reading external documentation.| Field | Unregistered account | Registered account |
|---|---|---|
| Input/output schemas | ✅ Stored | ✅ Stored |
| Pricing information | ✅ Stored | ✅ Stored |
| Description | ✅ Stored | ✅ Stored |
| HTTP method | ✅ Stored | ✅ Stored |
| Tags | ❌ Filtered | ✅ Stored |
| Title | ❌ Filtered | ✅ Stored |
| Provider info | ❌ Filtered | ✅ Stored |
bazaar.info object manually. However:declareDiscoveryExtension() function doesn't have parameters for enrichment (convenience wrapper only)tags, title, or provider - it's a convenience wrapper with limited functionality.Tip: If you are already using Kobaru's Standard SDK or Transparent Proxy, adding bazaar discovery is a configuration change, not a code rewrite.
?tags=ai,video-processing)["finance", "exchange-rates", "real-time"]["api", "data", "service"] (too generic)description: "...") -- it's available for all merchantsname and url.extensions.bazaar object in your x402 payment configuration. That is the only requirement. There is no separate enrollment process.declareDiscoveryExtension() - doesn't expose enrichment parametersbazaar.info object yourself with all fieldsenrichDiscoveryExtension() - combines SDK convenience with enrichmentdeclareDiscoveryExtension() is a convenience wrapper designed for common use cases. It focuses on the most essential fields (method, input schema, output schema) and doesn't expose parameters for enrichment.bazaar.info object manually (see Approach 2) or use our helper (see Approach 3).enrichDiscoveryExtension() helper to bridge this gap with a clean API.extensions.bazaar object from your payment configuration, and your listing will not receive further updates..passthrough() are automatically filtered out, preventing information disclosure.