Particle Pro

Real-time news, company, and podcast intelligence APIs for developers — every story, every public company, and every episode, structured and ready to query.

SearchLiveeip155:8453Exactvia cdp
Podcast episode searchPodcastsMedia intelligenceParticle pro
Calls · 30d
2→ 0%
This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 32 snapshots so far.
$8.80
Verified settled volume
625 settlements proven x402 by their on-chain EIP-3009 marker.
$0.030
Listed price
As published in the catalog. Always read the live 402 before paying.
4
Calls · 30d
Upstream's own call count for this endpoint, not ours.
2
Unique payers · 30d
Last called 2026-11-13 04:46Z
–
Upstream on-chain volume
Reported by the source catalog.
Paid to
0x59f3a6dcb6f482c53872dd8f8f9e1f9161a1c5f7

The wallet the 402 directs payment to. Its full payment record is on the merchant page.

Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

Provider

The payTo wallet does not resolve to a registered ERC-8004 agent. That is not a verdict on the service; most of the catalog is unregistered.

Recent payments · which agents last used it

Every indexed settlement paid to this service’s wallet, newest first. The index does not record which endpoint a payment was for, so if this wallet serves more than one endpoint, the rows include payments for the others. Paged up to the newest 5,000; the full history is on the merchant page.

Payer PayeeChainAmountx402RouteAgeTxn hash
0x97ef…e802Particle ProBaseBase$0.01100%coinbase18d ago0x7d2246…8c0c48
0x72c5…159bParticle ProBaseBase$0.03100%coinbase23d ago0xc6a122…121300
0xa19f…acccParticle ProBaseBase$0.01100%coinbase24d ago0xf6df5e…814df5
0xa19f…acccParticle ProBaseBase$0.04100%coinbase24d ago0x564849…05e976
0x54e1…f4e0Particle ProBaseBase$0.01100%coinbase26d ago0x6374d6…8b22ac
0x54e1…f4e0Particle ProBaseBase$0.01100%coinbase26d ago0x411dad…7b23a0
0x54e1…f4e0Particle ProBaseBase$0.01100%coinbase26d ago0x4654dd…51a19b
0x54e1…f4e0Particle ProBaseBase$0.01100%coinbase26d ago0x4fab9c…f3a09e
0x3ed9…430eParticle ProBaseBase$0.04100%coinbase27d ago0x61dce0…83cc6c
0xa19f…acccParticle ProBaseBase$0.01100%coinbase31d ago0x158313…d425d0
0xa19f…acccParticle ProBaseBase$0.04100%coinbase31d ago0xc18bbc…8ed23e
0xa1d1…1978Particle ProBaseBase$0.01100%coinbase33d ago0x2433f4…9c38b2
0xa1d1…1978Particle ProBaseBase$0.01100%coinbase33d ago0xa1115e…73b81a
0x9506…1a58Particle ProBaseBase$0.01100%coinbase37d ago0xfc1c92…3cd78e
0x9506…1a58Particle ProBaseBase$0.01100%coinbase37d ago0x337fb1…cf2020
0x9506…1a58Particle ProBaseBase$0.01100%coinbase37d ago0x42cddd…e82b07
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xebed54…376cfd
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xa118b3…a4e8ff
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xf91fd5…20f6c2
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xc1cf26…8c2d38
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xbe6cfc…c5c197
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0x67f730…be397a
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xbf9919…4ede7d
0x6a0b…4518Particle ProBaseBase$0.04100%coinbase37d ago0x35ade4…90cbfa
0x6a0b…4518Particle ProBaseBase$0.01100%coinbase37d ago0xa99850…3599ae

Live 402 challenge

Captured by the enrichment pass, not read just now. Prices can change. Always read the 402 the endpoint answers with.

{
  "type": "https://docs.particle.pro/errors/payment_required",
  "title": "Payment Required",
  "detail": "This request costs $0.03 in USDC. Pay with x402 using PAYMENT-REQUIRED, or MPP using the WWW-Authenticate Payment challenge, or authenticate with a pp_ API key.",
  "status": 402,
  "resolve": {
    "url": "https://docs.particle.pro/x402",
    "action": "pay_per_request",
    "message": "Retry with one payment: x402 PAYMENT-SIGNATURE or MPP Authorization: Payment. You can also use an API key."
  },
  "error_code": "payment_required"
}

Accepts

The payment requirements as published to the catalog. Read the live 402 before paying: a price here is a claim, not a quote.

0.03USDC≈ $0.03 USD
on Base · exact scheme

