REST API Reference
TodaySNS REST API
모든 서비스를 프로그램으로 주문·조회하는 REST API입니다. 요청은 단일 엔드포인트에 POST 로 보내며,
action 파라미터로 동작을, service 파라미터로 서비스 코드를 지정합니다. 응답은 항상 JSON입니다.
- Single endpoint:
POST https://todaysns.com/api/v2, bodyapplication/x-www-form-urlencoded. 응답은 항상 JSON. 성공·업무오류는 HTTP 200(오류는{"error":"..."}), 레이트리밋 초과만 HTTP 429{"error":"Too many requests"}. - Auth: 모든 요청에
key(계정 API키). 주문액은 계정 잔액 차감. 레이트리밋 100 req/sec(키 단위). - Actions(
action):services(판매목록: id·1개당단가(per-unit)·min1·max·refill),lookup(링크→대상 이름·현재수치·workable/available),add(주문: service+link+quantity, 반환{"order":id}),status(진행률: start_count·current_count·increase·remains·status),balance(잔액). - 수량: API 최소 1, 최대는 서비스별(
services의max). ★작성류(카카오맵 리뷰·SOOP 댓글)는quantity=1고정(1주문=1작성). 단가는 1개당(per-unit) KRW,total = rate × quantity. - 조건부 파라미터(add): SOOP 댓글=
comments필수 / 카카오맵 리뷰=review_text·rating·strength_ids·photos(선택) / 에이블리·오늘의집 리뷰=링크에?review_sno={id}필수. 재전송 멱등=external_ref, 분할전송=runs. - 진행률:
status의increase=실제 작업수, 진행중엔 갱신됨(플랫폼에 따라 work_log 초단위 또는 배치 tick 단위 — 카카오톡 채널·오픈채팅·카카오맵은 배치 단위라 갱신 간격이 다소 큼). 상태: Pending/In progress/Completed/Partial/Canceled. - 플랫폼: 카카오톡 채널·오픈채팅·카카오맵·오늘의집·에이블리·크몽·티스토리·SOOP (자체실행). 링크 형식은 각 서비스 코드표 참고. 접수 즉시 진행(취소 불가), 미달 시 비례환불.
인증
모든 요청에 key 파라미터로 API 키를 함께 전송합니다. 키는 계정에 종속되며, 주문 금액은 해당 계정 잔액에서 차감됩니다. 키가 없거나 잘못되면 {"error":"Incorrect API key"} 를 반환합니다.
YOUR_API_KEY아래 모든 예제의 key 자리에 발급받은 키를 넣어 호출하세요.
요청 · 응답 규칙
- 파라미터는
application/x-www-form-urlencoded본문으로 전송합니다.GET은 받지 않습니다. JSON 본문은 지원 대상이 아닙니다 — 단순 호출은 파싱될 수 있으나 줄바꿈(예:nicknames) 등 폼 전제 기능이 어긋나므로 반드시 form-urlencoded 로 보내세요. - 동작은
action값으로 지정합니다. 주문services·lookup·add·status·balance·openchat, 충전charge_methods·charge·charge_status·charge_cancel. 그 외 값은{"error":"Incorrect action"}. - 성공·업무오류 모두 HTTP 200 입니다. 상태코드로 분기하지 말고 본문에
error키가 있는지로 판정하세요. 유일한 예외가 레이트리밋 HTTP 429{"error":"Too many requests"}입니다. - ★숫자는 전부 JSON 문자열입니다(
"rate":"50.00","remains":"180"). 파싱 후 숫자로 변환해 쓰세요. 예외는 boolean(dripfeed·refill·cancel·valid·joinable·password·searchable·chat_available)과 integer(add의order,lookup의workable·available,openchat의members·max_members·likes,charge_methods의pending_limit) 입니다.services의params[].required도 boolean 입니다.lookup의count·counts값은 대상 플랫폼이 준 숫자를 그대로 실어 보내므로 숫자 또는null로 받고 항상 캐스팅해 쓰세요. - 단가(
rate)는 1개당(per-unit) 가격이며 항상 KRW 입니다. 주문 총액 =rate × quantity를 서버가 재계산합니다(구간 단가가 걸린 서비스는 수량 구간의 단가가 적용되며,rate는 그 최저 구간값입니다 — 확정 금액은status의charge가 정답). - 통화가 두 가지입니다.
services의rate는 KRW 고정,balance와status의charge는 계정에 설정된 통화로 환산되어currency필드와 함께 내려갑니다. 두 값을 그대로 빼거나 더하지 마세요. - 재시도 안전장치로
add에external_ref(멱등키)를 넣으세요. 같은(계정, external_ref)는 새 주문을 만들지 않고 기존{"order":id}를 그대로 돌려줍니다. - 레이트리밋은 API 키 단위 초당 100회입니다(키가 없으면 IP 단위). 초과 시 HTTP 429.
lookup·openchat은 대상 플랫폼을 실시간 조회하므로 수 초 걸립니다. 클라이언트 타임아웃은 30초 이상(오픈채팅 조회는 100초까지)을 잡으세요.
응답 판정 순서 (이대로 구현하면 됩니다)
// 1) HTTP 429 → 레이트리밋. 백오프 후 재시도. // 2) 본문에 "error" 키가 있으면 실패. "error_code" 가 같이 오면 그걸로 분기(문구는 바뀔 수 있음). // 3) 그 외는 성공. 숫자 필드는 문자열이므로 캐스팅. if (http === 429) return retryAfterBackoff() if (body.error) return fail(body.error_code ?? 'unknown', body.error) return ok(body)
연동 흐름 (이 순서대로 붙이면 됩니다)
모든 서비스는 같은 3단계입니다: ① services 로 코드 확보 → ② lookup 으로 링크 검증·수량 확인 → ③ add 로 주문 → 이후 status 폴링. 서비스 종류에 따라 ③에 붙는 파라미터만 다릅니다.
available 이 방마다, 그리고 주문할 때마다 달라집니다(정원·기존 진행분 반영). lookup 을 건너뛰고 add 하면 참여코드·오픈프로필 방 거절이나 정원 초과로 실패·미달이 납니다. 주문 직전 반드시 lookup 으로 available 을 확인하고 그 이하로 주문하세요 — 흐름 F.A. 기본 (대부분의 서비스. 팔로워·좋아요·저장·찜·구독 등)
1) 사용자가 링크 입력 → lookup POST action=lookup service=48 link=https://ohou.se/users/1234567 → { valid:true, name:"...", count:1034, workable:10000, available:58200, ... } 2) 화면에 name / count 표시, 수량 입력은 1 ~ workable 로 제한 3) add (external_ref 는 내 시스템 주문번호. 재시도해도 중복 주문 안 남) POST action=add service=48 link=... quantity=500 external_ref=MYORDER-1001 → { order: 10482 } 4) 주기적으로 status (권장: 진행중 1~5분 간격, 완료/취소되면 중단) POST action=status order=10482 → { status:"In progress", increase:"320", remains:"180", ... }
B. 특정 리뷰를 고르는 서비스 (에이블리 리뷰 좋아요 · 오늘의집 리뷰 도움돼요)
대상이 상품이 아니라 그 상품의 특정 리뷰 1개입니다. 상품 링크로 lookup 하면 reviews[] 가 오고, 사용자가 하나를 고르면 그 id 를 링크 뒤에 붙여 주문합니다. ★?review_sno= 없이 add 해도 주문은 접수되고 잔액이 차감됩니다 — 동기 거절이 아니라 실행 단계에서 실패해 자동 환불되니, add 응답의 {"order":id} 를 성공으로 처리하지 말고 반드시 ?review_sno= 를 붙이세요.
1) 상품 링크로 lookup (page 생략 = 1페이지, 5개씩) POST action=lookup service=44 link=https://store.ohou.se/productions/1234567 → { valid:true, name:"상품명", workable:..., reviews:[ { id:"987654", writer:"홍*", avatar:"https://...", helpful:12, comment:"리뷰 본문…", rating:5, date:"2026-09-01", image:"https://..." }, ...5개 ] } 2) 더 보기: page=2, 3 … → reviews 가 빈 배열이면 끝 (total/hasMore 는 안 옴) POST action=lookup service=44 link=... page=2 3) 사용자가 고른 리뷰 id 를 링크 뒤에 붙여 add POST action=add service=44 link=https://store.ohou.se/productions/1234567?review_sno=987654 quantity=30
| reviews[] 필드 | 설명 |
|---|---|
| id | 주문에 쓰는 값. ?review_sno={id} (문자열) |
| writer | 작성자 닉네임(마스킹됨) |
| avatar | 작성자 프로필 이미지 URL (없으면 null) |
| helpful | 현재 도움돼요/좋아요 수 (정수) |
| comment | 리뷰 본문 |
| rating | 별점 (오늘의집만, 에이블리는 null) |
| date | 작성일 YYYY-MM-DD |
| image | 리뷰 첨부 이미지 URL (없으면 null) |
C. 카카오맵 리뷰 (내용을 작성. 주문당 1건)
lookup 이 장소별 장점태그(strengths[]) 와 현재 rating 을 돌려줍니다. 사용자에게 별점·장점태그·후기글·사진을 입력받아 add 하되 quantity=1 입니다.
1) lookup → 장점태그 목록 확보 POST action=lookup service=17 link=https://place.map.kakao.com/1234567890 → { valid:true, kind:"place", name:"가게명", count:38 /*리뷰수*/, rating:4.6, strengths:[ {id:"1",name:"음식이 맛있어요"}, {id:"7",name:"친절해요"}, ... ], workable:1, available:9800, note:"주소 · 카테고리" } 2) add. 별점/태그/후기/사진 모두 선택, quantity 는 반드시 1 POST action=add service=17 link=... quantity=1 rating=5 strength_ids=1,7 review_text="분위기 좋고 친절해요" # 줄바꿈으로 여러 개 넣으면 그중 하나 사용 photos=["data:image/jpeg;base64,/9j/4AAQ..."] # JSON 배열 문자열, 최대 4장
D. SOOP 댓글 (내용을 작성. 주문당 1건)
POST action=lookup service=53 link=https://vod.sooplive.com/player/204398989
→ { valid:true, kind:"vod", name:"영상제목", counts:{"댓글":41}, ... }
POST action=add service=53 link=... quantity=1 comments="재밌게 봤어요!" # comments 필수, 300자
E. 카카오톡 채널
채널친구: 채널 홈 주소 POST action=lookup service=1 link=https://pf.kakao.com/_xxxxx → { kind:"channel", count:친구수 } 게시글 좋아요/공유: 게시글 주소 POST action=lookup service=2 link=https://pf.kakao.com/_xxxxx/12345678 → { kind:"post", count:좋아요수 }
F. 카카오톡 오픈채팅 (좋아요 · 인원/입장) — ★lookup 없이 주문하지 마세요
오픈채팅은 방마다 상태가 달라 lookup 을 건너뛰면 거절·미달이 잦습니다. lookup 이 (1) 작업 불가한 방을 valid:false + error_code 로 먼저 거르고, (2) 이 방에 실제로 넣을 수 있는 수를 available 로 돌려줍니다. quantity 는 반드시 available 이하로 넣으세요 — 초과하면 거절되고, 조회 없이 큰 수량을 넣으면 정원 초과로 미달·부분환불이 납니다.
■ 좋아요 (openchat-likes, service=14) — 방마다 재고가 따로 찬다 1) POST action=lookup service=14 link=https://open.kakao.com/o/gXXXXXXX → { valid:true, name:"방이름", count:현재 좋아요수, available:이 방에 더 넣을 수 있는 좋아요수(방별 잔여), note:"..." } 2) POST action=add service=14 link=... quantity=available 이하 external_ref=MYORDER-1 ■ 인원/입장 (openchat-join, service=26) — 실제로 방에 입장시킨다 1) POST action=lookup service=26 link=https://open.kakao.com/o/gXXXXXXX → { valid:true, count:현재 인원, available:남은 자리 = (최대인원 − 현재인원)과 재고 중 작은 값, note:"현재 N명 · 최대 M명 · 좋아요 L · 참여코드 없음", ... } # valid:false 면 error_code 로 사유가 온다 — 이 방들은 add 해도 실패한다: # room_locked = 참여코드(비밀번호) 방 / not_friends_room = 오픈프로필 방(프렌즈 입장 불가) / room_not_found 2) POST action=add service=26 link=... quantity=available 이하 nicknames="철수%0A영희" # 선택 · 한 줄에 하나씩(실제 개행/%0A) · 비우면 랜덤 자동배정 · custom_text 로도 받음
왜 반드시 조회하나: 입장은 방 정원이 차면 더 못 넣습니다. available 이 이미 "방 남은 자리"를 반영하므로, 100명이 정원인 방에 1,500을 넣으면 안 되고 available 만큼만 넣어야 합니다. 좋아요도 같은 방을 다시 주문하면 available 이 줄어 있습니다 — 매 주문 전 lookup 으로 현재 available 을 다시 확인하세요. (방 상태만 빠르게 보려면 action=openchat.)
서비스별 add 에 필요한 것 (한눈에)
| 서비스 | quantity | 추가로 필요한 것 |
|---|---|---|
| 에이블리 리뷰 좋아요 · 오늘의집 리뷰 도움돼요 | 1 ~ workable | 링크에 ?review_sno={reviews[].id} 필수 (흐름 B) |
| 카카오맵 리뷰 | 1 고정 | rating·strength_ids·review_text·photos 선택 (흐름 C) |
| SOOP 댓글 | 1 고정 | comments 필수 (흐름 D) |
| 카카오맵 검색노출 | 1 ~ 서비스 max | 없음. 검색어는 상호명으로 자동. available = 서비스 max |
| 카카오톡 채널 메시지 | 1 ~ workable | 없음 (흐름 A). ★채널이 1:1 채팅을 꺼두면 lookup 이 valid:false 로 거절합니다. 주문 전 반드시 조회해서 "채널 관리자센터에서 채팅을 켜 달라"고 안내하세요. ★lookup 의 count 는 항상 null. 채널 채팅수는 관리자만 보는 비공개 지표라 현재값을 줄 수 없습니다. 실적은 status 의 increase(보낸 건수)로 확인하세요. |
| 오픈채팅 좋아요 | 1 ~ available | 주문 전 lookup 필수 (흐름 F). lookup 의 count = 현재 좋아요 수, available = 이 방에 더 넣을 수 있는 수. 계정 1개가 방 1개에 좋아요 1개라 방마다 재고가 따로 찬다 — 같은 방 재주문 시 available 이 줄어 있으니 매번 다시 조회하고 그 이하로 넣어라. |
| 오픈채팅 인원/입장 | 1 ~ available | 주문 전 lookup 필수 (흐름 F). available = (최대인원 − 현재인원)과 재고 중 작은 값 = 실제 남은 자리. 정원이 차면 더 못 넣으니 반드시 available 이하로. lookup 이 참여코드 방(room_locked)·오픈프로필 방(not_friends_room)을 valid:false 로 거른다. 입장 닉네임은 custom_text(한 줄에 하나씩, 선택). |
| 그 외 전부 | 1 ~ workable | 없음 (흐름 A) |
Pending → 곧 In progress(increase 가 실시간으로 증가) → Completed. 접수 즉시 시작되므로 취소 API 는 없습니다. 기한 내 미달분은 Partial 로 끝나며 미달 수량만큼 잔액으로 자동 환불됩니다. 단 charge 는 접수 시 차감된 원금으로 고정되어 환불 후에도 줄지 않으니, 실부담액이 필요하면 charge × increase ÷ quantity 로 계산하세요(환불액 자체는 API 로 내려가지 않음).POSTservices
판매 중인 서비스 목록과 단가·수량 범위를 반환합니다. 여기서 얻은 service 코드를 add·lookup 에 사용합니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | services |
# Request curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=services" # Response 200 — 배열. 현재 28개 서비스. [ { "service": "48", "name": "Ohouse Followers", "category": "Ohouse", "rate": "50.00", // 1개당 단가 (KRW) "min": "1", "max": "10000", "stock": "10000", // ★현재 작업 가능 재고(실시간, 계속 바뀜). 대상별 잔여는 lookup 의 available "dripfeed": false, "refill": false, "cancel": false, "params": [] // ★add 에 받는 추가 입력. 예) 오픈채팅 인원: [{"key":"nicknames","required":false,"desc":"…"}] } ]
응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
| service | string | 서비스 코드. add·lookup 의 service 에 그대로 넣습니다 |
| name | string | 영문 서비스명 |
| category | string | 영문 플랫폼명. 현재 값: Kakao Channel · Open Chat · Kakao Map · Ohouse · Ably · Kmong · Tistory · SOOP |
| rate | string | 1개당 단가(KRW), 소수점 2자리 문자열 |
| min | string | 항상 "1". API 는 1개부터 주문됩니다(웹 화면의 최소 수량과 별개) |
| max | string | 1주문 최대 수량. 남은 재고가 아닙니다 — 대상별 잔여는 lookup 의 available |
| stock | string | ★현재 작업 가능한 재고(실시간, 계속 바뀜). 오픈채팅 좋아요·채널 메시지는 계정풀 가용수, 그 외(대량 자체실행·오픈채팅 인원)는 주문 상한. 대상 1곳(방·글)의 잔여는 lookup 의 available 로 따로 확인하세요 |
| dripfeed | boolean | 현재 전 서비스 false. 분할 전송을 지원하는 서비스가 아직 없습니다 |
| refill | boolean | 현재 전 서비스 false. 리필 보장 없음 |
| cancel | boolean | 항상 false. 접수 즉시 진행이 시작되어 주문 취소 API 가 없습니다. 미달분은 자동 비례환불됩니다 |
| params | array | add 에서 받는 추가 입력 목록. 각 항목은 {key, required, desc}. 예) 오픈채팅 인원 = nicknames(선택), SOOP 댓글 = comments(필수), 카카오맵 리뷰 = rating·strength_ids·review_text·photos. 추가 입력이 없는 서비스는 [] |
kakaotalk · kakao-openchat · ohouse · ably · kmong · tistory · soop · kakaomap)의 활성 + 점검중 아님 서비스만 담습니다. 인스타그램·유튜브 등 웹 전용 서비스는 코드를 알아도 add 가 Incorrect service ID 로 거절합니다. 서비스 코드를 하드코딩하지 말고 이 목록을 주기적으로 갱신하세요(점검 진입 시 목록에서 사라집니다).POSTlookup
주문 전에 링크의 유효성과 대상 정보(이름·현재 수치·작업 가능 수량)를 조회합니다. 리셀러 화면에서 "대상 이름 / 현재 수치"를 미리 보여줄 때 사용합니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | lookup |
| service | integer | 필수 | 서비스 코드 |
| link | string | 필수 | 조회할 대상 링크 |
| page | integer | 선택 | 리뷰 목록 페이지 (에이블리/오늘의집 리뷰 서비스에서 reviews[] 페이지 넘김, 기본 1) |
# Request curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=lookup" \ --data-urlencode "service=48" \ --data-urlencode "link=https://ohou.se/users/1234567" # Response 200 (valid) { "valid": true, "kind": "user", "name": "inspirez.moi", "count": 1034, // 이 서비스의 대표 수치 "counts": { // 조회 가능한 모든 수치(없으면 빈 객체) "follower": 1034 }, "unit": "명", "workable": 10000, // 이번 주문에 넣을 수 있는 최대(= min(available, 서비스 max)) "available": 58200, // 이 대상에 아직 넣을 수 있는 총 잔여량(재고 기준) "note": null } # Response 200 (invalid) — HTTP 는 200. valid:false + 기계용 error_code + 영문 error. { "valid": false, "error_code": "room_not_found", "error": "Open chat room not found or closed" } # ★분기는 반드시 error_code 로. error 문구는 예고 없이 바뀝니다. 전체 코드표 → 오류 섹션.
응답 필드
| 필드 | 설명 |
|---|---|
| valid | boolean. false 면 error_code·error 만 오고 나머지 필드는 없습니다 |
| normalized | 서버가 정규화한 링크(오픈채팅 좋아요·채널 메시지에만 내려감). 이 값을 그대로 add 의 link 에 쓰세요 — 중복 판정·재고 집계가 이 형태를 기준으로 합니다 |
| kind | 대상 종류. channel/post(카카오톡), place(카카오맵), user/card/product/brand(오늘의집) 등 플랫폼별 |
| name | 대상 이름 |
| count / counts | 대표 수치 / 조회 가능한 모든 수치(객체, 없으면 {}) |
| unit | 수량 단위(명·개 등) |
| workable | 이번 주문 최대 수량 = min(available, 서비스 max) |
| available | 대상 잔여 총량(재고). 카카오맵 검색노출은 재사용이라 서비스 max 와 동일 |
| chat_available | 카카오톡 채널 전용. 이 채널이 1:1 채팅을 받는지. false 면 채널 메시지(58) 주문이 거절됩니다(친구추가·게시글은 영향 없음). 채널이 아닌 대상에는 내려가지 않습니다. ★채널친구 조회에서는 null(판별 불가)일 수 있으니 === false 로만 막지 말고, 채널 메시지 주문 가능 여부는 kakao-chats(58) 로 lookup 해 확정하세요(그때는 항상 true) |
| rating | 카카오맵 리뷰 조회 시 현재 별점(그 외 없음) |
| strengths | 카카오맵 리뷰(17) 조회 시 장소별 장점태그 배열 [{id,name}] → add 의 strength_ids 에 사용 |
| reviews | 에이블리·오늘의집 리뷰 서비스 조회 시 리뷰 목록 [{id,…}] → 고른 id 를 add link 뒤 ?review_sno={id} 로 붙임(page 로 넘김) |
| note | 안내 문구(없으면 null) |
플랫폼별 kind · counts 실제 값
kind 와 counts 의 키는 플랫폼마다 다릅니다. 화면에 표시할 땐 count(대표 수치)를 쓰고, counts 는 부가 정보로만 쓰세요. 값이 없는 항목은 생략되며 counts 가 빈 객체 {} 일 수 있습니다.
| 플랫폼 | kind | counts 키 (실제 문자열 그대로) |
|---|---|---|
| 카카오톡 채널 | channel / post | 없음 ({}). count=친구수 또는 좋아요수 |
| 카카오맵 | place | 없음 ({}). count=리뷰수, 별도 rating(별점) 제공 |
| 오늘의집 | user / card / product / brand | follower like scrap share comment view review (대상에 있는 것만) |
| 에이블리 | goods / market | goods: like(찜) · buying(구매중) · review(리뷰수) / market: market(마켓찜) |
| 크몽 | gig | wish |
| 티스토리 | post(공감·조회) / blog(구독) | 한글 키: 공감 · 구독자 · 조회 (서비스당 1개) |
| SOOP | channel(즐겨찾기) / vod(VOD UP·댓글) / live(라이브 UP) | 한글 키: 즐겨찾기 · VOD UP · 라이브 UP · 댓글 (서비스당 1개) |
counts 키는 한글입니다(예: {"공감": 120}). 키 이름으로 분기하지 말고 count 를 쓰는 것이 안전합니다.counts 에 포함되지 않으며, note 로 안내됩니다.valid:true 라도 실제 판매 페이지 생존은 주문 전 브라우저로 확인하는 것을 권장합니다.POSTadd
주문을 접수합니다. 단가는 서버가 계산하며, 잔액에서 즉시 차감되고 자체 계정풀로 바로 진행됩니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | add |
| service | integer | 필수 | 서비스 코드 |
| link | string | 필수 | 대상 링크 (플랫폼별 가이드 참고) |
| quantity | integer | 필수 | 1 이상, 서비스 최대치 이하. ★작성류(카카오맵 리뷰·SOOP 댓글)는 반드시 1 |
| external_ref | string | 선택 | 멱등키(최대 191자). 같은 (계정, external_ref) 재전송은 새 주문을 만들지 않고 기존 {"order":id} 를 그대로 반환. 네트워크 재시도 안전장치 |
| runs | integer | 선택 | 분할 전송(드립피드) 일수. days 로도 받습니다. ★현재 드립피드를 지원하는 서비스가 없어(services 의 dripfeed 가 전부 false) 무슨 값을 보내도 1로 고정되어 전량 즉시 진행됩니다. 오류는 나지 않습니다 |
| comments | string | 조건부 | SOOP 댓글(soop-comment) 필수. 등록할 댓글 내용(최대 300자). 주문당 1건(quantity=1)만 등록됩니다. |
| review_text | string | 선택 | 카카오맵 리뷰(17). 후기글(최대 2,000자). 줄바꿈으로 여러 개를 넣으면 그중 하나가 쓰입니다. 비워두면 별점·태그만 등록됩니다. |
| rating | integer | 선택 | 카카오맵 리뷰 별점 1~5 (기본 5) |
| strength_ids | string | 선택 | 카카오맵 리뷰 장점태그(‘이런 점이 좋았어요’) id. 쉼표 구분. 선택 가능한 목록은 lookup 응답의 strengths[] 에 장소별로 내려옵니다. |
| photos | string | 선택 | 카카오맵 리뷰 사진. data URL 문자열의 JSON 배열, 최대 4장. 예: ["data:image/jpeg;base64,…"] |
| nicknames ( custom_text 별칭) | string | 선택 | 오픈채팅 인원/입장(26) 입장 닉네임. 정식 파라미터명은 nicknames(custom_text 로도 받음). ★한 줄에 하나씩 — 실제 줄바꿈으로 구분합니다(application/x-www-form-urlencoded 값에 개행, URL 인코딩 시 %0A). 1번째 줄 = 1번째 입장 계정, 2번째 줄 = 2번째… 순서대로 배정됩니다. 규칙: 닉네임 개당 최대 20자(초과분 잘림) · 중복 닉네임은 제거 후 자동배정으로 대체 · 줄 수가 quantity 보다 많으면 초과 줄 무시, 적으면 나머지는 랜덤 자동배정 · 비우면 전부 랜덤 자동배정(전체 최대 2,000자). ★"철수, 영희" 처럼 쉼표로 한 줄에 나열하지 마세요 — 그 줄 전체가 닉네임 1개(20자 잘림)로 들어갑니다. |
application/x-www-form-urlencoded 전용(JSON 본문은 받지 않습니다)입니다. 닉네임은 값 안에 실제 줄바꿈으로 구분하세요 — URL 인코딩하면 개행은 %0A 입니다(예: nicknames=철수%0A영희%0A민수). ★리터럴 두 글자 \n 은 개행으로 처리되지 않아 입력 전체가 닉네임 1개(20자 잘림)가 되고 나머지는 랜덤 자동배정됩니다. "철수, 영희" 처럼 쉼표로 나열해도 마찬가지입니다.17, SOOP 댓글 soop-comment)는 quantity 가 주문당 1 로 고정입니다(1주문=1작성). 2 이상이면 This service allows quantity 1 per order 오류. 같은 대상에 더 쌓으려면 주문을 여러 번 나눠 넣으세요. 남은 총량은 lookup 의 available 로 확인합니다. 카카오맵 리뷰의 review_text·strength_ids·photos 는 모두 선택이며, 아무것도 안 넣으면 별점 5점만 등록됩니다.# Request curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=add" \ --data-urlencode "service=48" \ --data-urlencode "link=https://ohou.se/users/1234567" \ --data-urlencode "quantity=500" # Response 200 — order 는 정수. 이 값을 status 의 order 에 씁니다. { "order": 10482 } # Response 200 (재고 부족) — 대상별 잔여를 숫자로 알려줍니다. { "error_code": "insufficient_stock", "error": "Not enough stock for this target. Available: 412" }
58) 는 계정 1개가 채널 1개에 1건이라 같은 대상에 재주문할수록 재고가 줄어듭니다. services 의 max 는 고정 상한일 뿐 잔여가 아니므로, 주문 직전에 lookup 의 workable 이하로 수량을 잡으세요. 초과하면 insufficient_stock 으로 거절되고 잔액은 차감되지 않습니다.lookup 으로 링크 검증 → ② normalized 가 있으면 그 값으로 → ③ workable 이하 수량으로 add → ④ status 폴링. 잔액은 접수 시점에 전액 차감되고, 진행 후 미달분은 자동으로 비례 환불됩니다(취소 API 없음).POSTstatus
단건은 order, 여러 건은 orders(콤마 구분, 최대 100개)로 조회합니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | status |
| order | integer | 택1 | 단건 주문 번호 |
| orders | string | 택1 | 여러 주문 번호, 콤마 구분 (최대 100) |
# 단건 curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=status" \ --data-urlencode "order=10482" # Response 200 { "charge": "40000.00", "start_count": "1034", // 작업 전 "current_count": "1354", // 작업 후(현재) "increase": "320", // 증가분(우리가 작업한 수) "status": "In progress", "remains": "180", "currency": "KRW" } # 복수 (orders=10482,10483). 주문번호를 키로, 각 값은 단건과 동일한 필드(charge·start_count·current_count·increase·status·remains·currency). 아래는 축약 표기. { "10482": { "status": "Completed", "remains": "0", /* …단건과 동일 필드 */ }, "10483": { "status": "Pending", "remains": "300", /* … */ }, "10484": { "error": "Incorrect order ID" } // 없거나 타계정 주문은 항목별 error }
응답 필드
| 필드 | 설명 |
|---|---|
| charge | 접수 시 차감된 주문 원금. 단위는 KRW 가 아니라 currency 필드의 통화(계정 설정값으로 환산). 부분환불이 나도 이 값은 줄지 않습니다 — 실부담 = charge × increase ÷ quantity |
| start_count | 작업 전. 작업 시작 시점의 대상 수치. ★플랫폼이 공개하지 않는 수치(장바구니·리뷰 도움돼요·카카오맵 저장수·검색노출 등)는 "0". 아래 특이사항 표 참고, 오류 아님 |
| current_count | 작업 후. 현재 수치 (= 작업 전 + 증가분). 진행중이면 실시간 반영. 작업 전이 "0" 인 서비스는 이 값도 "0" 이므로 increase 를 쓰세요 |
| increase | 증가. 우리가 실제 작업한 수. 진행중 갱신되며 갱신 간격은 플랫폼별로 다름(에이블리·오늘의집·크몽·티스토리·SOOP=초단위 / 카카오톡 채널·오픈채팅·카카오맵=배치 tick) |
| status | 주문 상태 (상태값 참고) |
| remains | 아직 채우지 못한 남은 수량 |
| currency | charge 의 통화 코드. 계정 설정 통화이며 기본 KRW |
작업 전 · 후 · 증가 (진행률)
increase(증가분)가 곧 우리가 실제 작업한 수이고, current_count는 start_count(작업 전) + 증가분입니다. 진행 중에 주기적으로 폴링하면 실시간으로 값이 차오릅니다.
// 예: start_count 1034, increase 320 인 상태 작업 전 = start_count // 1034 작업 후 = current_count // 1354 (= 1034 + 320) 증가 = increase // 320 (우리가 넣은 수) 진행률(%) = increase / 주문수량 * 100 // = 320 / 500 * 100 = 64% // status 가 "Completed" 이면 remains = 0, increase = 주문수량 (진행률 100%)
POSTbalance
계정의 현재 잔액을 조회합니다. 주문 전 잔액 확인이나 리셀러 대시보드에 사용하세요.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | balance |
# Request curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=balance" # Response 200 { "balance": "128500.00", "currency": "KRW" }
POSTopenchat
카카오톡 오픈채팅방 정보를 조회합니다. 주문과 무관하게 방 상태만 확인할 때 쓰세요. 주문에 필요한 재고·현재 좋아요 수는 lookup(service=14) 이 줍니다.
응답은 필요한 필드만 내려갑니다(방 내부 식별자·방장 프로필·권한값은 제공하지 않습니다).
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | openchat |
| link | string | 필수 | 오픈채팅 링크 https://open.kakao.com/o/{코드} |
# Request curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=openchat" \ --data-urlencode "link=https://open.kakao.com/o/gXXXXXXX" # Response 200 { "valid": true, "kind": "room", "name": "방 제목", "description": "방 설명", "image": "https://open.kakaocdn.net/...", "members": 189, // 현재 인원 "max_members": 4000, // 최대 인원 "likes": 157, // 좋아요 수 "category": "재테크", "room_type": "오픈채팅방", // 오픈채팅방 / 오픈프로필 / 커뮤니티 "created_at": "2026-08-31 10:51:18", // KST "joinable": true, // 입장 가능 "password": false, // 가입코드(비번방) 여부 "searchable": true // 검색 노출 여부 } # 실패 (없는 방 / 종료된 방) { "valid": false, "error_code": "room_not_found", "error": "Open chat room not found or closed" }
Deposit
충전 흐름
주문은 계정 잔액에서 차감됩니다. API 충전은 USDT 전용입니다(계좌이체는 웹 화면에서만 받습니다). 신청하면 보낼 USDT 금액이 내려오고, 그 금액이 그대로 들어오면 확정됩니다.
deposit_amount 를 소수점 6자리까지 그대로 전송하세요. 입금 대조가 금액으로 이뤄집니다. 한 자리라도 다르면 어느 신청의 입금인지 가려지지 않아 확정되지 않습니다. rate 로 직접 계산해서 보내지 마세요 — 꼬리가 없는 금액은 대조되지 않습니다.// 1) 지갑주소·네트워크·한도 조회 (주소는 바뀔 수 있으니 하드코딩 금지) POST action=charge_methods // 2) 신청 → 보낼 USDT 금액을 돌려받는다. amount 는 KRW 로 넣는다(USDT 아님) POST action=charge amount=50000 ↳ { "charge": "C260923ABCD", "deposit_amount": "38.008205", "network": "TRC20", "address": "TCY3nRgAuE139pYn8qvYD6Ci1BJdt2WaPJ", "amount": "50000" } // 3) address 로 deposit_amount 를 그대로 전송 — 38.008205 USDT (반올림·절사 금지) // 4) 확정될 때까지 폴링 — 금액이 정확히 맞으면 1분 안에 자동 승인된다 POST action=charge_status charge=C260923ABCD ↳ "status": "Pending" → 아직 입금 확인 전 ↳ "status": "Confirmed" → amount(50,000원) 만큼 잔액 반영 완료 // (입금을 안 하기로 했다면) 취소해야 다음 신청이 가능하다 POST action=charge_cancel charge=C260923ABCD
왜 딱 떨어지지 않는 금액인가
대기 중인 신청들의 입금액이 겹치면 어느 신청의 입금인지 가릴 수 없습니다. 그래서 KRW ÷ 시세 × (1 + 마진) 에 소수점 6자리 난수 꼬리를 더해 대기 중 유일한 금액을 만들어 돌려줍니다. 이 값이 그 신청의 식별자 역할을 합니다.
error_code: pending_exists 로 거절되고, 응답의 pending 에 그 신청이 통째로 담겨 옵니다. 그 금액을 입금하거나 charge_cancel 로 취소한 뒤 다시 신청하세요.취소하지 않고 방치하면 그 계정은 더 이상 충전할 수 없습니다 — 자동 만료가 없습니다. 자동화라면 신청 → 입금 → 확정 을 한 사이클로 돌리고, 입금을 포기할 땐 반드시 취소하세요.
amount 는 KRW — USDT 로 넣지 마세요. 보낼 USDT 양은 서버가 계산합니다.· 최소
10,000 원 — 웹 화면의 USDT 최소와 같습니다(계좌이체는 웹에서 20만원). 정확한 값은 charge_methods 의 min·max 를 쓰세요(하드코딩 금지).· 확정은 자동입니다 — 체인에 입금이 잡히면 1분 안에 자동 승인되어 잔액에 반영됩니다. 다만 금액이 정확히 일치할 때만입니다. 신청 직후
balance 가 바로 오르지 않는 것은 정상이며 charge_status 로 폴링하세요.· 재시도는
external_ref 와 함께 — 같은 값으로 재전송하면 기존 신청이 그대로 돌아옵니다.
POSTcharge_methods
입금 가능한 네트워크·지갑주소·한도·시세를 반환합니다. 지갑주소는 바뀔 수 있으니 하드코딩하지 말고 이 응답을 쓰세요.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | charge_methods |
# Response 200 { "methods": [ { "method": "usdt", "min": "10000", "max": "10000000", // ★KRW 기준 "currency": "USDT", "network": "TRC20", "address": "TCY3nRgAuE139pYn8qvYD6Ci1BJdt2WaPJ", "rate": "1342.000000", // 1 USDT = n KRW · 국내 거래소 실거래가 (참고용. 직접 계산해 보내지 말 것) "margin_pct": "2" // 시세 변동 대비 마진(%) } ], "pending_limit": 1 // 동시에 대기시킬 수 있는 신청 수 } # methods 가 빈 배열이면 충전이 닫힌 상태입니다. charge 도 method_unavailable 로 거절됩니다.
POSTcharge
충전을 신청하고 보낼 USDT 금액을 받습니다. 이 호출은 잔액을 올리지 않습니다 — 입금이 확인되어야 반영됩니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | charge |
| amount | integer | 필수 | KRW 금액(USDT 가 아닙니다). charge_methods 의 min ~ max (현재 10000 ~ 10000000). "50,000" 처럼 콤마가 있어도 됩니다 |
| method | string | 선택 | usdt. 생략하면 usdt — 현재 다른 값은 받지 않습니다 |
| external_ref | string | 선택 | 멱등키(최대 191자). 같은 (계정, external_ref) 재전송은 새 신청을 만들지 않고 기존 신청을 그대로 반환합니다. 재시도할 땐 반드시 같은 값으로 |
# Request curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=charge" \ --data-urlencode "amount=50000" \ --data-urlencode "external_ref=my-deposit-0001" # Response 200 { "charge": "C260923ABCD", // 신청번호 → charge_status / charge_cancel 에 사용 "method": "usdt", "status": "Pending", "deposit_amount": "38.008205", // ★이 금액 그대로 전송 (소수점 6자리) "deposit_currency": "USDT", "network": "TRC20", "address": "T…", "amount": "50000", // 확정 시 잔액에 더해질 KRW "currency": "KRW", "created_at": "2026-09-23 06:12:40", "confirmed_at": null } # Response 200 (대기 중인 신청이 이미 있음) — pending 에 그 신청이 통째로 들어옵니다 { "error_code": "pending_exists", "error": "A pending charge already exists. Deposit it or cancel it with action=charge_cancel", "pending": { "charge": "C260923ABCD", "deposit_amount": "38.008205", "status": "Pending", /* … */ } }
amount 는 확정 시 잔액에 더해질 KRW, deposit_amount 는 보낼 USDT 입니다. 단위가 다르니 deposit_currency 로 구분하세요. 시세가 변해도 확정되면 신청 당시의 amount 가 그대로 반영됩니다.POSTcharge_status
신청 상태를 조회합니다. 단건은 charge, 여러 건은 charges(콤마 구분, 최대 100)로 조회합니다. 응답 형태는 charge 와 완전히 같습니다 — 파서를 하나만 만들면 됩니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | charge_status |
| charge | string | 택1 | 신청번호 1건 (예: C260923ABCD) |
| charges | string | 택1 | 신청번호 여러 개, 콤마 구분 (최대 100) |
# 복수 조회 — 신청번호를 키로 하는 객체. 없거나 타계정 건은 항목별 error. { "C260923ABCD": { "status": "Confirmed", "confirmed_at": "2026-09-23 06:40:02", /* …charge 와 동일 필드 */ }, "C260923IJKL": { "status": "Pending", "confirmed_at": null, /* … */ }, "C000000XXXX": { "error": "Incorrect charge code" } }
| status | 의미 |
|---|---|
| Pending | 입금 확인 전. 계속 폴링하세요(권장 간격 30~60초). 이 상태가 있는 동안 새 신청은 거절됩니다 |
| Confirmed | 확정 — amount 만큼 잔액에 반영됨. confirmed_at 이 채워집니다 |
| Canceled | 취소됨. 잔액 반영 없음 |
POSTcharge_cancel
대기 중인 신청을 취소합니다. 대기가 계정당 1건이라, 입금하지 않을 신청은 반드시 취소해야 다음 신청이 가능합니다. 자동 만료는 없습니다.
https://todaysns.com/api/v2| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| key | string | 필수 | API 키 |
| action | string | 필수 | charge_cancel |
| charge | string | 필수 | 취소할 신청번호 |
# Response 200 — 취소된 신청을 charge 와 같은 형태로 반환 { "charge": "C260923ABCD", "status": "Canceled", "amount": "50000", /* … */ } # Response 200 (대기 상태가 아님) — 이미 확정·취소된 건 { "error_code": "not_cancellable", "error": "Only a pending charge can be cancelled", "charge": { "status": "Confirmed", /* … */ } }
Pending 이 길어지면 취소하지 말고 문의하세요.플랫폼별 가이드
연동할 플랫폼을 고르세요. 각 페이지에 서비스 코드 · 링크 형식 · 특이사항 · 작업 전/후 · 반영시간이 정리돼 있습니다.
주문 상태값
| status | 의미 |
|---|---|
Pending | 접수됨, 진행 대기 |
In progress | 진행 중 |
Completed | 전량 완료 |
Partial | 부분 완료 (미달분 자동 환불) |
Canceled | 취소·환불됨 |
오류
업무 오류는 {"error":"메시지"} + HTTP 200 으로 반환합니다. 예외: 레이트리밋 초과만 HTTP 429 {"error":"Too many requests"}.
오류는 두 종류입니다. error 만 오는 것(아래 첫 표)과, error_code 가 함께 오는 것(둘째 표)입니다. 분기는 언제나 error_code 우선으로 하고, 없을 때만 error 문자열을 보세요. 문구는 예고 없이 바뀔 수 있지만 error_code 값은 고정입니다.
1. error 만 오는 경우
| HTTP | error | 원인 |
|---|---|---|
| 200 | Incorrect API key | 키가 없거나 잘못됨 |
| 200 | Incorrect action | 지원하지 않는 action |
| 200 | Incorrect service ID | 없거나 비활성 서비스, 또는 API 미지원 플랫폼 |
| 200 | Incorrect link | 링크 누락 또는 형식 오류 |
| 200 | The quantity must be between 1 and N | 수량이 범위를 벗어남 |
| 200 | This service allows quantity 1 per order | 작성류(리뷰·댓글)에 quantity 2 이상 지정 |
| 200 | The "comments" field is required for this service | SOOP 댓글에 comments 누락 |
| 200 | The "rating" must be between 1 and 5 | 카카오맵 리뷰 rating 범위 오류 |
| 200 | The "photos" field must be a JSON array of data URLsEach photo must be a data URL starting with "data:image"Up to 4 photos are allowed | 카카오맵 리뷰 photos 형식/개수 오류 |
| 200 | Incorrect order ID | status 의 order/orders 누락 또는 타계정 주문 |
| 200 | Incorrect external_ref | external_ref 가 191자 초과 |
| 200 | Not enough funds on balance | 잔액 부족 |
| 200 | Lookup not supported for this service | 해당 서비스는 lookup 미지원 |
| 200 | Failed to store review content, order canceled | 카카오맵 리뷰 내용 저장 실패. 주문은 자동 취소·전액 환불됩니다 |
| 200 | link is required | action=openchat 의 link 누락 또는 512자 초과 |
| 200 | link must be a KakaoTalk openchat URL (open.kakao.com/o/...) | action=openchat 에 카카오 오픈채팅 링크가 아닌 값 |
| 200 | lookup service unavailable · lookup failed | action=openchat 조회 서버 장애. 재시도 대상 |
| 200 | The amount must be between 10000 and N | charge 의 amount 가 범위를 벗어남(최소 10,000원) |
| 200 | Incorrect charge code | charge_status·charge_cancel 의 신청번호 누락, 없는 번호, 또는 타계정 신청 |
| 429 | Too many requests | 레이트리밋(100 req/sec, 키 단위) 초과. 재시도 대상 |
2. error_code 가 함께 오는 경우
lookup·openchat 의 링크 검증 실패는 {"valid":false,"error_code":"…","error":"…"}, add 의 재고 부족은 {"error_code":"insufficient_stock","error":"…"} 형태입니다. 아래가 전체 목록이며 그 외 값은 나오지 않습니다(알 수 없는 사유는 invalid 로 수렴).
error_code 를 반환합니다: bad_link_format(링크 형식 아님) · link_required(링크 빈값) · target_not_found(대상 없음/삭제/비공개 — 오늘의집·에이블리·크몽·티스토리·SOOP) · channel_not_found(카톡 채널) · post_not_found·post_private(게시글) · place_not_found(카카오맵) · room_not_found·room_locked·not_friends_room(오픈채팅) · chat_disabled(채널 메시지) · not_broadcasting(SOOP 라이브 방송중 아님) · scrap_unsupported. 조회서버 일시장애는 lookup_unavailable·network(재시도 가능), 그 외는 invalid. 반드시 error_code 로 분기하세요(error 문자열은 언어·문구가 바뀔 수 있음).| error_code | 발생 action | 재시도 | 의미 · 처리 |
|---|---|---|---|
| insufficient_stock | add | 조건부 | 이 대상의 남은 재고보다 많은 수량. error 문자열 끝의 Available: N 이 잔여치. N 이하로 줄여 재요청. 잔액 차감 없음 |
| bad_link_format | lookup | 불가 | 링크 형식이 그 서비스의 형식이 아님. 사용자 입력을 고쳐야 함 |
| link_required | lookup | 불가 | link 가 빈 값 |
| room_not_found | lookup openchat add | 불가 | 존재하지 않거나 종료된 오픈채팅방 |
| room_locked | lookup add | 불가 | 오픈채팅 인원/입장: 참여코드(비밀번호) 방 → 방장이 참여코드를 꺼야 입장 가능 |
| not_friends_room | lookup add | 불가 | 오픈채팅 인원/입장: 오픈프로필 방(프렌즈 캐릭터 입장 불가) → 일반 그룹 오픈채팅방으로 진행 |
| target_not_found | lookup | 불가 | 대상을 찾을 수 없음(삭제/비공개) — 오늘의집 유저·상품·콘텐츠, 에이블리 상품·마켓, 크몽 서비스, 티스토리 글, SOOP 대상 |
| post_not_found | lookup | 불가 | 카카오톡 채널 게시글이 없거나 삭제됨 |
| post_private | lookup | 불가 | 비공개이거나 발행되지 않은 게시글 |
| not_broadcasting | lookup | 불가 | SOOP 라이브 UP: 대상이 방송 중이 아님(방송 중일 때만 가능) |
| scrap_unsupported | lookup | 불가 | 그 콘텐츠 유형은 해당 작업을 지원하지 않음(예: 오늘의집 커뮤니티 글 스크랩) |
| review_blocked | lookup add | 불가 | 카카오맵 리뷰: 그 장소가 리뷰 작성을 막아둠(다른 장소로 진행) |
| channel_not_found | lookup | 불가 | 카카오톡 채널을 찾을 수 없음 |
| place_not_found | lookup | 불가 | 카카오맵 장소를 찾을 수 없음 |
| chat_disabled | lookup | 불가 | 채널이 1:1 채팅을 꺼둠 → 채널 메시지(58) 주문 불가. 채널 관리자센터에서 채팅을 켜야 함 |
| unsupported_service | lookup | 불가 | 그 서비스는 이 조회를 지원하지 않음 |
| lookup_unavailable | lookup openchat | 가능 | 조회 서버 일시 장애. 잠시 후 재시도 |
| network | lookup | 가능 | 조회 중 네트워크 오류. 재시도 |
| invalid | lookup openchat | 불가 | 위 어느 것에도 해당하지 않는 링크 오류(포괄) |
| method_unavailable | charge | 불가 | 그 충전 수단이 없거나 꺼져 있음. error 끝에 Available: … 로 쓸 수 있는 수단을 알려줍니다 — charge_methods 를 먼저 조회하세요 |
| pending_exists | charge | 불가 | 대기 중인 신청이 이미 있음. 응답 pending 에 그 신청이 담겨 옵니다 — 입금하거나 charge_cancel 후 재신청 |
| not_cancellable | charge_cancel | 불가 | 대기 상태가 아닌 신청(이미 확정·취소됨) |
| rate_unavailable | charge | 가능 | USDT 시세를 못 가져옴. 잠시 후 재시도 |
| match_slot_full | charge | 가능 | 그 금액대의 유일한 입금액을 만들지 못함(대기 건이 몰린 경우). 금액을 조금 바꿔 재신청 |
lookup_unavailable, network, lookup service unavailable, lookup failed 뿐입니다. 나머지는 입력을 고치지 않는 한 몇 번을 보내도 같은 결과입니다. add 를 재시도할 때는 반드시 같은 external_ref 를 붙이세요 — 중복 주문이 생기지 않습니다.코드 예제
# 주문 생성 curl -X POST https://todaysns.com/api/v2 \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "action=add" \ --data-urlencode "service=48" \ --data-urlencode "link=https://ohou.se/users/1234567" \ --data-urlencode "quantity=500"
<?php $ch = curl_init('https://todaysns.com/api/v2'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => http_build_query([ 'key' => 'YOUR_API_KEY', 'action' => 'add', 'service' => 48, 'link' => 'https://ohou.se/users/1234567', 'quantity' => 500, ]), ]); $res = json_decode(curl_exec($ch), true); echo $res['order'];
import requests r = requests.post('https://todaysns.com/api/v2', data={ 'key': 'YOUR_API_KEY', 'action': 'add', 'service': 48, 'link': 'https://ohou.se/users/1234567', 'quantity': 500, }) print(r.json()) # {'order': 10482}
const body = new URLSearchParams({ key: 'YOUR_API_KEY', action: 'add', service: '48', link: 'https://ohou.se/users/1234567', quantity: '500', }); const res = await fetch('https://todaysns.com/api/v2', { method: 'POST', body }); console.log(await res.json());