Release API
Use the Release API to distribute press releases to reporters. Supports product selection, category targeting, and release creation/tracking.Authentication
All API requests require an API key in the PULITZER-API-KEY header.
Header Setup
PULITZER-API-KEY: YOUR_API_KEYDistribution Flow
Release creation follows this flow:
- List products (GET /products)
- List categories (GET /categories)
- Get optimal time (GET /optimal-time) - optional
- Create release (POST /create)
curl -X GET "https://api.pulitzer.ai/live/openapi/release/products" \
-H "PULITZER-API-KEY: YOUR_API_KEY"List Products
List distribution products (pricing, reporter count). Select product_id when creating a release. Prices shown are exclusive of 10% VAT.
GET https://api.pulitzer.ai/live/openapi/release/productsQuery Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
country_code | string | No | Country code (kr, id, ph, sg, my, reg_na). Default: kr |
Response
{
"status": "SUCCESS",
"success": true,
"message": "๋ฐฐํฌ ์ํ ๋ชฉ๋ก ์กฐํ ์ฑ๊ณต",
"data": [
{
"id": 1,
"title": "๋ฒ ์ด์ง",
"description": "100๋ช
๊ธฐ์ ๋์ ๋ฐฐํฌ",
"price": 55000,
"currency": "KRW",
"release_count": 100,
"release_tiers": "basic",
"is_recommended": false
}
]
}curl -X GET "https://api.pulitzer.ai/live/openapi/release/products?country_code=kr" \
-H "PULITZER-API-KEY: YOUR_API_KEY"List Categories
List target categories. Selecting categories routes your release to reporters in those fields.
GET https://api.pulitzer.ai/live/openapi/release/categoriesResponse
{
"status": "SUCCESS",
"success": true,
"data": [
{
"id": 1,
"name": "IT/๊ณผํ",
"categories": [
{
"id": 1,
"name": "AI/๋จธ์ ๋ฌ๋",
"reporter_count": 245
},
{
"id": 2,
"name": "๋ชจ๋ฐ์ผ",
"reporter_count": 189
}
]
}
]
}curl -X GET "https://api.pulitzer.ai/live/openapi/release/categories" \
-H "PULITZER-API-KEY: YOUR_API_KEY"Create Release
Distribute a press release to reporters. API credits are deducted based on the selected product price plus 10% VAT.
POST https://api.pulitzer.ai/live/openapi/release/createRequest Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
press_id | integer | Yes | Press release ID |
product_id | integer | Yes | Product ID (from GET /products) |
release_category_ids | integer[] | Yes | Category ID list (at least 1) |
release_method | string | Yes | IMMEDIATE or EXPERT_EDIT |
email_title | string | Yes | Email subject |
email_content | string | Yes | Email content (introduction) |
scheduled_kst | string | No | Scheduled time (ISO 8601). Immediate if omitted |
country_code | string | No | Country code (kr, id, ph, sg, my, reg_na). Default: kr |
include_crm_reporters | boolean | No | Include CRM target reporters. Default: false |
Response
{
"status": "SUCCESS",
"success": true,
"message": "๋ฐฐํฌ๊ฐ ์์ฑ๋์์ต๋๋ค.",
"data": {
"release_id": 456,
"press_id": 123,
"product_title": "๋ฒ ์ด์ง",
"price": 55000,
"currency": "KRW",
"reporter_count": 98,
"release_method": "IMMEDIATE",
"status": "SENT",
"scheduled_kst": null
}
}curl -X POST "https://api.pulitzer.ai/live/openapi/release/create" \
-H "PULITZER-API-KEY: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"press_id": 123,
"product_id": 1,
"release_category_ids": [1, 3, 5],
"release_method": "IMMEDIATE",
"email_title": "PulitzerAI launches press distribution API",
"email_content": "Hello, this is PulitzerAI...",
"country_code": "kr",
"include_crm_reporters": true
}'Optimal Distribution Time
Get the optimal press release distribution time. Recommends 30-minute slots between 8-10 AM.
GET https://api.pulitzer.ai/live/openapi/release/optimal-timeResponse
{
"status": "SUCCESS",
"success": true,
"data": {
"optimal_time": "2026-05-28T08:00:00+09:00",
"optimal_time_str": "2026.05.28. ์ค์ 8์"
}
}curl -X GET "https://api.pulitzer.ai/live/openapi/release/optimal-time" \
-H "PULITZER-API-KEY: YOUR_API_KEY"Release History
Retrieve paginated release history.
GET https://api.pulitzer.ai/live/openapi/release/historyQuery Parameters
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (default: 1) |
page_size | integer | Page size (1-100, default: 20) |
sort | string | Sort order (DESC/ASC, default: DESC) |
keyword | string | Search keyword (press title) |
Response
{
"status": "SUCCESS",
"success": true,
"data": [
{
"release_id": 456,
"press_id": 123,
"press_title": "ํฐ๋ฆฌ์ฒAI ๋ณด๋์๋ฃ ๋ฐฐํฌ API ์ถ์",
"subject": "ํฐ๋ฆฌ์ฒAI, ๋ณด๋์๋ฃ ๋ฐฐํฌ API ์ถ์",
"from_name": "๊น์ฒ ์",
"reporter_count": 98,
"status": "SENT",
"is_paid": true,
"created_kst": "2026-05-27T10:30:00",
"sent_kst": "2026-05-27T10:30:05"
}
],
"page_count": 3,
"total_count": 52
}curl -X GET "https://api.pulitzer.ai/live/openapi/release/history?page=1&page_size=20&sort=DESC" \
-H "PULITZER-API-KEY: YOUR_API_KEY"Release Status
Quick status check for recent releases.
GET https://api.pulitzer.ai/live/openapi/release/statusQuery Parameters
| Parameter | Type | Description |
|---|---|---|
limit | integer | Result limit (1-50, default: 10) |
curl -X GET "https://api.pulitzer.ai/live/openapi/release/status?limit=10" \
-H "PULITZER-API-KEY: YOUR_API_KEY"Release Detail
Get details of a specific release (recipients, status, etc.).
GET https://api.pulitzer.ai/live/openapi/release/{release_id}Response
{
"status": "SUCCESS",
"success": true,
"data": {
"release_id": 456,
"press_id": 123,
"press_title": "ํฐ๋ฆฌ์ฒAI ๋ณด๋์๋ฃ ๋ฐฐํฌ API ์ถ์",
"subject": "ํฐ๋ฆฌ์ฒAI, ๋ณด๋์๋ฃ ๋ฐฐํฌ API ์ถ์",
"from_name": "๊น์ฒ ์",
"introduction": "์๋
ํ์ธ์...",
"contact": "cs@company.com",
"reporters": [
{
"id": 1,
"name": "๊ธฐ์1",
"email": "re***",
"media": "๋งค์ฒดA"
}
],
"reporter_count": 98,
"status": "SENT",
"is_paid": true,
"product_id": 1,
"payment_price": 55000,
"payment_currency": "KRW",
"release_method": "IMMEDIATE",
"created_kst": "2026-05-27T10:30:00",
"sent_kst": "2026-05-27T10:30:05",
"scheduled_kst": null
}
}curl -X GET "https://api.pulitzer.ai/live/openapi/release/42" \
-H "PULITZER-API-KEY: YOUR_API_KEY"Generate Introduction
Generate an AI introduction (email opener). Providing sender info replaces template variables with actual values.
POST https://api.pulitzer.ai/live/openapi/release/{press_id}/introductionRequest Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sender_name | string | No | Sender name |
sender_title | string | No | Sender title |
sender_contact | string | No | Sender contact |
company_name | string | No | Company name |
Billing
1,000 KRW AI generation credit deducted
Response
{
"status": "SUCCESS",
"success": true,
"data": {
"introduction": "์๋
ํ์ธ์, ๊น์ฒ ์ PRํ์ฅ์
๋๋ค...",
"press_id": 123
}
}curl -X POST "https://api.pulitzer.ai/live/openapi/release/123/introduction" \
-H "PULITZER-API-KEY: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_name": "John Kim",
"sender_title": "PR Manager",
"sender_contact": "john@company.com",
"company_name": "Tech Corp"
}'Error Responses
Possible error codes.
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | PRODUCT_NOT_FOUND | Product not found |
| 400 | WRONG_PRODUCT_KIND | Non-release product selected |
| 400 | PRODUCT_INACTIVE | Inactive product |
| 400 | INVALID_CATEGORY | Invalid category ID |
| 400 | INVALID_SCHEDULE | Invalid schedule time format |
| 402 | INSUFFICIENT_API_CREDIT | Insufficient API credits |
| 403 | NOT_AUTHORIZED | No access to press release |
| 404 | PRESS_NOT_FOUND | Press release not found |