Pay 0.03 USDC on Base to 0x59f3…1c5f7. The signed payment is good for 5 minutes.

USD Coin contract
0x8335…02913
Payment window
5 minutes
As published
30000 smallest units
The catalog’s raw entry
[
  {
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "extra": {
      "name": "USD Coin",
      "version": "2"
    },
    "payTo": "0x59f3a6dcb6f482c53872dd8f8f9e1f9161a1c5f7",
    "amount": "30000",
    "scheme": "exact",
    "network": "eip155:8453",
    "maxTimeoutSeconds": 300
  }
]

Extensions

{
  "bazaar": {
    "info": {
      "input": {
        "type": "http",
        "method": "GET",
        "queryParams": {
          "since": "2024-01-01",
          "until": "2024-06-01",
          "language": "fr",
          "speaker_role": [
            "guest",
            "panelist"
          ]
        }
      }
    },
    "schema": {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "input"
      ],
      "properties": {
        "input": {
          "type": "object",
          "required": [
            "type",
            "method"
          ],
          "properties": {
            "type": {
              "type": "string",
              "const": "http"
            },
            "method": {
              "enum": [
                "GET"
              ],
              "type": "string"
            },
            "queryParams": {
              "type": "object",
              "properties": {
                "role": {
                  "enum": [
                    "guest",
                    "host",
                    "panelist",
                    "correspondent",
                    "speaker",
                    "mention"
                  ],
                  "type": "string",
                  "description": "How the entity must relate to the episode. Speaking roles: 'guest', 'host', 'panelist', 'correspondent', or 'speaker' for any of them. 'mention' means the entity is talked about rather than speaking. Omit to match both. Matches the role values on /v1/podcasts/episodes."
                },
                "sort": {
                  "enum": [
                    "relevance",
                    "recency"
                  ],
                  "type": "string",
                  "description": "Sort order. Defaults to relevance."
                },
                "type": {
                  "enum": [
                    "INTRO",
                    "PERSONAL_BANTER",
                    "TOPIC_DISCUSSION",
                    "INTERVIEW",
                    "TRANSITION",
                    "AD",
                    "OUTRO"
                  ],
                  "type": "string",
                  "description": "Segment type filter."
                },
                "limit": {
                  "type": "integer",
                  "format": "int64",
                  "description": "Results per page (1-100, default 25)."
                },
                "since": {
                  "type": "string",
                  "description": "Only segments from episodes published after this date."
                },
                "until": {
                  "type": "string",
                  "description": "Only segments from episodes published on or before this date. A bare date includes that whole day."
                },
                "cursor": {
                  "type": "string",
                  "description": "Opaque cursor from a previous response."
                },
                "format": {
                  "enum": [
                    "full",
                    "compact"
                  ],
                  "type": "string",
                  "description": "Response shape. 'full' (default) carries each match's bounded dialogue windows and overlapping clips. 'compact' omits windows and clips and skips the transcript load and line scoring that produce them, so the page is a fraction of the size and returns sooner: each match keeps its episode, its segment (id, title, description, summary, bounds) and its relevance score. Use it to screen many results — a fan-out over companies, themes, or dates — and fetch dialogue only for the matches that survive, via GET /v1/podcasts/segments/{id}/transcript or a full-format search narrowed with episode_id."
                },
                "context": {
                  "type": "integer",
                  "format": "int64",
                  "description": "Lines of surrounding dialogue around each matched line (1-15, default 1). Widens each match's transcript window in place — request more context instead of fetching the full transcript. Window size stays bounded even at the maximum. Ignored when format=compact."
                },
                "speaker": {
                  "type": "string",
                  "description": "Optional person slug or ID (a person's entity slug or ID works too). Keeps only segments in which this person speaks a line, and only their lines can be a window's match: 'did X say Y' rather than entity_id's 'Y came up in an episode with X'. With keyword_search, the person's own lines in the segment must carry every quoted phrase, and every unquoted term under keyword_match=required; a phrase may run across their consecutive lines but never into someone else's. Only speaking roles count: a clip of the person played on another show (a soundbite) is not them speaking, so their original turns up and its replays do not. With format=compact the page keeps the same shape and the same filtering, but loads transcripts to apply it. Retrieval narrows to the person's episodes before the line check, so lines of theirs that rank below other segments of those episodes can be missed: an empty page does not prove they never said it. Narrow with podcast_id, episode_id, since or until, or try semantic_search. Cannot be combined with the guest_ filters."
                },
                "language": {
                  "type": "string",
                  "description": "Restrict to episodes of podcasts in this language (ISO 639-1 code, e.g. 'fr'). Matches the podcast's primary language subtag, so 'fr' covers 'fr-FR'."
                },
                "entity_id": {
                  "type": "string",
                  "description": "Optional entity or person slug or ID. Filters results to episodes featuring this entity. A person with no linked entity matches the episodes they speak in. A slug that names both an entity and a person means the entity; pass the person's ID to filter by the person. For 'every line about X', use /v1/podcasts/mentions instead."
                },
                "company_id": {
                  "type": "string",
                  "description": "Optional company slug, domain, or ID. Resolves to the company's linked entity and applies as a filter."
                },
                "episode_id": {
                  "type": "string",
                  "description": "Filter to a specific episode by slug or ID."
                },
                "podcast_id": {
                  "type": "string",
                  "description": "Podcast slug, internal ID, or numeric iTunes ID."
                },
                "entity_type": {
                  "type": "string",
                  "description": "Optional entity category slug. Filters to episodes that *mention* any entity in that category (e.g. 'company', 'school', 'book'). Speakers are always people, so this filter only narrows mentioned entities. Cannot be combined with 'role'. Ignored when entity_id resolves to a specific entity. See GET /v1/entities/types for the available slugs."
                },
                "guest_field": {
                  "type": "string",
                  "description": "Only segments of episodes with a guest listed under this ANZSRC 2020 field of research (code, slug, or title)."
                },
                "speaker_role": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Keep only lines whose speaker held one of these roles in the episode, comma-separated and case-insensitive: guest, panelist, host, correspondent, or speaker for any of them. speaker_role=guest,panelist leaves out the hosts' lines, such as a news show's scripted reads. Every is_match line is spoken in one of the roles, and a segment is returned only when one of its lines is; with keyword_search, those lines must say it. No default: omit it to keep every speaker's lines. Not role, which is how entity_id or company_id relates to the episode. The roles applied are echoed in speaker_roles. With speaker, keeps that person's lines in these roles, and is refused when they have never spoken in any of them. Beside the guest_ filters, which count guests' and panelists' lines, it must name guest or panelist."
                },
                "keyword_match": {
                  "enum": [
                    "required",
                    "ranked"
                  ],
                  "type": "string",
                  "description": "How unquoted keyword_search terms are applied. 'required' (default) filters to segments containing every term, so results are guaranteed to contain what you typed — this also constrains semantic_search, making a hybrid query an intersection of the two. 'ranked' instead lets unquoted terms only boost BM25 relevance without excluding anything, which widens recall for loose bag-of-words queries but returns segments that may contain none of them. Quoted phrases are unaffected: they filter in BOTH modes, so to relax a phrase remove its quotes. Ignored when keyword_search is empty."
                },
                "guest_capacity": {
                  "enum": [
                    "researcher",
                    "licensed_professional",
                    "practitioner",
                    "executive_founder",
                    "public_official",
                    "journalist_analyst",
                    "creator_entertainer",
                    "athlete_coach",
                    "clergy",
                    "firsthand",
                    "layperson"
                  ],
                  "type": "string",
                  "description": "Only segments of episodes with a guest who knows their field in this capacity, such as executive_founder for founders. It narrows the other filters; an everyday word for a capacity passed as guest_occupation (founders, politicians) lands here too."
                },
                "guest_in_field": {
                  "type": "boolean",
                  "description": "Only segments of episodes with a guest speaking within their field (the guest the other guest_ filters select, when given)."
                },
                "guest_standing": {
                  "enum": [
                    "established",
                    "self_described",
                    "unverified"
                  ],
                  "type": "string",
                  "description": "Only segments of episodes with a guest whose standing is recognized this way."
                },
                "keyword_search": {
                  "type": "string",
                  "description": "BM25 lexical search over dialogue. Use when an exact token must appear verbatim — tickers, drug names, product codes. By default every token must appear somewhere in the matched segment (see keyword_match). Wrap any token sequence in double quotes (e.g. \"machine learning\") to additionally require those words adjacent and in order in the segment's spoken dialogue — a speaker's own name is not indexed as dialogue, so quoting a person's name finds segments where the name appears in what was said, not segments they speak in. Adjacency spans consecutive lines, so a phrase may rarely straddle a line break. Multiple quoted phrases AND together (e.g. \"central bank\" \"interest rates\"). There is no boolean OR — a bare OR is treated as an ordinary word, so pass alternatives as separate requests."
                },
                "guest_seniority": {
                  "enum": [
                    "professional",
                    "senior",
                    "distinguished"
                  ],
                  "type": "string",
                  "description": "Only segments of episodes with a guest at this seniority or above."
                },
                "semantic_search": {
                  "type": "string",
                  "description": "Vector-similarity search by meaning. Express the query the way you'd describe the topic to a colleague — paraphrase tolerant, finds segments that express the same idea in different vocabulary. Combine with keyword_search for hybrid ranking. Describe a topic, not a name: to find a specific person or company, filter with entity_id / company_id (or use /v1/podcasts/mentions for every line about them) — and for an exact token like a ticker, use keyword_search. Describe a topic, not a tone: optimistic, skeptical, predictions and other ways something is said go in speaker_statement_characteristics ('AI drug discovery', not 'optimistic predictions about AI drug discovery')."
                },
                "guest_occupation": {
                  "type": "string",
                  "description": "Only segments of episodes with a guest listed under this SOC 2018 or ISCO-08 occupation (code, slug, or title), including a SOC group or everyday name such as physicians or doctors. A word with no occupation filters by the field of research or capacity it names: oncologists is field 3211, founders is guest_capacity=executive_founder."
                },
                "guest_practicing": {
                  "type": "boolean",
                  "description": "Only segments of episodes with a guest who still works in guest_occupation, a SOC 2018 occupation or group."
                },
                "speaker_statement_characteristics": {
                  "type": "object",
                  "description": "Keep only lines said a certain way, by their speaker statement characteristics: speaker_statement_characteristics[certainty]=confident&speaker_statement_characteristics[temporal_orientation]=future finds confident predictions. Each key is an axis (sentiment, certainty, specificity, temporal_orientation) and its value one or more of that axis's labels, comma-separated: labels on one axis match any of them, and axes combine with AND. Every is_match line carries labels the filter accepts, and a segment is returned only when one of its lines does. Pass the topic as semantic_search: how something is said belongs here, never in the search text. Without a topic (no semantic_search or keyword_search), the filter with episode_id, speaker or a guest_ filter returns the strongest lines said that way, at most 50, strongest first, with match.source characteristics and no relevance_score; it cannot be scoped by entity_id, company_id or entity_type (use /v1/podcasts/mentions with sort=strength). With speaker or the guest_ filters, only the lines the selected people say count: confident predictions by cardiologists are guest_occupation=cardiologists with these. When more than 10,000 of their lines carry the labels, the newest 10,000 are searched; narrow with since, until, podcast_id or another label to reach older ones. The guest_ filters must name guest_occupation, guest_field or guest_capacity here and may select at most 5,000 guests with at most 50,000 appearances between them; narrow a broader filter with guest_practicing, guest_seniority or guest_standing. Cannot be combined with keyword_search alone, a quoted keyword_search phrase, or keyword_match=ranked."
                }
              }
            }
          },
          "additionalProperties": false
        }
      }
    }
  }
}

