Skip to content
GridRouterhome

Search

Search providers, capabilities and pages

Docs

MCP server

Every GridRouter operation as an MCP tool, plus catalog resources, a live log subscription and prompts.

Before you start

https://mcp.gridrouter.io/mcp serves the same operations as the REST API. Each tool is one operation: the same input schema, the same result, the same errors. Tools a connection's scopes do not cover are not listed; public tools such as catalog_search are always listed.

Every tool result includes the call's cost in _meta["io.relaygrid/cost_micro"]. A failed call returns isError: true with code: message text and the error body as structured content.

Resources

URIWhat
grid://catalog/endpoints/{provider}/{endpoint}One endpoint's definition, pricing and quality
grid://catalog/capabilitiesEvery capability and the endpoints that serve it
logs://liveThe newest calls, waterfall steps, jobs, lists and alerts; subscribable. Filter with a query: logs://live?capability=people.email.find&status=error (logs:read)
grid://jobs/{id}Status and result of a job (jobs)
grid://lists/{id}Progress of a list run (lists)

Tools that start a job or list return a resource_link to its grid:// URI.

Prompts

  • find_verified_email (first_name, last_name, domain): runs people.email.find, then email.verify on the result, and reports the total cost.
  • research_account (domain, budget_usd, default 0.50): quotes each call and keeps the research under budget.

Tools

The same list is available as JSON from GET https://api.gridrouter.io/v1/tools?format=mcp (or openai / anthropic for function-calling schemas).

