Pitchwire API & MCP. One REST endpoint, one MCP server, the same editorial pipeline.
Submit press releases programmatically from any application, script, or AI agent. Every submission gets AI editorial polish, editorial review, and multi-channel distribution — the same pipeline as the web UI.
Send your first release in 60 seconds
- Generate an API key in Settings → API Keys.
- Purchase credits (each submission consumes one paid release).
- Submit your first release:
curl -X POST https://pitchwire.ai/api/v1/releases \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Acme Corp Launches AI-Powered Widget",
"body": "SAN FRANCISCO -- Acme Corp today announced the launch of its new AI-powered widget, designed to streamline enterprise workflows and reduce operational costs by up to 40 percent.",
"plan": "starter"
}'Bearer tokens, no cookies
All API requests require a Bearer token in the Authorization header. Generate your key at /settings/api-keys.
Authorization: Bearer pk_a1b2c3d4e5f6...
Keep your API key secret. Do not expose it in client-side code or public repositories.
Submit a release
Submit a press release for AI editorial polish and review. Deducts one paid release credit. Returns the editorial score, status, and generated content (social posts, email subject).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Press release headline |
body | string | Yes | Full body text (min 50 characters) |
dateline | string | No | e.g. "NEW YORK, April 14, 2026". Auto-generated if omitted. |
boilerplate | string | No | Company about section |
contact_name | string | No | Media contact name |
contact_email | string | No | Media contact email |
contact_phone | string | No | Media contact phone |
plan | string | No | Distribution plan: "starter", "standard", or "premium" |
polish | boolean | No | Run AI editorial polish before review (default: true) |
idempotency_key | string | No | Prevents duplicate submissions on retry |
webhook_url | string | No | URL to POST status updates to when editorial review completes |
Response (201 Created)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "approved",
"editorial_score": 87,
"editorial_summary": "Strong AP-style release with clear news hook.",
"editorial_issues": [],
"content": {
"social_posts": {
"linkedin": "Excited to announce...",
"twitter": "Breaking: Acme Corp launches..."
},
"email_subject": "Acme Corp Launches AI-Powered Widget"
},
"plan": "starter",
"credits_remaining": 4,
"newsroom_url": null,
"created_at": "2026-04-14T15:30:00.000Z"
}Python example
import requests
response = requests.post(
"https://pitchwire.ai/api/v1/releases",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"title": "Acme Corp Launches AI-Powered Widget",
"body": "SAN FRANCISCO -- Acme Corp today announced...",
"dateline": "SAN FRANCISCO, April 14, 2026",
"boilerplate": "About Acme Corp: ...",
"contact_name": "Jane Doe",
"contact_email": "jane@acme.com",
"plan": "starter",
},
)
release = response.json()
print(f"Release {release['id']} — score: {release['editorial_score']}")Check status
Get full details of a release including editorial score, issues, distribution logs, generated content, and newsroom URL.
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://pitchwire.ai/api/v1/releases/550e8400-e29b-41d4-a716-446655440000
List releases
List all your releases with status, editorial scores, and newsroom URLs.
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://pitchwire.ai/api/v1/releases
Machine-readable spec
The full REST API is described in OpenAPI 3.1 at /api/v1/openapi.json. Drop it into Postman, Stoplight, or any OpenAPI-aware client generator.
MCP for AI agents
Connect Pitchwire to any MCP-compatible AI agent (Claude Desktop, Cursor, ChatGPT, VS Code Copilot) for programmatic press release submission. The MCP server exposes the same tools as the REST API.
Connect
The Pitchwire MCP server is an HTTP endpoint at https://api.pitchwire.ai/mcp. Add it to your MCP client's config file using the snippet for your client below.
{
"mcpServers": {
"pitchwire": {
"url": "https://api.pitchwire.ai/mcp",
"headers": {
"Authorization": "Bearer pw_live_..."
}
}
}
}{
"mcpServers": {
"pitchwire": {
"url": "https://api.pitchwire.ai/mcp",
"headers": {
"Authorization": "Bearer pw_live_..."
}
}
}
}claude mcp add pitchwire https://api.pitchwire.ai/mcp \ --transport http \ --header "Authorization: Bearer pw_live_..."
Replace pw_live_... with the API key you generated in Settings → API keys. Restart your client after editing the config.
Available tools
| Tool | Description |
|---|---|
get_account | Check credits balance, company, available plans, and Stripe checkout URL before submitting. |
submit_release | Submit a press release with AI polish + editorial review. Deducts one credit. Returns 402 with checkout URL when credits are exhausted. |
get_release | Get release details, editorial score, distribution logs. |
list_releases | List all your releases with status. |
edit_release | Edit a release (title, body, dateline, boilerplate, contacts, plan). Resets needs_revision → draft. 409 if already published. |
publish_release | Publish an approved release to your branded newsroom. Returns the canonical newsroom URL. |
distribute_release | Distribute a published release across wire (ein_presswire) and digital (email, linkedin, x) channels. |
Async release events
Pass a webhook_urlwhen submitting a release to receive a POST callback when editorial review completes. Useful for async workflows where you don't want to poll.
{
"title": "...",
"body": "...",
"webhook_url": "https://your-app.com/hooks/pitchwire"
}Webhook payload
{
"event": "release.reviewed",
"release_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "approved",
"editorial_score": 87,
"editorial_summary": "Strong AP-style release.",
"credits_remaining": 4,
"timestamp": "2026-04-14T15:30:05.000Z"
}Webhook delivery is best-effort with 3 retries. If your endpoint returns a non-2xx status, we retry after 10s, 60s, and 300s.
Verifying the signature
Every webhook includes an X-Pitchwire-Signature header of the form sha256=<hex>. Compute HMAC-SHA256 of the raw request body using your webhook secret and compare in constant time.
import hmac, hashlib
def verify(raw_body: bytes, header: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode(), raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, header)Drop-in release widget
Drop your latest published releases onto any website with a single script tag. The widget is read-only and uses your API key as a read token.
<div id="pitchwire-releases"></div> <script src="https://pitchwire.ai/api/v1/embed?key=YOUR_API_KEY"></script>
HTTP status codes
| Status | Meaning | Resolution |
|---|---|---|
401 | Invalid or missing API key | Check your Bearer token |
402 | No paid releases remaining | Purchase credits at /pricing |
422 | Validation error | Check required fields (title, body min 50 chars) |
429 | Rate limit exceeded (10 POST / 120 GET per minute per API key) | Honor Retry-After header and back off |
500 | Server error | Contact support@pitchwire.ai |
Ready to integrate?
Generate your API key and submit your first release in under a minute.