mirrored listing x402 eip155:8453

List and search podcasts

List and search podcasts. Returns a paginated list of podcasts, with filters for topic, language, suitability tier, popularity, and format.

Do you run api.particle.pro? This listing was mirrored from Coinbase's public Bazaar. Claim it in 30 seconds — no account required — and it becomes verified, permanently overriding the mirrored copy.

Claim this listing
10000 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-06
updated

Provider

api.particle.pro · discovered, not yet claimed by its owner

Payment (x402 accepts[])

[
  {
    "scheme": "exact",
    "network": "eip155:8453",
    "payTo": "0x59f3a6dcb6f482c53872dd8f8f9e1f9161a1c5f7",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "10000",
    "maxTimeoutSeconds": 300
  }
]

Output schema

{
  "bazaar": {
    "info": {
      "input": {
        "method": "GET",
        "queryParams": {
          "format_signal": [
            "interview"
          ],
          "guest_frequency": [
            "regular",
            "always"
          ],
          "language": "fr"
        },
        "type": "http"
      }
    },
    "schema": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "input": {
          "additionalProperties": false,
          "properties": {
            "method": {
              "enum": [
                "GET"
              ],
              "type": "string"
            },
            "queryParams": {
              "properties": {
                "cursor": {
                  "description": "Opaque pagination cursor from previous response",
                  "type": "string"
                },
                "format_signal": {
                  "description": "Filter by detected production format. Pass a comma-separated list to match any of several formats — e.g. panel,call_in. Values mirror the format.signals field on podcast responses; a show can carry several signals.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "guest_frequency": {
                  "description": "Filter by how often episodes feature a guest. Pass a comma-separated list to match any of several buckets — e.g. regular,always for interview-driven shows, or never for shows that don't host guests. Only matches podcasts with enough analyzed episodes to judge; values mirror the format.guest_frequency field on podcast responses.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "has_ads": {
                  "description": "Filter by advertiser presence. Pass false to find ad-free shows — an assertion that requires the show to have enough analyzed episodes, so sparsely-analyzed podcasts are excluded rather than presumed ad-free.",
                  "enum": [
                    "true",
                    "false"
                  ],
                  "type": "string"
                },
                "has_video": {
                  "description": "Filter by whether episodes have discovered video versions (e.g. YouTube releases).",
                  "enum": [
                    "true",
                    "false"
                  ],
                  "type": "string"
                },
                "language": {
                  "description": "Filter by the podcast's language (ISO 639-1 code, e.g. 'en', 'fr'). Matches the primary language subtag, so 'fr' covers 'fr-FR'.",
                  "type": "string"
                },
                "limit": {
                  "description": "Results per page",
                  "format": "int64",
                  "type": "integer"
                },
                "max_avg_episode_minutes": {
                  "description": "Only podcasts whose average episode runs at most this many minutes.",
                  "format": "int64",
                  "type": "integer"
                },
                "max_episodes_per_week": {
                  "description": "Only podcasts publishing at most this many episodes per week on average (e.g. 0.5 for fortnightly-or-slower shows).",
                  "format": "double",
                  "type": "number"
                },
                "min_avg_episode_minutes": {
                  "description": "Only podcasts whose average episode runs at least this many minutes. Combine with max_avg_episode_minutes to target a length band (e.g. 20–40 minute commute shows).",
                  "format": "int64",
                  "type": "integer"
                },
                "min_episodes_per_week": {
                  "description": "Only podcasts publishing at least this many episodes per week on average (e.g. 5 for weekday dailies). Cadence is measured over the trailing 90 days; podcasts tracked too briefly to measure are excluded.",
                  "format": "double",
                  "type": "number"
                },
                "popularity_threshold": {
                  "description": "Restrict results to podcasts whose global popularity percentile is at least this value (accepted range [0,1]). Omitting the parameter or passing 0 disables the filter; only a value greater than 0 activates it. Popularity is always global — a cume_dist ranking over all currently-charting podcasts (Apple Podcasts) — never scoped to topic_id or any other filter. When the filter is active (threshold > 0), podcasts not currently charting have no percentile and are excluded, so a high threshold combined with a narrow topic_id may return zero results; lower or remove the threshold to widen the set.",
                  "format": "double",
                  "type": "number"
                },
                "publishing_status": {
                  "description": "Filter by publishing activity: active shows have released an episode within the last 90 days; dormant shows have not.",
                  "enum": [
                    "active",
                    "dormant"
                  ],
                  "type": "string"
                },
                "q": {
                  "description": "Search the catalog by podcast name. GET /v1/podcasts/search is the canonical search endpoint and accepts the same parameters. The search is forgiving: it handles typos, missing or extra words ('offline jon favreau' finds Offline with Jon Favreau), a name plus qualifiers ('equity techcrunch'), and pasted episode titles ('Ferrari | Acquired' finds Acquired). The best matches come first, and each result's match_quality tells you how confident the match is — including when a show matched only through its description (match_quality=description) rather than its name.",
                  "type": "string"
                },
                "slug": {
                  "description": "Filter by exact podcast slug (e.g., 'all-in'). Slugs are stable, human-readable identifiers returned on every podcast object.",
                  "type": "string"
                },
                "sort": {
                  "description": "Result ordering. relevance — the default whenever q is present — ranks by how well each podcast matches the query, breaking ties by popularity. popularity orders purely by the global popularity percentile (most popular first; podcasts not currently charting sort last), and also overrides topic_id's concentration ordering. Without q or topic_id, results are popularity-ordered either way.",
                  "enum": [
                    "relevance",
                    "popularity"
                  ],
                  "type": "string"
                },
                "suitability_tier": {
                  "description": "Filter by brand-suitability tier (IAB Tech Lab Brand Safety & Suitability Framework, formerly GARM). Only returns podcasts whose most recent suitability analysis assigned this tier. Podcasts without a suitability analysis are excluded when this filter is set.",
                  "enum": [
                    "SAFE",
                    "LIMITED",
                    "SENSITIVE",
                    "UNSAFE"
                  ],
                  "type": "string"
                },
                "topic_id": {
                  "description": "Filter by topic ID, ancestry slug (e.g., technology/artificial-intelligence), or ancestry path hash. Matches podcasts where the topic accounts for at least 20% of the show's episodes, ranked by topic concentration — not merely podcasts that mention it once.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": {
              "const": "http",
              "type": "string"
            }
          },
          "required": [
            "type",
            "method"
          ],
          "type": "object"
        }
      },
      "required": [
        "input"
      ],
      "type": "object"
    }
  }
}

Use it

curl

curl "https://api.particle.pro/v1/podcasts"
# -> 402 Payment Required, accepts[] lists how to pay
# retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid

JavaScript

const res = await fetch("https://api.particle.pro/v1/podcasts");
if (res.status === 402) {
  const { accepts } = await res.json();
  // pay one of accepts[] via an x402 client, then retry with the payment header
}

Python

import httpx
res = httpx.get("https://api.particle.pro/v1/podcasts")
if res.status_code == 402:
    accepts = res.json()["accepts"]
    # pay one of accepts[] via an x402 client, then retry with the payment header

Machine-readable

Everything on this page is also available as clean JSON at /resources/11823.json, and this resource appears in /discovery/resources and /discovery/search.