A small REST API
for a large network.
Submit a release, track placements, reconcile invoices. Eleven endpoints, a signed webhook stream and an OpenAPI 3.1 spec. Available on every plan, including Single.
Authenticate once.
All requests carry a bearer token in the Authorization header. Issue keys from your dashboard. Test keys are prefixed yw_test_; live keys are prefixed yw_live_.
Test keys route to a sandbox network of mirror outlets — no real placements, full webhook fidelity. New to wires? Start with what a newswire actually does.
curl https://api.yolowire.app/v1/releases \
-H "Authorization: Bearer yw_live_••••••••" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 9c1b4e2a-1f6e-4a7d-9b30-71d2dd0e2b14" \
-d '{
"headline": "Acme raises $14M Series A to expand European operations",
"dateline": "PARIS — October 14, 2026",
"body_html": "<p>Acme today announced…</p>",
"company": "Acme, Inc.",
"contact": { "name": "J. Marais", "email": "press@acme.io" },
"outlets": ["investing.com", "barchart.com", "theglobeandmail.com"],
"embargo_until": null
}'Bearer tokens
Tokens are 40 characters, prefixed yw_live_ or yw_test_. Rotate from the dashboard. Revocation is immediate; in-flight requests with a revoked key receive 401 token_revoked.
Scopes
releases:write— submit and update releasesreleases:read— fetch a release and its placementswebhooks:manage— create and rotate webhook endpointsnetwork:read— list outlets and live pricing
{
"id": "rel_01HG7Q4XK8C8AN3M4M5J3T6Y2P",
"object": "release",
"status": "distributed", // pending_review | scheduled | distributing | distributed | partially_distributed | rejected
"headline": "Acme raises $14M Series A…",
"company": "Acme, Inc.",
"created_at": "2026-10-14T08:14:22Z",
"approved_at": "2026-10-14T08:14:34Z",
"distributed_at": "2026-10-14T08:26:04Z",
"outlets_requested": ["investing.com","barchart.com","theglobeandmail.com"],
"placements": [
{
"outlet": "investing.com",
"url": "https://www.investing.com/news/stock-market-news/acme-raises-14m-3219412",
"indexed_at": "2026-10-14T08:21:02Z",
"indexed_in": ["google_news","gemini","gptbot"]
}
],
"amount_cents": 56000,
"currency": "usd",
"report_url": "https://api.yolowire.app/v1/releases/rel_01HG7Q4XK8C8AN3M4M5J3T6Y2P/report.pdf"
}We push a signed event to your endpoint for every state change. Signatures are HMAC-SHA256 of the raw body using your endpoint's signing secret, sent as YoloWire-Signature: t=…,v1=…. Reject any request older than five minutes. Retries follow an exponential backoff up to 24 hours.
POST /your-endpoint
YoloWire-Signature: t=1760431592,v1=4f2c1d…
{
"id": "evt_01HG7QH7M9C7N8R3P4P3R4R5S6",
"type": "release.distributed",
"created": 1760431592,
"data": { "object": { /* release */ } }
}Event types
- release.created · release.approved · release.rejected
- release.distributing · release.distributed · release.partially_distributed
- placement.observed · placement.indexed · placement.lost
- invoice.finalized · balance.low
Error shape
{
"error": {
"type": "invalid_request_error",
"code": "outlet_not_available",
"message": "Outlet 'foo.com' is not in the network.",
"param": "outlets[2]",
"request_id": "req_8f3…"
}
}Limits
- Default: 60 req/min, burst 120. Per-key.
- Webhook delivery: up to 8 retries over 24h.
- Idempotency keys retained for 24h; safe to retry on network errors.
- Sandbox keys share quota with live keys.
New to the wire? Read how distribution actually works behind the scenes, then create an account to mint your first test key.