Authentication
Authenticated endpoints require an API key passed via the Authorization header:
curl -H "Authorization: Bearer prnow_abc123..." \
https://prnow.io/api/v1/status/<press_release_id>Which ID? The /status, /report, /links and /retract endpoints accept either the pressReleaseId (UUID) or the slugId — the short code shown in your dashboard (e.g. G9E1HJK). Both are returned by POST /api/v1/submit.
Generate API keys from your PRNow account, or via POST /api/v1/keys while logged in. Keys are prefixed with prnow_ and shown in full only once at creation.
Test Your API Key
Before making any other requests, verify your key is valid and see your account details with this endpoint. It returns your account email, name, company, and your spendable credit balance across all of your credit wallets.
curl -H "Authorization: Bearer prnow_your_key_here" \
https://prnow.io/api/v1/test{
"success": true,
"data": {
"message": "API key is valid",
"account": {
"id": "...",
"email": "office@profitlabs.net",
"name": "Your Name",
"company": "Profit Labs",
"credits": 5,
"maxSingleWalletCredits": 5,
"wallets": {
"default": 5,
"custom": null,
"reseller": []
}
}
}
}credits is your total across all wallets. A single submission is paid from one wallet, so check maxSingleWalletCredits (or the wallets breakdown) to know the largest order you can place right now.
401 Unauthorized means the key is invalid, revoked, or missing the Bearer prefix.
Release Statuses
The status returned by GET /api/v1/status/{id}. When a release is rejected or refunded, statusReason tells you why.
| Status | Meaning |
|---|---|
draft | Saved but not submitted. Not in the review queue and not charged. |
pending | Submitted and awaiting review. The only status you can retract from. |
in_progress | Our editorial team has started work. Retraction is no longer possible. |
published | Live. A report becomes available. |
distributed | Sent out to the outlets on the order. |
rejected | Declined by our editorial team. Any credits are returned as part of the same operation — see statusReason. |
refunded | The order was cancelled and credits returned — usually by your own POST /retract/{id}. |
rejected and refunded are not sequential. They are two independent outcomes, not consecutive stages. A rejection returns the credits as part of the same operation, so a rejected release is not followed by a separate refunded status — don't poll waiting for that change.
Status is not a refund signal. If only some outlets on an order are rejected, those credits are refunded and the order's status does not change — it stays whatever it already was. The packages array on /status/{id} is the only place that shows it — each entry carries its own state, creditsRefunded and reason. A package with no entry hasn't been actioned yet — treat absent as still pending.
Retract a Pending Release
Changed your mind after submitting? While a release is still pending review you can retract it and get your credits back instantly — the same action as the Retract button in your dashboard. The credits return to the wallet that paid, and the release becomes editable so you can resubmit it.
curl -X POST \
-H "Authorization: Bearer prnow_your_key_here" \
https://prnow.io/api/v1/retract/G9E1HJK{
"success": true,
"data": {
"id": "8f14e45f-ceea-467a-9f2b-1c2d3e4f5a6b",
"pressReleaseId": "8f14e45f-ceea-467a-9f2b-1c2d3e4f5a6b",
"slugId": "G9E1HJK",
"status": "refunded",
"creditsRefunded": 205,
"message": "Press release retracted successfully"
}
}creditsRefunded is the amount credited back by this call. If part of the order was already refunded, only the remaining balance is returned.
Only pending releases can be retracted. Once our editorial team has started work, or the release is already live, retraction is no longer possible and you'll get a 400 — open a support ticket instead. A 409 means it was already retracted, and no credits were refunded by that call.
Reference Values
When submitting a press release, categories must use values from the list below, and country must use a country name from the countries list. Both lists are also available via API at GET /api/v1/categories and GET /api/v1/countries.
Content Limits
- title — 5–200 chars, min 5 words
- summary — max 45 words (auto-truncated)
- content — 250–1,200 words
- links in content — max 5
- inline images — max 3
- YouTube embeds — max 1
- Google Maps embeds — max 1
- categories — 1 to 5 from list below
- metaTitle — max 60 chars
- metaDescription — max 200 chars
- metaKeywords — max 250 chars
- imageAlt — max 125 chars (SEO)
- imageCaption — max 300 chars
- country — required (name or ISO-2 code); city — required
Valid Categories
GET /api/v1/categoriesPass one or more of these exact strings in the categories array. Values are case-sensitive.
Valid Countries
GET /api/v1/countriesUse the name value (not the code) in the country field. Example: "country": "United States"
AFALDZADAOARAMAUATAZEmbedding Google Maps & YouTube videos
You can embed one Google Map and one YouTube video inside the content HTML. Only YouTube and Google Maps are allowed — any other iframe is removed automatically. There are two ways:
1. Shortcut (easiest) — wrap any URL in <embed>…</embed>
Paste any YouTube link (watch, share, or short) or any Google Maps link — we build the correct responsive embed for you. No need to hand-write an iframe.
<p>…your article…</p>
<embed>https://www.youtube.com/watch?v=dQw4w9WgXcQ</embed>
<embed>https://www.google.com/maps?q=Truesdale+Nursery,+NY</embed>Accepted YouTube forms: youtube.com/watch?v=…, youtu.be/…, youtube.com/embed/…, youtube.com/shorts/…. For Maps, any google.com/maps… URL works (we append output=embed automatically). Best for partner newswires: a Google Maps place link (the one Share → Copy link opens, with /maps/place/…) or the Share → Embed a map URL — those become Google's own embed form, the shape partner newswires accept (some outlets may still show a link); a plain place name or ?q= search renders on prnow but is more likely to appear as a link on partners.
2. Or paste the official embed iframe directly
From YouTube use Share → Embed; from Google Maps use Share → Embed a map, then paste that <iframe> into content. Only youtube.com / youtube-nocookie.com and Google Maps (google.com/maps, maps.google.com) hosts are kept; everything else is stripped. When your release is distributed to partner newswires, each embed travels as the real embed in the partner's own format.
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!…"
width="600" height="450" style="border:0;" allowfullscreen loading="lazy"></iframe>Tip: embeds don't count toward your 5-link limit. Kept iframe attributes: src, width, height, frameborder, allow, allowfullscreen, loading, referrerpolicy.
Interactive API Explorer
Test the endpoints directly below. To use secured endpoints, click "Authorize" on the right and input your API key (e.g. prnow_xxxxx).
Error Codes
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request — missing or invalid fields |
401 | Unauthorized — invalid or missing API key |
402 | Payment required — insufficient credits |
404 | Not found — press release doesn't exist or not owned by you |
409 | Conflict — the release changed while your request was in flight (e.g. already retracted) |
500 | Internal server error |
All responses follow the same shape: { "success": bool, "data": ..., "error": "..." }. Check success first, then read data on success or error on failure.