ToolRESTScopeDescription
catalog_searchGET /v1/catalog/endpointspublicFind vendor endpoints by keyword (capability, vendor, what they return). Returns price and quality.
catalog_getGET /v1/catalog/endpoints/{provider}/{endpoint}publicFull definition of one endpoint: input JSON Schema, pricing model and quality.
vendor_searchGET /v1/catalog/vendorspublicEvery GTM data vendor GridRouter knows about (integrated or researched): API access, spec status, published rate limits and marketplace listings.
vendor_getGET /v1/catalog/vendors/{slug}publicOne vendor's sourced record: company, API surface, docs, pricing, data, compliance, relationships and marketplace listings, each with sources and confidence.
vendor_openapiGET /v1/catalog/vendors/{slug}/openapipublicThe stored OpenAPI document for a vendor: the vendor's official spec, or one GridRouter reconstructed from its docs (x-reconstructed, x-confidence, x-source-url on every operation).
vendor_rate_limitsGET /v1/catalog/vendors/{slug}/rate-limitspublicPublished rate limits (per window, concurrency, headers, 429 behaviour) with source and check date, and the pacing GridRouter derives from them.
capabilities_listGET /v1/catalog/capabilitiespublicCapabilities (normalized tasks like people.email.find) and the endpoints that serve each.
categories_listGET /v1/catalog/categoriespublicTop-level GTM data categories.
leaderboard_getGET /v1/catalog/leaderboards/{capability}publicEndpoints for a capability ranked by usage-derived quality (Wilson lower bound).
quotePOST /v1/quote/{provider}/{endpoint}callWorst-case cost of calling an endpoint with this input, without calling it.
callPOST /v1/call/{provider}/{endpoint}callCall one vendor endpoint. Reserves the worst-case cost, charges the actual cost. Async vendors return a job. Runs as an MCP task.
run_autoPOST /v1/run/autorunAuto router: GridRouter picks the capability from the input fields you have (and the output fields you ask for), then routes it like run. The chosen capability and the alternatives are returned.
runPOST /v1/run/{capability}runRouted call: GridRouter picks vendors (waterfall/cheapest/best) until one hits. Only hits are charged on per-success vendors.
call_getGET /v1/calls/{id}callCost, timings (total, upstream, overhead, TTFB, queue), provider, outcome and every routed attempt of one call, like OpenRouter's generation lookup. Keys without logs:read only see calls they made. Available a few seconds after the call.
presets_listGET /v1/presetscatalog:readSaved routing presets for this org: provider preferences, field selection, max cost and stop rule. Use one as preset: "@slug" on run.
presets_getGET /v1/presets/{slug}catalog:readOne saved routing preset.
presets_createPOST /v1/presetspresets:writeCreate or replace a routing preset shared within the org (order/only/ignore/sort/max price/data policy, credential, fields, max cost, stop rule).
presets_deleteDELETE /v1/presets/{slug}presets:writeDelete a preset. Requests that name it fail with not_found afterwards.
job_createPOST /v1/jobsjobsRun any endpoint in the background through the job queue, with per-vendor pacing. Runs as an MCP task.
job_getGET /v1/jobs/{id}jobsStatus and result of a queued or async job.
list_createPOST /v1/listslistsRun an endpoint or capability over up to 10,000 rows in the background. Runs as an MCP task.
list_getGET /v1/lists/{id}listsProgress and cost of a list run.
list_rowsGET /v1/lists/{id}/rowslistsOne page of per-row results for a list.
balance_getGET /v1/balancebalance:readPrepaid balance, amount held for in-flight calls, and what is available.
budget_setPUT /v1/budgetskeys:writeCap spend for the org, one key, or one agent per day, month or total.
keys_listGET /v1/keyskeys:writeAPI keys for this org (never the secret).
keys_createPOST /v1/keyskeys:writeMint a scoped key. The secret is returned once.
keys_revokeDELETE /v1/keys/{id}keys:writeRevoke a key. Billable calls stop immediately.
recovery_codes_createPOST /v1/recovery-codeskeys:writeOwner only (a * key): issue 10 one-time recovery codes that can mint a new owner key if every key is lost. Replaces earlier codes; shown once.
keys_rotatePOST /v1/keys/{id}/rotatekeys:writeMint a replacement key with the same scopes and limits; the old key keeps working for grace_seconds (default 24 h), then expires.
keys_limit_setPUT /v1/keys/{id}/limitkeys:writeCap what one key can spend, resetting daily, weekly, monthly or never. null removes the cap. Calls over the cap fail with budget_blocked.
agents_createPOST /v1/agentsagents:writeCreate an agent with its own budget and mint an agent key for it.
log_views_listGET /v1/logs/viewslogs:readYour saved log views plus views shared with the workspace, newest first. A view is a query in the log query language and the visible columns.
log_views_createPOST /v1/logs/viewslogs:readSave the query and visible columns under a name. shared: true (owners and admins only) makes it visible to the whole workspace; replace: true overwrites your view with the same name.
log_views_updatePUT /v1/logs/views/{id}logs:readRename a view or change its query, columns or sharing. You can change your own views; owners and admins can also change shared ones.
log_views_deleteDELETE /v1/logs/views/{id}logs:readDelete one of your views (owners and admins can also delete shared views).
log_views_importPOST /v1/logs/views/importlogs:readOne-time move of views and pins the dashboard kept in the browser. Views whose names you already use and calls already pinned are skipped.
log_pins_listGET /v1/logs/pinslogs:readCalls you pinned to the top of the log viewer, newest pin first, each with its current log row (null once the call is past log retention).
log_pins_createPOST /v1/logs/pinslogs:readPin a call to the top of the log viewer. You keep up to 20 pins; the oldest drops off.
log_pins_deleteDELETE /v1/logs/pins/{call_id}logs:readRemove a pinned call.
logs_listGET /v1/logslogs:readEvery call and routed attempt for this org, newest first (360-day retention). Filter by time, outcome, status, provider, capability, endpoint, key, agent, client, mode, credential, error code, latency and cost; cursor-paginated.
logs_facetsGET /v1/logs/facetslogs:readCounts per value (outcome, status, provider, capability, endpoint, key, client…) and latency/cost ranges for the same filters as logs_list.
logs_statsGET /v1/logs/statslogs:readCalls, error rate, p50/p95/p99 latency, spend, a hit/miss/failed timeline and spend by provider over time, for the same filters as logs_list.
logs_billingGET /v1/logs/billinglogs:readPer vendor, how many of your own-key (BYOK) calls were billed as the vendor's published rule says, how many were charged for a miss, double-charged on a retry or at the wrong price, and the credits and dollars at stake. Same filters as logs_list.
logs_getGET /v1/logs/{id}logs:readOne call with timings, its redacted request/response body (audit-logged), the other attempts in its routed run or list, and its ledger entries.
settings_getGET /v1/settingslogs:readOrg data settings, such as whether request/response bodies are stored.
settings_updatePUT /v1/settingskeys:writeTurn body storage on or off (off stops new bodies from being kept) and set how many days of call log members and keys can read (30, 90, 180 or 360).
credentials_listGET /v1/credentialscredentials:writeYour own vendor keys (BYOK) stored for this org: provider, slot, label, field names, the key's last four characters and its last test result. Secrets are write-only and never returned.
credentials_putPUT /v1/credentials/{provider}credentials:writeStore your own key for a provider as the primary or fallback slot, envelope-encrypted. BYOK calls are never charged by GridRouter.
credentials_removeDELETE /v1/credentials/{provider}credentials:writeDelete one slot of your own key for a provider. Calls fall back to the next slot.
credentials_testPOST /v1/credentials/{provider}/testcredentials:writeCall the provider's free, read-only test endpoint (for example a credit balance) with your stored key. Never charged; the call is logged.
credentials_verifyPOST /v1/credentials/{provider}/verifycredentials:writeCall the provider's free, read-only test endpoint with a key that is not stored yet. Nothing is saved; the key is used for this one call. Never charged; the call is logged.
credentials_updatePUT /v1/credentials/{provider}/labelcredentials:writeSet or clear the label of a stored key. The secret is not touched.
credentials_swapPOST /v1/credentials/{provider}/swapcredentials:writeMake the fallback key the primary and the primary the fallback for one provider. Takes effect on the next call.
apps_listGET /v1/appslogs:readApps attributed on your calls (X-Grid-App, or HTTP-Referer + X-Title like OpenRouter) with 30-day usage, plus how each is listed.
apps_putPUT /v1/apps/{id}keys:writeName an attributed app and opt it in (or out) of the public rankings and showcase. A domain-style id must match its URL; another org's public id is refused.
auth_code_createPOST /v1/auth/codeskeys:writeConsent step of Sign in with GridRouter (OAuth PKCE, S256): a signed-in member approves an app and gets a one-time code (10 minutes) to redirect back with.
auth_keys_exchangePOST /v1/auth/keyspublicFinal step of Sign in with GridRouter: exchange the one-time code and its PKCE code_verifier for a user-controlled key with call/run scopes and any credit limit the user set.
rankings_getGET /v1/rankingspublicTop capabilities, providers, categories and opted-in apps by calls and hits over the last day, week or month across all GridRouter traffic, with change vs the previous window and trending movers.
apps_directoryGET /v1/catalog/appspublicPublic apps built on GridRouter (owners opted in), ranked by calls with their top capabilities and providers.
app_profile_getGET /v1/catalog/apps/{id}publicOne public app: 30-day usage by day, top capabilities and providers.
activity_getGET /v1/catalog/activitypublicPer-endpoint uptime (share of calls without a vendor-side failure), p50/p95 latency and volume over time for a capability or provider, plus the top public apps using it.
status_getGET /v1/statuspublicLive health per provider: vendor failures in the last 30 seconds (the router's outage signal), last-hour error rate and latency, and 24-hour and 30-day uptime with daily bars.
tools_exportGET /v1/toolspublicEndpoint and capability tools in OpenAI, Anthropic or MCP format.
registry_validatePOST /v1/registry/validatepublicLint a provider + endpoints YAML submission against the registry schema and margin guard.
usage_by_tagGET /v1/usagebalance:readSpend and calls grouped by a meta tag over a window (reads the Postgres mirror). (planned: not yet available)
registry_submitPOST /v1/registry/submissionskeys:writeSubmit catalog YAML (validated as in registry_validate) for review by the GridRouter team.
announcements_listGET /v1/announcementspublicCurrent platform announcements (maintenance windows, incidents, launches).
review_createPOST /v1/reviews/{provider}/{endpoint}callLeave a rating backed by your verified call count. (planned: not yet available)
waterfall_catalogGET /v1/waterfalls/catalogpipelines:readEvery capability with its inputs, normalized output fields, and the endpoints a waterfall can use: price, quality, fill, p50 and rate limits.
waterfall_templatesGET /v1/waterfalls/templatespipelines:readBuilt-in starting points (work email, mobile finder, company enrich + technographics, and sandbox versions).
waterfall_listGET /v1/waterfallspipelines:readWaterfalls and pipelines in this org, newest first, with their published version.
waterfall_createPOST /v1/waterfallspipelines:writeCreate a draft waterfall (one capability, ordered vendor steps, speed profile, stop rules, per-field merge) or a multi-stage pipeline. Start from a definition, a template or a routing preset.
waterfall_getGET /v1/waterfalls/{id}pipelines:readOne waterfall: its draft definition, versions and published endpoint.
waterfall_updatePUT /v1/waterfalls/{id}pipelines:writeReplace the draft definition, title or description. Published versions never change.
waterfall_deleteDELETE /v1/waterfalls/{id}pipelines:writeDelete a waterfall and its versions; its published endpoint stops answering.
waterfall_estimatePOST /v1/waterfalls/estimatepipelines:readPer-step quote, p50 latency, fill and reach, plus worst-case and expected cost and ETA for a definition, without calling any vendor.
waterfall_versionsGET /v1/waterfalls/{id}/versionspipelines:readEvery published version (immutable), newest first.
waterfall_publishPOST /v1/waterfalls/{id}/versionspipelines:writeFreeze the draft as a new semver version and serve it at /v1/x/{workspace}/{name} (REST, MCP x_run and OpenAPI).
waterfall_rollbackPOST /v1/waterfalls/{id}/rollbackpipelines:writeServe an earlier published version again. Nothing is deleted.
waterfall_presetGET /v1/waterfalls/{id}/presetpipelines:readThe waterfall's vendor order as a routing preset body for presets_create, so /v1/run can use it as @slug.
waterfall_openapiGET /v1/waterfalls/{id}/openapipipelines:readOpenAPI 3.1 for the waterfall's published endpoint /v1/x/{workspace}/{name}.
waterfall_runPOST /v1/waterfalls/{id}/runpipelines:runRun a waterfall on one input. Sync by default; Prefer: wait=N (or wait) falls back to 202, Prefer: respond-async (or async: true) returns 202 with a run to poll, stream (/events) or receive by webhook. version draft runs the test runner.
waterfall_batch_runPOST /v1/waterfalls/batch-runpipelines:runRun a waterfall over up to 1,000 inputs (JSON rows or CSV) in the background through gr-rows, paced per vendor. Returns the batch (a list) to poll. Runs as an MCP task.
waterfall_runsGET /v1/waterfalls/{id}/runspipelines:readRecent runs of one waterfall: outcome, cost, time, attempts and fields filled.
waterfall_statusGET /v1/waterfalls/{id}/runs/{run_id}pipelines:readOne run: status, golden record with _provenance per field, every attempt with its timing and error, cost per filled field.
waterfall_run_eventsGET /v1/waterfalls/{id}/runs/{run_id}/events.jsonpipelines:readProgress events of a run after a sequence number (the SSE stream's JSON form).
waterfall_cancelPOST /v1/waterfalls/{id}/runs/{run_id}/cancelpipelines:runStop a queued or running run. In-flight attempts are aborted and released; the partial result is kept.
x_runPOST /v1/x/{workspace}/{name}pipelines:runCall your own published waterfall by name: /v1/x/{workspace}/{name}, where workspace is your org id. Same modes as waterfall_run.
plans_listGET /v1/planspublicEvery GridRouter plan with its price, limits, features and managed-call markup, plus the shared overage rates and always-free list.
entitlements_getGET /v1/entitlementsbalance:readThis org's plan, resolved limits (null means no cap), features and usage this month, including logged calls and overage blocks.
billing_getGET /v1/billingbalance:readBilling mode, plan and subscription status, balance (with any simulated test credit), auto-recharge and receipts.
billing_checkout_createPOST /v1/billing/checkoutbilling:writeBuy credits (amount_usd, the 5.5% top-up fee is added) or upgrade to a paid plan. Returns a URL: Stripe Checkout, or the test purchase page when billing is simulated.
billing_checkout_getGET /v1/billing/checkout/{id}balance:readOne checkout session and its status (open, completed, declined, requires_action).
billing_checkout_completePOST /v1/billing/checkout/{id}/completebilling:writeSimulated billing only: approve, decline or require card action on a test checkout. Emits the same events Stripe would; no card is charged.
billing_plan_changePUT /v1/billing/planbilling:writeMove to a lower plan, or to Free to cancel. Upgrades go through billing_checkout_create.
billing_autorecharge_setPUT /v1/billing/auto-rechargebilling:writeTop up by amount_usd whenever the balance drops below threshold_usd.
billing_simulatePOST /v1/billing/simulatebilling:writeTest and simulated modes only: payment failure, dispute (freezes the org), refund, renewal, downgrade, cancel, auto-recharge, grant expiry, or reset simulated state.
options_schemaGET /v1/options/schemapublicJSON Schema of ExecutionOptions: timing, concurrency, rate limits, cost, routing, data and cache, delivery, identity and observability. Every request body accepts it as options.
options_resolvePOST /v1/options/resolvecatalog:readWhat a request would run with: request options over the preset, your key's defaults and the workspace defaults, clamped by your plan. Returns where each value came from and what was clamped.
options_defaults_getGET /v1/options/defaultslogs:readThe workspace's default ExecutionOptions (the lowest precedence layer).
options_defaults_putPUT /v1/options/defaultspresets:writeReplace the workspace's default ExecutionOptions (cache TTLs per field class, log level, timeouts…). Applies to every key within 30 seconds.
keys_options_setPUT /v1/keys/{id}/optionskeys:writeDefault ExecutionOptions for one API key, between the preset and the workspace defaults. Send {} to clear.
cache_statsGET /v1/cache/statslogs:readRecords (entities and exact responses), bytes, hits and the vendor spend cache hits saved this month and all time, plus daily hit/partial/miss counts. Cache hits are always free.
cache_listGET /v1/cachelogs:readThe cache explorer: each cached entity or response with its masked label, fields, their ages and freshness, hits and savings. Values are never returned here.
cache_purgeDELETE /v1/cachecache:writeDelete cached records by key, tag or capability, or everything with all=true (crypto-shreds the workspace cache key: nothing sealed before can be read again).
cache_forgetPOST /v1/cache/forgetcache:writeDSAR delete for the private cache: every cached record about this subject (entity records under all its identities and exact responses naming it) is removed.
cache_feedbackPOST /v1/cache/feedbackcache:writeNegative feedback, such as a bounce: the named fields are dropped from the subject's cached record so the next request fetches them again.
logs_tailGET /v1/logs/live/recentlogs:readThe newest events from the live tail (calls, waterfall run steps, jobs, lists and alerts), newest last, with the same filters as the stream: provider, capability, status, key, app, run or waterfall, minimum latency and cost, sample and fields. Stream them with GET /v1/logs/live or the logs://live MCP resource.
logs_live_ticketPOST /v1/logs/live/ticketlogs:readA single-use ticket valid for 60 seconds that opens GET /v1/logs/live without an Authorization header (browsers). Carries logs:read for this org only.
drains_listGET /v1/drainslogs:readLog drains with their target, filter, batching and delivery health. Credentials are never returned.
drains_createPOST /v1/drainscredentials:writeSend the live log to an HTTPS webhook (HMAC-signed), Axiom, Datadog, or S3, GCS or R2 as NDJSON. Credentials are stored encrypted in the vault and are write-only. Webhook drains return their signing secret once.
drains_getGET /v1/drains/{id}logs:readOne drain with its delivery health.
drains_updatePUT /v1/drains/{id}credentials:writeRename, pause or resume, change the target, filter or batching, or replace credentials.
drains_deleteDELETE /v1/drains/{id}credentials:writeStop sending and remove the drain and its stored credentials.
drains_testPOST /v1/drains/{id}/testcredentials:writeSend one sample event to the drain now and report the result; updates drain health.
alerts_summaryGET /v1/alerts/summarylogs:readOpen alerts by severity, when the last one fired, and how many rules, destinations and webhook endpoints the workspace has.
alerts_rules_listGET /v1/alerts/ruleslogs:readEvery alert rule with its metric, threshold, window, scope, severity, destinations, mute and live state (ok, firing, muted, no_data). New workspaces start with defaults (a vendor key failing, budgets at 80% and 100%, billing mismatches, error-rate and spend spikes, a key on a new IP, failing deliveries, security events).
alerts_rules_createPOST /v1/alerts/ruleskeys:writeAlert when a metric crosses a threshold over a window: error_rate, p95_latency, spend, budget_used, vendor_failure_spike, vendor_key_failing, billing_mismatch, cache_hit_rate, delivery_backlog, security_event or new_ip. Scope it to the workspace, a key, a vendor or a capability; route it to every destination or to chosen ones.
alerts_rules_getGET /v1/alerts/rules/{id}logs:readOne alert rule with its state.
alerts_rules_updatePUT /v1/alerts/rules/{id}keys:writeChange any field; fields you leave out keep their value. Changing what the rule measures resolves its open alerts.
alerts_rules_deleteDELETE /v1/alerts/rules/{id}keys:writeDelete the rule and resolve its open alerts.
alerts_rules_mutePOST /v1/alerts/rules/{id}/mutekeys:writeSnooze a rule for minutes (or until until); it keeps evaluating and recording alerts but sends nothing. minutes: 0 unmutes.
alerts_rules_testPOST /v1/alerts/rules/{id}/testkeys:writeSend a test alert to every destination the rule notifies, now, and report each result. Nothing is recorded as a real alert.
alerts_destinations_listGET /v1/alerts/destinationslogs:readWhere alerts go (email, webhook endpoints, Slack, Discord, Microsoft Teams, PagerDuty, Opsgenie) with delivery health. Secrets are masked.
alerts_destinations_createPOST /v1/alerts/destinationscredentials:writeConnect email recipients (with optional hourly or daily digests), a webhook endpoint, a Slack or Discord incoming webhook, a Microsoft Teams Workflows URL, a PagerDuty Events API v2 integration key or an Opsgenie API key. The secret is stored encrypted in the vault and never returned.
alerts_destinations_getGET /v1/alerts/destinations/{id}logs:readOne destination with its delivery health.
alerts_destinations_updatePUT /v1/alerts/destinations/{id}credentials:writeRename, pause or resume, change the minimum severity or settings, or replace the secret.
alerts_destinations_deleteDELETE /v1/alerts/destinations/{id}credentials:writeStop sending there and delete its stored secret. Rules that listed it stop routing to it.
alerts_destinations_testPOST /v1/alerts/destinations/{id}/testcredentials:writeDeliver a test alert now and report the result (PagerDuty and Opsgenie tests open and immediately resolve their own incident). Test emails are queued.
alerts_listGET /v1/alertslogs:readAlerts newest first: open (triggered or acknowledged) or resolved, with how often each repeated and its timeline of notifications.
alerts_getGET /v1/alerts/{id}logs:readOne alert with its full timeline.
alerts_acknowledgePOST /v1/alerts/{id}/acknowledgekeys:writeMark an open alert as being handled. PagerDuty and Opsgenie destinations are acknowledged too.
alerts_resolvePOST /v1/alerts/{id}/resolvekeys:writeClose an open alert now; destinations that get resolve notifications are told. The rule's cooldown starts from here.
webhooks_event_typesGET /v1/webhooks/event-typeslogs:readEvery event a webhook endpoint can subscribe to, with when it is sent and the current api_version.
webhooks_endpoints_listGET /v1/webhooks/endpointslogs:readWebhook endpoints with their subscriptions, status and delivery health. Secrets are never returned.
webhooks_endpoints_createPOST /v1/webhooks/endpointscredentials:writeReceive events at an HTTPS URL, signed per Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature). Returns the whsec_ signing secret once.
webhooks_endpoints_getGET /v1/webhooks/endpoints/{id}logs:readOne endpoint with its delivery health.
webhooks_endpoints_updatePUT /v1/webhooks/endpoints/{id}credentials:writeChange the URL, description or subscribed events, or enable and disable it (re-enabling an automatically disabled endpoint clears its failure count).
webhooks_endpoints_deleteDELETE /v1/webhooks/endpoints/{id}credentials:writeStop delivering, delete its secrets and delivery log.
webhooks_endpoints_rotate_secretPOST /v1/webhooks/endpoints/{id}/rotate-secretcredentials:writeIssue a new signing secret. The old one keeps signing alongside it for overlap_s (default 24 hours), so both verify while you deploy the new one. Returns the new secret once.
webhooks_endpoints_testPOST /v1/webhooks/endpoints/{id}/testcredentials:writeDeliver an example event of the given type (marked test: true) to the endpoint now and return the delivery with its attempt.
webhooks_deliveries_listGET /v1/webhooks/deliverieslogs:readRecent deliveries newest first with every attempt's status code, latency and a redacted response snippet. Kept 30 days.
webhooks_deliveries_getGET /v1/webhooks/deliveries/{id}logs:readOne delivery with its attempts and the start of the signed body.
webhooks_deliveries_replayPOST /v1/webhooks/deliveries/{id}/replaycredentials:writeSend a delivery again with the same webhook-id (receivers that dedupe on it ignore a duplicate) and a fresh retry schedule.