사이트 관리 API & RSS 피드
외부 편집 도구와 번역 시스템에서 기사를 등록·수정하고, RSS로 발행 기사를 제공할 수 있습니다. 아래에서 인증 방법, 요청 형식과 오류 대응을 확인하세요.
1. 인증과 기본 주소
모든 API는 사이트별 API 토큰으로 인증합니다. 토큰은 사이트 관리 콘솔의
API 연동 메뉴(https://{내-도메인}/admin/site/api)에서 발급하며,
보안을 위해 발급 화면에서 1회만 표시됩니다.
BASE = https://{내-도메인}/admin/api/v1
curl -H "Authorization: Bearer <API토큰>" "$BASE/articles?per_page=10"
- 안내받은 사이트의 API 주소와 해당 사이트에서 발급한 토큰을 사용하세요.
- 실도메인 연결 전에는 임시 주소
https://{sid}.edipresso.com/admin/api/v1을 사용합니다. - 토큰을 폐기하면 해당 토큰의 접근이 즉시 차단됩니다.
2. 공통 규칙
- 요청/응답 본문은 JSON(UTF-8)입니다. 성공 응답은 항상
"ok": true를 포함합니다. - 시각 값은 한국 표준시(KST, UTC+9) 표기입니다 — 예약 발행 입력
scheduled_at은"2026-08-24T15:00"형식. - 본문
body는 HTML로 보내며, 서버가 허용 목록 기반으로 정화(sanitize)한 뒤 저장합니다 — 스크립트 등은 자동 제거됩니다. - slug 고정 규칙: 한 번이라도 발행된 기사의
slug는 이후 수정 요청과 무관하게 고정됩니다(색인된 URL 보호). - 기사 상태
status:draft·review·published·rejected. 등급tier:headline·featured·normal. 형태layout:normal·card·gallery. status가published로 저장되는 순간published_at이 확정되며(예약 시각 우선), 공개 사이트·피드에 즉시 반영됩니다.
3. 기사 API
/articles
기사 목록. 쿼리: q(제목/슬러그 검색) · status · category_id · page(기본 1) · per_page(기본 20, 최대 100).
{"ok":true, "total":2310, "page":1, "per_page":20,
"articles":[{"id":"…","title":"…","slug":"…","status":"published","tier":"normal",
"category":"뉴스","author":"홍길동","published_at":"2026-08-24T09:00:00", …}]}
/articles
기사 작성. title·slug는 필수, 나머지는 생략 시 기본값(초안·normal).
curl -X POST -H "Authorization: Bearer <토큰>" -H "Content-Type: application/json" \
"$BASE/articles" -d '{
"title": "새 기사 제목",
"slug": "new-article-slug",
"subtitle": "부제",
"summary": "목록·RSS에 노출되는 요약",
"body": "<p>본문 HTML</p>",
"status": "draft",
"category_id": "…",
"author_id": "…",
"thumb_url": "/storage/….jpg",
"scheduled_at": "2026-08-25T09:00",
"keywords": "손흥민, 토트넘, 프리미어리그",
"series_ids": [], "related_ids": []
}'
응답 201: 저장된 기사 전체(article)를 돌려줍니다. 슬러그 중복이면 409.
keywords(기사 키워드/태그) — 문자열
"손흥민, 토트넘" 또는 배열 ["손흥민","토트넘"] 둘 다 받습니다.
기사 하단 태그와 사이트맵 <news:keywords>에 쓰입니다.
보내지 않으면(또는 빈 값이면) 발행 시점에 AI가 본문에서 4~8개를 자동
추출해 채웁니다 값을 보내면 그대로 저장하고 자동 추출은 하지
않습니다. 최대 8개까지 저장되며 앞뒤 공백·중복은 정리됩니다.
/articles/{id}
기사 상세 — 본문·연재/관련 링크·locales(언어별 번역 맵)까지 포함합니다.
/articles/{id}
부분 수정: JSON에 보낸 필드만 바뀌고 생략한 필드는 기존 값이 유지됩니다
(keywords도 동일 — 생략하면 기존 키워드가 그대로 남습니다).
curl -X PUT -H "Authorization: Bearer <토큰>" "$BASE/articles/{id}" \
-d '{"status":"published"}' # 발행 처리 — 다른 필드는 그대로
/articles/{id}
휴지통 이동(soft delete). 콘솔의 휴지통에서 복원할 수 있습니다.
4. 다국어(번역) API
사이트의 언어 설정에서 켠 추가 언어에 대해 기사별 번역을 저장합니다.
번역은 제목·부제·요약·본문·상태(draft/published)와
keywords만 가지며,
대표 이미지·카테고리·기자 등은 원본 기사와 공유합니다. 발행된 번역은
https://{내-도메인}/{언어}/news/{slug}에 노출됩니다.
/articles/{id}/locales/{locale}
curl -X PUT -H "Authorization: Bearer <토큰>" "$BASE/articles/{id}/locales/en" \
-d '{"title":"English Title","summary":"…","body":"<p>…</p>","status":"published",
"keywords":"Son Heung-min, Tottenham"}'
사이트에서 활성화되지 않은 언어 코드는 400으로 거부됩니다. 활성 언어 목록은 GET /locales로 확인하세요.
keywords는 그 언어 표기로 넣으세요(원본 키워드를 번역해
쓰지 않습니다). 생략하면 그 언어 본문에서 AI가 따로 추출합니다.
5. 기자·참조 목록 API
/authors
기자 등록. name만 필수 — 같은 이름의 활성 기자가 이미 있으면 새로 만들지
않고 그 id를 돌려줍니다("created": false). 기사 작성 전에 호출해
받은 id를 기사 author_id에 넣으면 바이라인·구조화데이터(author)에
기명 기자가 실립니다.
curl -X POST -H "Authorization: Bearer <토큰>" -H "Content-Type: application/json" \
"$BASE/authors" -d '{
"name": "홍길동",
"email": "hong@example.com",
"title": "기자",
"bio": "짧은 소개(선택)",
"profile_image_url": "/storage/….jpg",
"locales": {
"en": {"name": "Hong Gil-dong"},
"ja": {"name": "ホン・ギルドン"}
}
}'
# → {"ok":true, "id":"…", "created":true} (이미 있으면 200 + created:false)
locales(선택)는 언어별 이름·직책(title)·소개(bio) 표기입니다 —
사이트에서 활성화한 언어 코드만 허용되고, 비운 필드는 기본값으로 폴백됩니다.
"기자"·"편집장" 같은 일반 직책은 번역을 안 보내도 언어 페이지에서 자동 번역됩니다.
이미 있는 기자에게 번역만 나중에 보강하려면 같은 name으로 다시 호출하면 됩니다.
로그인 계정·권한 설정은 API로 만들지 않습니다 — 사이트 콘솔의 회원 관리에서 하세요.
| 엔드포인트 | 내용 |
|---|---|
GET/categories | 섹션(카테고리) 트리 — category_id에 쓸 id·이름·깊이·활성 여부 |
GET/authors | 기자 목록 — author_id에 쓸 id·이름 |
GET/series | 연재 목록 — series_ids에 쓸 id·이름 |
GET/locales | 기본 언어(root_locale) + 활성 추가 언어 목록 |
6. RSS 피드 (공개 · 전문)
| 주소 | 내용 | 접근 |
|---|---|---|
/feed.xml | 최신 발행 기사 50건 — 요약만 담는 RSS 2.0 | 공개 (누구나) |
/{언어}/feed.xml | 해당 언어의 발행 번역만 담는 공개 피드 | 공개 (누구나) |
/feed/full.xml?key=… | 기사 전문(본문 HTML 전체)을 content:encoded로 담는 피드 | 전문 RSS 접근키 보유 파트너만 |
/{언어}/feed/full.xml?key=… | 해당 언어 번역 전문 피드 | 전문 RSS 접근키 보유 파트너만 |
전문 피드 키는 콘솔 API 연동 메뉴에서
"전문 RSS 접근키"로 발급해 계약된 신디케이션 파트너에게만 전달하세요. 키가 없거나 틀리면
403이 반환되며, 전문 피드는 검색엔진 색인·공유 캐시에서 제외됩니다.
키가 유출된 경우 콘솔에서 폐기하고 새로 발급하면 됩니다.
7. 오류와 상태 코드
실패 응답은 {"ok": false, "error": "설명"} 형태입니다.
| 코드 | 의미 |
|---|---|
400 | 잘못된 요청 — 필수 필드 누락, 잘못된 JSON, 미활성 언어 코드 등 |
401 | 토큰 없음 또는 무효 — Authorization: Bearer 헤더 확인 |
403 | 권한 없음 — 전문 피드 키 오류 포함 |
404 | 대상 없음 — 삭제되었거나 다른 사이트의 리소스 |
409 | 충돌 — 이미 사용 중인 슬러그 |
500 | 서버 오류 — 잠시 후 다시 시도해 주세요. 반복되면 발생 시각과 요청 경로를 고객센터에 알려주세요. API 토큰은 보내지 마세요. |
작업 문의
24시간 AI가 바로 응대합니다.
사이트 수정 요청이나 운영 중 궁금한 점을 언제든 남겨주세요. AI가 요청 내용을 확인하고 필요한 정보를 안내합니다.
