Discovery

GET /api/discover returns the full Proxagora API catalog. Filter by category, cost, or search term. Each entry has an ID, name, cost in USDC, and endpoint.

Discovery

The discovery endpoint returns the complete Proxagora API catalog. It's the starting point for any agent that needs to find and call external data APIs.

Endpoint

GET https://proxagora.com/api/discover

No authentication required. No payment. Free catalog access.

Response

{
  "apis": [
    {
      "id": "ip-geo",
      "name": "IP Geo",
      "category": "Network",
      "cost_usdc": 0.001,
      "description": "Geographic location, ASN, and carrier data for any IPv4/IPv6 address",
      "endpoint": "/api/ip-geo"
    },
    {
      "id": "domain-reputation",
      "name": "Domain Reputation",
      "category": "Domain",
      "cost_usdc": 0.005,
      "description": "Risk score, blacklist status, and threat intelligence for any domain"
    },
    {
      "id": "email-validation",
      "name": "Email Validation",
      "category": "Contact",
      "cost_usdc": 0.002,
      "description": "Deliverability check, MX validation, and disposable domain detection"
    }
  ],
  "total": 32
}

API Object Fields

| Field | Type | Description | |-------|------|-------------| | id | string | Unique identifier — used as {id} in call endpoint | | name | string | Human-readable name | | category | string | Category: Domain, Network, Contact, Tech, Intelligence, Business, Media, Travel | | cost_usdc | number | Per-call cost in USDC | | description | string | What the API returns | | endpoint | string | Full path (same as /api/{id}) |

Filtering

By Category

curl "https://proxagora.com/api/discover?category=Domain"

Available categories: Domain, Network, Contact, Tech, Intelligence, Business, Media, Travel

By Max Cost

curl "https://proxagora.com/api/discover?max_cost=0.005"

Returns only APIs at or below the specified USDC cost.

Combined Filters

curl "https://proxagora.com/api/discover?category=Contact&max_cost=0.01"

Current API Catalog

| ID | Name | Category | Cost | |----|------|----------|------| | ip-geo | IP Geo | Network | $0.001 | | whois | WHOIS | Domain | $0.001 | | weather | Weather | Travel | $0.001 | | github-stats | GitHub Stats | Tech | $0.001 | | youtube-metadata | YouTube Metadata | Media | $0.002 | | email-validation | Email Validation | Contact | $0.002 | | news-search | News Search | Media | $0.005 | | domain-reputation | Domain Reputation | Domain | $0.005 | | tech-stack | Tech Stack | Tech | $0.005 | | hackernews-search | HackerNews Search | Media | $0.005 | | reddit-search | Reddit Search | Media | $0.005 | | wikipedia-summary | Wikipedia Summary | Intelligence | $0.005 | | webpage-content | Webpage Content | Intelligence | $0.005 | | phone-validation | Phone Validation | Contact | $0.002 | | vat-validation | VAT Validation | Business | $0.002 | | exchange-rates | Exchange Rates | Business | $0.001 | | serp-results | SERP Results | Intelligence | $0.01 | | email-finder | Email Finder | Contact | $0.01 | | linkedin-enrichment | LinkedIn Enrichment | Business | $0.02 | | url-screenshot | URL Screenshot | Tech | $0.01 | | youtube-transcript | YouTube Transcript | Media | $0.005 | | reddit-thread | Reddit Thread | Media | $0.005 |

Using Discovery in Agent Code

import requests

def discover_apis(category: str = None, max_cost: float = None) -> list[dict]:
    params = {}
    if category:
        params["category"] = category
    if max_cost is not None:
        params["max_cost"] = max_cost
    
    response = requests.get("https://proxagora.com/api/discover", params=params)
    return response.json()["apis"]

# Find all cheap Network APIs
network_apis = discover_apis(category="Network", max_cost=0.005)

# Let an LLM pick the right API for a task
import json
catalog = discover_apis()
catalog_str = json.dumps([{"id": a["id"], "description": a["description"]} for a in catalog])

# Include in LLM system prompt or tool definition
const catalog = await fetch('https://proxagora.com/api/discover')
  .then(r => r.json())
  .then(d => d.apis)

// Find API by name
const ipGeo = catalog.find((a: any) => a.id === 'ip-geo')
console.log(`Call /api/${ipGeo.id} — costs $${ipGeo.cost_usdc} USDC`)

Caching

The catalog changes infrequently (new APIs added, existing ones updated). For production agents:

  • Cache the response for 5–60 minutes
  • Refresh on startup
  • Don't call discover on every API call — it's expensive in latency
import time

_catalog_cache = None
_cache_time = 0
CACHE_TTL = 300  # 5 minutes

def get_catalog():
    global _catalog_cache, _cache_time
    if _catalog_cache is None or time.time() - _cache_time > CACHE_TTL:
        _catalog_cache = discover_apis()
        _cache_time = time.time()
    return _catalog_cache
x402 ProtocolCalling APIs