딥시크 API 문서
딥시크 채팅과 이미지 생성(dipseek Fx)을 내 서버나 앱에서 HTTP로 호출하세요.
API 키 만들기첫 API 호출 따라하기소개
딥시크 API는 웹 서비스와 같은 모델·프롬프트·대화 기억을 그대로 사용합니다. API로 나눈 대화는 웹의 대화 기록에도 남고, 웹에서 하던 대화를 API로 이어갈 수도 있습니다.
| 기준 주소 | https://dipseek.kr/api/v1 |
|---|---|
| 형식 | 요청·응답 모두 UTF-8 JSON (스트리밍은 SSE) |
| 시간대 | 한국 시간(KST) |
| 이용 대상 | 이용권을 결제한 회원 |
403 subscription_required로 거부되며, 다시 결제하면 기존 키를 그대로 쓸 수 있습니다. 이용권 보기첫 API 호출
- 이용권을 결제한 뒤, 왼쪽 위 My Profile → Profile → API 키 관리 또는 API 키 페이지에서 키를 만듭니다. 키는 만든 직후 한 번만 보입니다.
- 키를 환경변수
DIPSEEK_API_KEY에 넣습니다. - 아래 코드로 호출합니다.
curl https://dipseek.kr/api/v1/chat \
-H "Authorization: Bearer $DIPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message":"안녕! 자기소개 한 줄만 해줘"}'import os, requests
r = requests.post(
"https://dipseek.kr/api/v1/chat",
headers={"Authorization": "Bearer " + os.environ["DIPSEEK_API_KEY"]},
json={"message": "안녕! 자기소개 한 줄만 해줘"},
)
data = r.json()
print(data["answer"])const res = await fetch("https://dipseek.kr/api/v1/chat", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.DIPSEEK_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ message: "안녕! 자기소개 한 줄만 해줘" }),
});
const data = await res.json();
console.log(data.answer);응답
{
"ok": true,
"id": 176310,
"room": "ZVZIbHBDT0lvRGNYNjYrODJzM0lOQT09",
"answer": "안녕하세요! 저는 딥시크의 AI 어시스턴트예요.",
"usage": { "input_tokens": 412, "output_tokens": 38 }
}인증과 API 키
모든 요청에 Authorization: Bearer dsk_… 헤더가 필요합니다. 주소(쿼리스트링)에 키를 넣는 방식과 로그인 쿠키는 지원하지 않습니다.
- 키는 회원당 최대 5개, 이름은 1~50자입니다.
- 서버에는 키의 해시만 저장됩니다. 잃어버리면 복구할 수 없으니 삭제하고 새로 만드세요.
- 키로 쓴 채팅 사용량과 이미지 포인트는 키를 만든 회원의 한도에서 차감됩니다.
이용 조건과 한도
| 항목 | 내용 |
|---|---|
| 채팅 | 웹과 같은 월 사용량 한도(이용권 기준)를 함께 씁니다. 넘으면 402 monthly_limit_reached |
| 이미지 생성 | 요청마다 이미지 포인트 15P. 이미지가 실제로 만들어졌을 때만 차감되며, 부족하면 402 insufficient_points |
| 동시 작업 | 이미지는 한 계정당 동시에 한 작업만 진행할 수 있습니다. |
| 호출 횟수 | 키 하나당 분당 채팅 20 · 이미지 요청 6 · 조회 60 (자세히) |
남은 한도는 GET /me로 확인할 수 있습니다.
채팅 이어가기
첫 응답의 room 값을 다음 요청의 room에 넣으면 이전 대화를 기억한 채 이어서 답합니다. room을 생략하면 매번 새 대화방이 만들어집니다.
curl https://dipseek.kr/api/v1/chat \
-H "Authorization: Bearer $DIPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message":"방금 한 말을 영어로 번역해줘","room":"ZVZIbHBDT0lvRGNYNjYrODJzM0lOQT09"}'import os, requests
API = "https://dipseek.kr/api/v1"
H = {"Authorization": "Bearer " + os.environ["DIPSEEK_API_KEY"]}
first = requests.post(API + "/chat", headers=H, json={"message": "파이썬 리스트 컴프리헨션이 뭐야?"}).json()
second = requests.post(API + "/chat", headers=H,
json={"message": "예제를 하나 더 보여줘", "room": first["room"]}).json()
print(second["answer"])const API = "https://dipseek.kr/api/v1";
const headers = { Authorization: `Bearer ${process.env.DIPSEEK_API_KEY}`, "Content-Type": "application/json" };
const post = (body) => fetch(`${API}/chat`, { method: "POST", headers, body: JSON.stringify(body) }).then(r => r.json());
const first = await post({ message: "파이썬 리스트 컴프리헨션이 뭐야?" });
const second = await post({ message: "예제를 하나 더 보여줘", room: first.room });
console.log(second.answer);스트리밍
"stream": true를 보내면 답변을 만드는 대로 text/event-stream(SSE)으로 받습니다.
curl -N https://dipseek.kr/api/v1/chat \
-H "Authorization: Bearer $DIPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message":"비트코인을 쉽게 설명해줘","stream":true}'import os, json, requests
with requests.post("https://dipseek.kr/api/v1/chat",
headers={"Authorization": "Bearer " + os.environ["DIPSEEK_API_KEY"]},
json={"message": "비트코인을 쉽게 설명해줘", "stream": True},
stream=True) as r:
event = None
for line in r.iter_lines(decode_unicode=True):
if line.startswith("event: "):
event = line[7:]
elif line.startswith("data: ") and event == "delta":
print(json.loads(line[6:])["text"], end="", flush=True)const res = await fetch("https://dipseek.kr/api/v1/chat", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.DIPSEEK_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ message: "비트코인을 쉽게 설명해줘", stream: true }),
});
const reader = res.body.getReader();
const dec = new TextDecoder();
let buf = "";
for (;;) {
const { value, done } = await reader.read();
if (done) break;
buf += dec.decode(value, { stream: true });
let i;
while ((i = buf.indexOf("\n\n")) >= 0) {
const block = buf.slice(0, i); buf = buf.slice(i + 2);
if (block.includes("event: delta")) process.stdout.write(JSON.parse(block.split("data: ")[1]).text);
}
}이벤트 순서
event: room
data: {"room":"ZVZI..."}
event: delta
data: {"text":"비트코인은 "}
event: done
data: {"id":176311,"room":"ZVZI...","usage":{"input_tokens":120,"output_tokens":410}}오류는 event: error로 오고 data에 error, message가 들어 있습니다. 연결을 중간에 끊으면 그 답변은 저장되지 않습니다.
이미지 생성
이미지는 만드는 데 1~2분 걸리므로 접수 → 조회 두 단계로 씁니다. 한 번에 4장이 만들어집니다.
# 1) 접수
curl https://dipseek.kr/api/v1/images \
-H "Authorization: Bearer $DIPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt":"벚꽃이 흩날리는 한강 다리 위의 여자","shape":"landscape"}'
# -> 202 {"ok":true,"id":3651,"status":"processing","cost_points":15}
# 2) 3~5초 간격으로 조회
curl https://dipseek.kr/api/v1/images/3651 \
-H "Authorization: Bearer $DIPSEEK_API_KEY"import os, time, requests
API = "https://dipseek.kr/api/v1"
H = {"Authorization": "Bearer " + os.environ["DIPSEEK_API_KEY"]}
job = requests.post(API + "/images", headers=H,
json={"prompt": "푸른 숲속의 작은 오두막", "shape": "square"}).json()
while True:
time.sleep(4)
r = requests.get(f"{API}/images/{job['id']}", headers=H)
if r.status_code == 404: # 실패한 작업은 정리되어 404가 올 수 있습니다
raise SystemExit("failed")
img = r.json()["image"]
if img["status"] != "processing":
break
print(img["status"], img["images"])const API = "https://dipseek.kr/api/v1";
const headers = { Authorization: `Bearer ${process.env.DIPSEEK_API_KEY}`, "Content-Type": "application/json" };
const job = await fetch(`${API}/images`, {
method: "POST", headers,
body: JSON.stringify({ prompt: "푸른 숲속의 작은 오두막", shape: "square" }),
}).then(r => r.json());
let img;
for (;;) {
await new Promise(r => setTimeout(r, 4000));
const res = await fetch(`${API}/images/${job.id}`, { headers });
if (res.status === 404) throw new Error("failed"); // 실패한 작업은 정리되어 404가 올 수 있습니다
img = (await res.json()).image;
if (img.status !== "processing") break;
}
console.log(img.status, img.images);failed(timeout)로 처리되고 포인트는 차감되지 않습니다.API 레퍼런스
채팅 요청
| 필드 | 타입 | 설명 |
|---|---|---|
message | string | 필수. 질문 (최대 8,000자) |
room | string | 선택. 이전 응답의 room. 없으면 새 대화방 |
stream | boolean | 선택. true면 SSE 스트리밍. 기본 false |
응답: id(대화 번호), room, answer, usage.input_tokens, usage.output_tokens
대화방 목록
내 대화방을 최신순으로 돌려줍니다 (최대 100개). before에 마지막 항목의 id를 넣어 이어서 불러옵니다.
{ "ok": true, "rooms": [ { "id": 981, "room": "ZVZI...", "title": "안녕! 자기소개…", "created_at": "2026-11-09 15:02:11" } ] }대화 기록
대화방의 질문·답변 기록입니다(오래된 것부터). before에 id를 넣으면 그 이전 대화를 불러옵니다.
이미지 생성 접수
| 필드 | 타입 | 설명 |
|---|---|---|
prompt | string | 필수. 만들 이미지 설명, 한국어 가능 (최대 1,000자) |
shape | string | 선택. portrait(세로, 기본) · square · landscape(가로) |
응답 202: id, status: "processing", cost_points: 15
이미지 작업 조회 / 목록
status는 processing · completed · failed 중 하나입니다. 목록은 최신순, 최대 50개입니다.
{
"ok": true,
"image": {
"id": 3651,
"status": "completed",
"prompt": "벚꽃이 흩날리는 한강 다리 위의 여자",
"images": ["https://…/0.png", "https://…/1.png", "https://…/2.png", "https://…/3.png"],
"error": null,
"created_at": "2026-11-09 15:02:11",
"completed_at": "2026-11-09 15:03:40"
}
}이미지 작업 취소 / 삭제
진행 중이면 취소하고(포인트 미차감), 끝난 작업이면 기록을 삭제합니다.
계정 상태
이 키의 계정 상태입니다. 호출 전에 남은 한도를 확인할 때 쓰세요.
{
"ok": true,
"key": { "id": 7, "name": "내 서버", "prefix": "dsk_3fa91c2b" },
"plan": "paid",
"subscription_expires_at": "2026-12-09 23:59:59",
"chat": { "used": 1520, "limit": 20000, "remaining": 18480, "resets_at": "2026-12-01 00:00:00" },
"image": { "points": 60, "cost_per_request": 15 },
"rate_limits_per_minute": { "chat": 20, "image": 6, "read": 60 }
}호출 한도
| 구분 | 키 하나당 분당 | 해당 요청 |
|---|---|---|
| chat | 20회 | POST /chat |
| image | 6회 | POST /images |
| read | 60회 | 그 밖의 모든 조회·삭제 |
응답 헤더 X-RateLimit-Limit, X-RateLimit-Remaining로 남은 횟수를 확인합니다. 넘으면 429와 Retry-After(초)가 옵니다.
오류 코드
실패하면 HTTP 상태 코드와 함께 아래 형태로 응답합니다. 코드(error)를 기준으로 처리하세요.
{ "ok": false, "error": "monthly_limit_reached", "message": "이번 달 사용 한도를 모두 사용했습니다. …" }| HTTP | error | 의미 / 조치 |
|---|---|---|
| 400 | invalid_request · invalid_json · message_too_long · prompt_too_long | 요청 형식을 확인하세요. |
| 401 | unauthorized · invalid_api_key | 헤더가 없거나 키가 틀림/삭제됨 |
| 402 | monthly_limit_reached · insufficient_points | 월 한도 소진 또는 이미지 포인트 부족 |
| 403 | subscription_required | 이용권이 없거나 만료됨. 결제 후 다시 사용 |
| 403 | account_disabled | 탈퇴했거나 이용이 제한된 계정 |
| 404 | room_not_found · not_found | 없거나 내 것이 아닌 대화방/작업 |
| 409 | job_in_progress | 진행 중인 이미지 작업이 끝난 뒤 다시 요청 |
| 429 | rate_limited | Retry-After 초 뒤에 재시도 |
| 502 | upstream_error · image_server_unavailable | AI/이미지 서버 문제. 잠시 후 재시도 (이미지는 포인트 미차감) |
| 500 | server_error | 서버 오류. 계속되면 문의해주세요. |