Provenance

Seen in the source catalog
2026-11-13 04:46Z
Last indexed by Roundhouse
2026-11-14 19:10Z
Last enriched (probe, favicon, geo)
2026-09-24 07:15Z
x402 version
2
Max timeout
300s
Liveness probe
HTTP 402
Report

Hand this page to an agent

Copy the prompt and paste it into Claude, an MCP client or your own agent: it will vet this service and call it over the free read API. No key, no account.

GET api.roundhouseai.io/v0/endpoints

This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 32 snapshots so far. Verified volume counts only settlements with an on-chain EIP-3009 marker.

Open skill.md
Show the prompt
Using Roundhouse, look up the x402 service Particle Pro and tell me whether it is
worth paying: what a call costs, whether the endpoint answered when last probed, and what
its payment record actually shows.

curl -s 'https://api.roundhouseai.io/v0/endpoints?q=Particle%20Pro'
curl -s 'https://api.roundhouseai.io/v0/merchants/<the payTo wallet returned above>'

Then call it: read the price from the live 402 at https://api.particle.pro/v1/podcasts/episodes/search, never from
a cached figure, and pay with an x402 client.

The /v0 API needs an API key (`authorization: Bearer rh_live_…`) on everything except
/v0/unified* and /v0/endpoints. Either pay over x402 (mint a personal key for $0.01 at
GET https://api.roundhouseai.io/v0/test/x402), or ask me for an organization key, which I create at
https://roundhouseai.io/dashboard/connections. If you have neither, ask before going further.

If you do not have Roundhouse tools or skills installed, read
https://roundhouseai.io/skill.md first — it is the whole procedure.