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_KEY

Distribution Flow

Release creation follows this flow:

  1. List products (GET /products)
  2. List categories (GET /categories)
  3. Get optimal time (GET /optimal-time) - optional
  4. 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/products

Query Parameters

ParameterTypeRequiredDescription
country_codestringNoCountry 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/categories

Response

{
  "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/create

Request Body Parameters

ParameterTypeRequiredDescription
press_idintegerYesPress release ID
product_idintegerYesProduct ID (from GET /products)
release_category_idsinteger[]YesCategory ID list (at least 1)
release_methodstringYesIMMEDIATE or EXPERT_EDIT
email_titlestringYesEmail subject
email_contentstringYesEmail content (introduction)
scheduled_kststringNoScheduled time (ISO 8601). Immediate if omitted
country_codestringNoCountry code (kr, id, ph, sg, my, reg_na). Default: kr
include_crm_reportersbooleanNoInclude 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-time

Response

{
  "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/history

Query Parameters

ParameterTypeDescription
pageintegerPage number (default: 1)
page_sizeintegerPage size (1-100, default: 20)
sortstringSort order (DESC/ASC, default: DESC)
keywordstringSearch 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/status

Query Parameters

ParameterTypeDescription
limitintegerResult 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}/introduction

Request Body Parameters

ParameterTypeRequiredDescription
sender_namestringNoSender name
sender_titlestringNoSender title
sender_contactstringNoSender contact
company_namestringNoCompany 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 StatusError CodeDescription
400PRODUCT_NOT_FOUNDProduct not found
400WRONG_PRODUCT_KINDNon-release product selected
400PRODUCT_INACTIVEInactive product
400INVALID_CATEGORYInvalid category ID
400INVALID_SCHEDULEInvalid schedule time format
402INSUFFICIENT_API_CREDITInsufficient API credits
403NOT_AUTHORIZEDNo access to press release
404PRESS_NOT_FOUNDPress release not found