API 문서
정책 안내
- 보도자료 수신
- 한 번에 받을 수 있는 보도자료는 최대 100건 까지만 전송됩니다.
- 5~10분 간격으로 뉴스와이어 API 서버에 접속해 보도자료를 수신하면 됩니다.
- 장기간 수신하지 않은 경우, 과거 자료는 최대 1,000개 까지만 제공합니다.
- 삭제 요청(delete)
- 삭제 요청이 들어왔는데 제휴사 DB에 해당 자료가 없으면 무시하면 됩니다.
- 수정 요청(update)
- 수정 요청이 들어왔는데 제휴사 DB에 해당 자료가 없으면 insert 처리해야 합니다.
- 사진 처리
- 사진은 반드시 제공된 URL에서 다운받아야 합니다.
- 다운로드한 사진은 자체 서버에 저장 후 서비스 해야합니다.(외부 URL 직접 링크 금지)
수신 방법 안내
뉴스와이어 보도자료 수신 방법에 대해 설명합니다.
보도자료 수신은 아래 그림과 같은 절차로 수신 할 수 있습니다.
결과 확인
보도자료 요청
보도자료를 수신하려면 먼저 뉴스와이어 API 서버에 보도자료 요청을 하고 인증과정을 거쳐 문제가 없을 경우 보도자료를 수신할 수 있는 request_id가 할당됩니다. request_id를 가지고 뉴스와이어 API 서버에서 접속하면 보도자료를 수신 할 수 있습니다.
만일 보도자료 요청 후 할당된 request_id로 보도자료를 수신하지 않고 보도자료를 다시 요청하며 이전에 생성된 요청정보가 그대로 전송됩니다.
보도자료 요청 시 Header에 Content-Type, X-HMAC, X-Timestamp 정보가 포함되어야 하며, 뉴스와이어에서 제공한 partner_id 값을 json 또는 post 형태로 전송해야 인증처리가 이루어 집니다.
API Header
| 항목 | Mandatory | 설명 |
|---|---|---|
| Content-Type | Mandatory | 요청 Body Content Type을 application/json으로 지정 (POST) |
| X-HMAC | Mandatory | 발급받은 API Key와 sha256 해시 알고리즘을 이용해 생성 |
| X-Timestamp | Mandatory | 1970년 1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 밀리초(Millisecond)로 나타냄 API Gateway 서버와 시간 차가 5분 이상 나는 경우 유효하지 않은 요청으로 간주 |
API URL
POST https://www.newswire.co.kr/api/v1/request
요청 예시:
JSON
{
"partner_id": 2002
}
응답 예시:
JSON
{
"partner_id": 2002,
"request_id": "REQ-2002-20251118122311-123",
"request_time": "2025-11-18T09:00:00+09:00",
"matched_count": 8,
"status": "processing",
"statuscode": 200,
"statusname": "success"
}
응답 항목:
| 항목 | Mandatory | Type | 설명 |
|---|---|---|---|
| partner_id | Mandatory | integer | 파트너사에 부여된 고유 아이디 |
| request_id | Mandatory | string | REQ-xxxx-YYYYmmddhhiiss-xxx 형식 보도자료 요청 ID |
| request_time | Mandatory | string | ISO 8601 형식. 2025-11-28T10:26:08+09:00 보도자료 전송 요청 시각 |
| matched_count | Mandatory | integer | 전송가능한 보도자료 개수 (0 ~ 100개) 0: 전송할 보도자료 없음 |
| status | Mandatory | string | processing, completed (처리중, 처리완료) |
| statuscode | Mandatory | string | - 200: 성공 - 그 외: 실패 |
| statusname | Mandatory | string | - success: 성공 - fail: 실패 |
| error | Optional | string | 에러 발생시 에러 메시지 |
- matched_count 값이 0이면 status 값은 completed가 되며, 더 이상 수신할 보도자료 없다는 의미이니 보도자료 수신요청 할 필요가 없습니다.
- status 값이 processing 인 경우만 전송할 보도자료 있는 상태를 의미 합니다.
보도자료 수신
- 수신 요청
- 보도자료 요청 시 발급받은 request_id를 사용해 뉴스와이어 API 서버에 수신 요청을 보냅니다.
- 응답은 JSON 형식으로 전달됩니다.
- send_id 발급 및 활용
- 정상적으로 보도자료가 수신되면 send_id가 할당됩니다.
- send_id를 이용해:
- 보도자료 수신 결과를 확인할 수 있습니다. (보도자료 수신 결과 확인 참고)
- 보도자료가 사용된 URL을 뉴스와이어에 제공할 수 있습니다. (콜백 처리 참고)
- send_id는 고유값이며, 제휴사 내부 문제 발생 시 해당 send_id로 다시 수신 요청이 가능합니다.
- 응답 데이터 처리
- 한 번의 응답에 포함된 보도자료는 최대 100개입니다.
- 동일 보도자료(newsid)에 대해 insert, update, delete 이벤트가 여러 개 포함될 수 있습니다.
- 반드시 위에서 아래 순서대로 이벤트를 처리해야 데이터 정합성이 유지됩니다.(제공된 pid가 작은 값부터 처리)
- press_time은 보도자료 노출시각입니다. 현재 시간보다 크다면 해당 보도자료는 노출되면 안됩니다.
- 각 보도자료별 action값이 있으며 insert, update, delete가 있습니다.
- insert : 새로운 데이터 저장
- update: 기존 데이터 수정. 제휴사 DB에 newsid가 없으면 insert 처리
- delete: 데이터 삭제. 제휴사 DB에 newsid가 없으면 무시
카테고리 정보:
- https://www.newswire.co.kr/api/v1/categoryinfo
- 카테고리 정보는 한번 수신 후 제휴사 DB에 저장 후 사용하시기 바랍니다.
- 뉴스와이어 카테고리가 수정 될 수 있으니 최소 6개월 1회는 업데이트가 필요합니다.
API Header
| 항목 | Mandatory | 설명 |
|---|---|---|
| Content-Type | Mandatory | 요청 Body Content Type을 application/json으로 지정 (POST) |
API URL
POST https://www.newswire.co.kr/api/v1/send
요청 예시:
JSON
{
"request_id": "REQ-2002-20250101010101-123"
}
응답 예시:
JSON
{
"send_id": "string",
"send_time": "string",
"status": "processing | completed",
"statuscode": "integer",
"statusname": "success | fail",
"matched_count": "integer",
"news": [
{
"pid": "integer",
"newsid": "integer",
"action": "insert | update | delete",
"company": {
"name": "string",
"homepage": "string",
"symbol": {
"exchange": "string",
"ticker": "string"
}
},
"lang": "한글 | 영문 | 일본어 | 중국어",
"catetory": {
"industry": [
{
"cat": {
"code": "integer",
"name": "string"
},
"sub_cat": {
"code": "integer",
"name": "string"
}
}
],
"theme": {
"code": "integer",
"name": "string"
},
"region": {
"code": "integer",
"name": "string"
}
},
"title":"string",
"subtitle":"string",
"content":"string",
"photo":[
{
"url":"string",
"intro":"string"
}
],
"youtube":{
"url":"string",
"intro":"string"
},
"offer":"string",
"url":"string",
"press_time":"string",
"req_time":"string"
}
]
}
응답 항목:
| 항목 | Mandatory | Type | 설명 |
|---|---|---|---|
| send_id | Mandatory | string | SEND-xxxx-YYYYmmddhhiiss-xxx 보도자료 수신 ID |
| send_time | Mandatory | string | ISO 8601 형식. 2025-11-28T10:26:08+09:00 보도자료 수신 시각 |
| status | Mandatory | string | processing | completed |
| statuscode | Mandatory | integer | - 200: 성공 - 그 외: 실패 |
| statusname | Mandatory | string | success | fail |
| matched_count | Mandatory | integer | 보도자료 수. 0 ~ 100 |
| news | Mandatory | Optional | 기사 목록 |
news 항목:
| 항목 | Mandatory | Type | 설명 |
|---|---|---|---|
| pid | Mandatory | integer | 전송 고유 아이디 |
| newsid | Mandatory | integer | 보도자료 고유 아이디 |
| action | Mandatory | string | 기사 처리 방법. insert, update, delete |
| company.name | Optional | string | 회사명 |
| company.homepage | Optional | string | 홈페이지 URL |
| company.symbol.exchange | Optional | string | 상장사 |
| company.symbol.ticker | Optional | string | 상장코드 |
| lang | Optional | string | 한글 | 영문 | 일본어 | 중국어 |
| category.industry[0].cat.code | Optional | Integer | 첫번째 산업 1차 카테고리 분류 코드 |
| category.industry[0].cat.name | Optional | string | 첫번째 산업 1차 카테고리명 |
| category.industry[0].sub_cat.code | Optional | Integer | 첫번째 산업 2차 카테고리 분류 코드 |
| category.industry[0].sub_cat.name | Optional | string | 첫번째 산업 2차 카테고리명 |
| category.industry[1].cat.code | Optional | Integer | 두번째 산업 1차 카테고리 분류 코드 |
| category.industry[1].cat.name | Optional | string | 두번째 산업 1차 카테고리명 |
| category.industry[1].sub_cat.code | Optional | Integer | 두번째 산업 2차 카테고리 분류 코드 |
| category.industry[1].sub_cat.name | Optional | string | 두번째 산업 2차 카테고리명 |
| category.theme.code | Optional | Integer | 주제 카테고리 분류 코드 |
| category.theme.name | Optional | string | 주제 카테고리명 |
| category.region.code | Optional | Integer | 지역 카테고리 분류 코드 |
| category.region.name | Optional | string | 지역 카테고리명 |
| title | Optional | string | 보도자료 제목 |
| subtitle | Optional | string | 보도자료 부제목 |
| content | Optional | string | 보도자료 본문 |
| photo[0].url | Optional | string | 사진 URL. 사진은 최대 5장까지 있을 수 있음 |
| photo[0].intro | Optional | string | 사진 설명 |
| photo[1].url | Optional | string | 사진 URL |
| photo[1].intro | Optional | string | 사진 설명 |
| youtube.url | Optional | string | 유튜브 URL |
| youtube.intro | Optional | string | 유튜브 설명 |
| offer | Optional | string | 보도자료 통신사 뉴스와이어(www.newswire.co.kr) 배포 |
| url | Optional | string | 보도자료 원문 URL |
| press_time | Optional | string | 보도자료 발표시각 2024-01-23T14:10:00+09:00 현재시간보다 크면 노출 금지 |
| req_time | Optional | string | 보도자료 처리 요청 시각 2025-10-23T14:10:00+09:00 |
보도자료 수신 결과 확인
확인 방법
- 보도자료 수신 시 발급된 send_id 값을 사용해 확인 할 수 있습니다.
- 아래 API URL에 GET 방식으로 요청 합니다.
- 수신 결과 확인 시에는 API Header 정보가 필요하지 않습니다.
- 보도자료 수신 결과확인은 옵션이며, 제휴사에 필요할 경우에만 확인 하면 됩니다.
API URL
GET https://www.newswire.co.kr/api/v1/send/{send_id}/status
응답 예시:
JSON
{
"partner_id": 2002,
"request_id": "REQ-2002-20251118122311-123",
"send_id": "SEND-2002-20251118122311-123",
"send_time": "2025-11-18T09:00:00+09:00",
"status": "completed | failed",
"statuscode": 200,
"statusname": "success"
}
응답 항목:
| 항목 | Mandatory | Type | 설명 |
|---|---|---|---|
| partner_id | Mandatory | integer | 파트너사에 부여된 고유 아이디 |
| request_id | Mandatory | string | REQ-xxxx-YYYYmmddhhiiss-xxx 보도자료 요청 ID |
| send_id | Mandatory | string | SEND-xxxx-YYYYmmddhhiiss-xxx 보도자료 수신 ID |
| send_time | Mandatory | integer | ISO 8601 형식. 2025-11-28T10:26:08+09:00 보도자료 수신 시각 |
| status | Mandatory | string | completed | failed |
| statuscode | Mandatory | string | - 200: 성공 - 그 외: 실패 |
| statusname | Mandatory | string | - success: 성공 - fail: 실패 |
| error | Optional | string | 에러 발생시 에러 메시지 |
보도자료 수신 이력 조회
최근 30건의 보도자료 수신 이력을 조회할 수 있습니다.
API Header
| 항목 | Mandatory | 설명 |
|---|---|---|
| Content-Type | Mandatory | 요청 Body Content Type을 application/json으로 지정 (POST) |
| X-HMAC | Mandatory | 발급받은 API Key와 sha256 해시 알고리즘을 이용해 생성 |
| X-Timestamp | Mandatory | 1970년 1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 밀리초(Millisecond)로 나타냄 API Gateway 서버와 시간 차가 5분 이상 나는 경우 유효하지 않은 요청으로 간주 |
API URL
POST https://www.newswire.co.kr/api/v1/history
요청 예시:
JSON
{
"partner_id": 2002
}
응답 예시:
JSON
{
"partner_id": 2002,
"statuscode": 200,
"statusname": "success",
"history": [
{
"request_id": "REQ-2002-20251127111212-700",
"send_id": "SEND-2002-20251127111221-910",
"request_time": "2025-11-27T11:12:12+09:00",
"send_time": "2025-11-27T11:12:21+09:00",
"matched_count": 30,
"request_status": "completed",
"send_status": "completed"
},
{
"request_id": "REQ-2002-20251127075908-461",
"send_id": "SEND-2002-20251127081131-941",
"request_time": "2025-11-27T07:59:08+09:00",
"send_time": "2025-11-27T08:11:31+09:00",
"matched_count": 30,
"request_status": "completed",
"send_status": "completed"
}
]
}
응답 항목:
| 항목 | Mandatory | Type | 설명 |
|---|---|---|---|
| partner_id | Mandatory | string | 파트너사에 부여된 고유 아이디 |
| statuscode | Mandatory | integer | - 200: 성공 - 그 외: 실패 |
| statusname | Mandatory | string | - success: 성공 - fail: 실패 |
| history | Mandatory | string | 전송 이력 목록 |
history
| 항목 | Mandatory | Type | 설명 |
|---|---|---|---|
| request_id | Mandatory | string | REQ-xxxx-YYYYmmddhhiiss-xxx 보도자료 요청 ID |
| send_id | Mandatory | string | SEND-xxxx-YYYYmmddhhiiss-xxx 보도자료 수신 Id |
| request_time | Mandatory | string | 요청시각 ISO 8601 형식. 2025-11-28T10:26:08+09:00 |
| send_time | Mandatory | string | 수신시각 ISO 8601 형식. 2025-11-28T10:26:08+09:00 |
| matched_count | Mandatory | integer | 보도자료 수신 갯수. 0 ~ 100 |
| request_status | Mandatory | string | completed | failed |
| send_status | Mandatory | string | completed | failed |
콜백 처리 안내(옵션)
보도자료를 받은 후 해당 보도자료가 실제로 사용된 곳(예: 기사, 블로그 등)의 URL을 뉴스와이어에 전달할 수 있습니다.
처리 조건
- 선택 사항(Optional)
- 이 기능은 필수기능이 아니며, URL 공개가 가능 할 경우에만 처리하면 됩니다.
- 수신한 보도자료에는 고유한 {pid} 값이 있으며, 이 {pid} 값으로 콜백해야 합니다.
- URL 요건
- 내부망 주소는 허용되지 않으며, 반드시 외부에서 접근 가능한 공개 URL만 전달해야 합니다.
- 데이터 제공 대상
- 수집된 URL 정보는 보도자료를 발표한 기업에 제공됩니다.
API Header
| 항목 | Mandatory | 설명 |
|---|---|---|
| Content-Type | Mandatory | 요청 Body Content Type을 application/json으로 지정 (POST) |
API URL
POST https://www.newswire.co.kr/api/v1/callback/{pid}
요청 예시:
JSON
{
"send_id": "SEND-2002-20251215105107-505",
"callbackurl": "https://v.daum.net/v/20251210133814774"
}
응답 예시:
JSON
{
"partner_id": 2002,
"status": "completed | failed",
"statuscode": 200,
"statusname": "success"
}
HTTP 상태 코드
| 코드 | 설명 |
|---|---|
| 200 | Accept (요청 완료) |
| 400 | 잘못된 요청 (필수 필드 누락 등) |
| 401 | 인증 실패 |
| 402 | 자료 없음 |
| 403 | 권한 없음 |
| 404 | 리소스 없음 |
| 405 | 잘못된 요청 메서드 |
| 500 | 서버 내부 오류 |
X-HMAC
뉴스와이어에서 제공한 API Key와 sha256 해시 알고리즘을 이용해 생성합니다.
생성 방법:
PHP
$data = '/api/v1/request' . time(); // 데이터 생성: 요청 URL + 현재 타임스탬프
$key = “API_KEY”;
echo generateHMAC($data, $key);
function generateHMAC(string $data, string $key, string $algorithm = 'sha256'): string {
// HMAC 생성 (raw binary)
$raw = hash_hmac($algorithm, $data, $key, true);
// Base64 인코딩 후 반환
return base64_encode($raw);
}
Java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HMACUtil {
public static String generateHMAC(String data, String key, String algorithm) throws Exception {
Mac mac = Mac.getInstance(algorithm);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), algorithm);
mac.init(secretKeySpec);
byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(rawHmac);
}
public static void main(String[] args) throws Exception {
String data = "/api/v1/request" + (System.currentTimeMillis() / 1000);
String key = "873c6fb26f787963e51474fd75bb3393";
// 기본 알고리즘은 HmacSHA256
String hmac = generateHMAC(data, key, "HmacSHA256");
System.out.println("Data: " + data);
System.out.println("HMAC: " + hmac);
}
}
Python import time import hmac import hashlib import base64 def generate_hmac(data: str, key: str, algorithm: str = 'sha256') -> str: # HMAC 생성 (raw binary) raw = hmac.new(key.encode(), data.encode(), getattr(hashlib, algorithm)).digest() # Base64 인코딩 후 반환 return base64.b64encode(raw).decode() # 데이터 생성: 요청 URL + 현재 타임스탬프 data = '/api/v1/request' + str(int(time.time())) key = "API_KEY" print(generate_hmac(data, key))