TodaySNS API

API 레퍼런스는 데스크톱 화면에 최적화되어 있습니다. PC 브라우저에서 열어주세요.

POST https://todaysns.com/api/v2 홈

REST API Reference

TodaySNS REST API

모든 서비스를 프로그램으로 주문·조회하는 REST API입니다. 요청은 단일 엔드포인트에 POST 로 보내며,
action 파라미터로 동작을, service 파라미터로 서비스 코드를 지정합니다. 응답은 항상 JSON입니다.

Endpoint
https://todaysns.com/api/v2
Method
POST
Content-Type
x-www-form-urlencoded
Rate limit
100 req / sec · 초과 429
Last updated
2026-09-22
SUMMARY (for AI / integration)
  • Single endpoint: POST https://todaysns.com/api/v2, body application/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"} 를 반환합니다.

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 폴링. 서비스 종류에 따라 ③에 붙는 파라미터만 다릅니다.

★ 오픈채팅은 lookup 필수
카카오톡 오픈채팅(좋아요·인원/입장)은 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)
status 폴링
주문 직후 Pending → 곧 In progress(increase 가 실시간으로 증가) → Completed. 접수 즉시 시작되므로 취소 API 는 없습니다. 기한 내 미달분은 Partial 로 끝나며 미달 수량만큼 잔액으로 자동 환불됩니다. 단 charge 는 접수 시 차감된 원금으로 고정되어 환불 후에도 줄지 않으니, 실부담액이 필요하면 charge × increase ÷ quantity 로 계산하세요(환불액 자체는 API 로 내려가지 않음).

POSTservices

판매 중인 서비스 목록과 단가·수량 범위를 반환합니다. 여기서 얻은 service 코드를 add·lookup 에 사용합니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수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":"…"}]
  }
]

응답 필드

필드타입설명
servicestring서비스 코드. add·lookup 의 service 에 그대로 넣습니다
namestring영문 서비스명
categorystring영문 플랫폼명. 현재 값: Kakao Channel · Open Chat · Kakao Map · Ohouse · Ably · Kmong · Tistory · SOOP
ratestring1개당 단가(KRW), 소수점 2자리 문자열
minstring항상 "1". API 는 1개부터 주문됩니다(웹 화면의 최소 수량과 별개)
maxstring1주문 최대 수량. 남은 재고가 아닙니다 — 대상별 잔여는 lookup 의 available
stockstring★현재 작업 가능한 재고(실시간, 계속 바뀜). 오픈채팅 좋아요·채널 메시지는 계정풀 가용수, 그 외(대량 자체실행·오픈채팅 인원)는 주문 상한. 대상 1곳(방·글)의 잔여는 lookup 의 available 로 따로 확인하세요
dripfeedboolean현재 전 서비스 false. 분할 전송을 지원하는 서비스가 아직 없습니다
refillboolean현재 전 서비스 false. 리필 보장 없음
cancelboolean항상 false. 접수 즉시 진행이 시작되어 주문 취소 API 가 없습니다. 미달분은 자동 비례환불됩니다
paramsarrayadd 에서 받는 추가 입력 목록. 각 항목은 {key, required, desc}. 예) 오픈채팅 인원 = nicknames(선택), SOOP 댓글 = comments(필수), 카카오맵 리뷰 = rating·strength_ids·review_text·photos. 추가 입력이 없는 서비스는 []
목록에 없는 서비스
이 목록은 API 로 주문 가능한 플랫폼(kakaotalk · kakao-openchat · ohouse · ably · kmong · tistory · soop · kakaomap)의 활성 + 점검중 아님 서비스만 담습니다. 인스타그램·유튜브 등 웹 전용 서비스는 코드를 알아도 add 가 Incorrect service ID 로 거절합니다. 서비스 코드를 하드코딩하지 말고 이 목록을 주기적으로 갱신하세요(점검 진입 시 목록에서 사라집니다).

POSTlookup

주문 전에 링크의 유효성과 대상 정보(이름·현재 수치·작업 가능 수량)를 조회합니다. 리셀러 화면에서 "대상 이름 / 현재 수치"를 미리 보여줄 때 사용합니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수lookup
serviceinteger필수서비스 코드
linkstring필수조회할 대상 링크
pageinteger선택리뷰 목록 페이지 (에이블리/오늘의집 리뷰 서비스에서 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 문구는 예고 없이 바뀝니다. 전체 코드표 → 오류 섹션.

응답 필드

필드설명
validboolean. 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 가 빈 객체 {} 일 수 있습니다.

플랫폼kindcounts 키 (실제 문자열 그대로)
카카오톡 채널channel / post없음 ({}). count=친구수 또는 좋아요수
카카오맵place없음 ({}). count=리뷰수, 별도 rating(별점) 제공
오늘의집user / card / product / brandfollower like scrap share comment view review (대상에 있는 것만)
에이블리goods / marketgoods: like(찜) · buying(구매중) · review(리뷰수)  /  market: market(마켓찜)
크몽gigwish
티스토리post(공감·조회) / blog(구독)한글 키: 공감 · 구독자 · 조회 (서비스당 1개)
SOOPchannel(즐겨찾기) / vod(VOD UP·댓글) / live(라이브 UP)한글 키: 즐겨찾기 · VOD UP · 라이브 UP · 댓글 (서비스당 1개)
주의
티스토리·SOOP 의 counts 키는 한글입니다(예: {"공감": 120}). 키 이름으로 분기하지 말고 count 를 쓰는 것이 안전합니다.
참고
장바구니 수는 오늘의집이 공개하지 않아 counts 에 포함되지 않으며, note 로 안내됩니다.
주의
오늘의집은 내려간(삭제된) 상품에도 캐시된 데이터를 반환할 수 있습니다. valid:true 라도 실제 판매 페이지 생존은 주문 전 브라우저로 확인하는 것을 권장합니다.

POSTadd

주문을 접수합니다. 단가는 서버가 계산하며, 잔액에서 즉시 차감되고 자체 계정풀로 바로 진행됩니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수add
serviceinteger필수서비스 코드
linkstring필수대상 링크 (플랫폼별 가이드 참고)
quantityinteger필수1 이상, 서비스 최대치 이하. ★작성류(카카오맵 리뷰·SOOP 댓글)는 반드시 1
external_refstring선택멱등키(최대 191자). 같은 (계정, external_ref) 재전송은 새 주문을 만들지 않고 기존 {"order":id} 를 그대로 반환. 네트워크 재시도 안전장치
runsinteger선택분할 전송(드립피드) 일수. days 로도 받습니다. ★현재 드립피드를 지원하는 서비스가 없어(services 의 dripfeed 가 전부 false) 무슨 값을 보내도 1로 고정되어 전량 즉시 진행됩니다. 오류는 나지 않습니다
commentsstring조건부SOOP 댓글(soop-comment) 필수. 등록할 댓글 내용(최대 300자). 주문당 1건(quantity=1)만 등록됩니다.
review_textstring선택카카오맵 리뷰(17). 후기글(최대 2,000자). 줄바꿈으로 여러 개를 넣으면 그중 하나가 쓰입니다. 비워두면 별점·태그만 등록됩니다.
ratinginteger선택카카오맵 리뷰 별점 1~5 (기본 5)
strength_idsstring선택카카오맵 리뷰 장점태그(‘이런 점이 좋았어요’) id. 쉼표 구분. 선택 가능한 목록은 lookup 응답의 strengths[] 에 장소별로 내려옵니다.
photosstring선택카카오맵 리뷰 사진. 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자 잘림)로 들어갑니다.
nicknames 는 줄 단위 · form-urlencoded 전용
이 API 는 application/x-www-form-urlencoded 전용(JSON 본문은 받지 않습니다)입니다. 닉네임은 값 안에 실제 줄바꿈으로 구분하세요 — URL 인코딩하면 개행은 %0A 입니다(예: nicknames=철수%0A영희%0A민수). ★리터럴 두 글자 \n 은 개행으로 처리되지 않아 입력 전체가 닉네임 1개(20자 잘림)가 되고 나머지는 랜덤 자동배정됩니다. "철수, 영희" 처럼 쉼표로 나열해도 마찬가지입니다.
작성류는 1건
내용을 작성하는 서비스(카카오맵 리뷰 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개)로 조회합니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수status
orderinteger택1단건 주문 번호
ordersstring택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아직 채우지 못한 남은 수량
currencycharge 의 통화 코드. 계정 설정 통화이며 기본 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

계정의 현재 잔액을 조회합니다. 주문 전 잔액 확인이나 리셀러 대시보드에 사용하세요.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수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) 이 줍니다. 응답은 필요한 필드만 내려갑니다(방 내부 식별자·방장 프로필·권한값은 제공하지 않습니다).

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수openchat
linkstring필수오픈채팅 링크 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자리 난수 꼬리를 더해 대기 중 유일한 금액을 만들어 돌려줍니다. 이 값이 그 신청의 식별자 역할을 합니다.

대기는 계정당 1건
대기 중인 신청이 있으면 새 신청은 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

입금 가능한 네트워크·지갑주소·한도·시세를 반환합니다. 지갑주소는 바뀔 수 있으니 하드코딩하지 말고 이 응답을 쓰세요.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수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 금액을 받습니다. 이 호출은 잔액을 올리지 않습니다 — 입금이 확인되어야 반영됩니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수charge
amountinteger필수KRW 금액(USDT 가 아닙니다). charge_methods 의 min ~ max (현재 10000 ~ 10000000). "50,000" 처럼 콤마가 있어도 됩니다
methodstring선택usdt. 생략하면 usdt — 현재 다른 값은 받지 않습니다
external_refstring선택멱등키(최대 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 와 deposit_amount
amount 는 확정 시 잔액에 더해질 KRW, deposit_amount 는 보낼 USDT 입니다. 단위가 다르니 deposit_currency 로 구분하세요. 시세가 변해도 확정되면 신청 당시의 amount 가 그대로 반영됩니다.

POSTcharge_status

신청 상태를 조회합니다. 단건은 charge, 여러 건은 charges(콤마 구분, 최대 100)로 조회합니다. 응답 형태는 charge 와 완전히 같습니다 — 파서를 하나만 만들면 됩니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수charge_status
chargestring택1신청번호 1건 (예: C260923ABCD)
chargesstring택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건이라, 입금하지 않을 신청은 반드시 취소해야 다음 신청이 가능합니다. 자동 만료는 없습니다.

POSThttps://todaysns.com/api/v2
파라미터타입필수설명
keystring필수API 키
actionstring필수charge_cancel
chargestring필수취소할 신청번호
# 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", /* … */ }
}
이미 보냈다면
USDT 를 이미 전송한 뒤에는 취소하지 마세요. 취소해도 송금은 되돌릴 수 없고, 취소된 신청은 확정되지 않습니다. 보냈는데 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 만 오는 경우

HTTPerror원인
200Incorrect API key키가 없거나 잘못됨
200Incorrect action지원하지 않는 action
200Incorrect service ID없거나 비활성 서비스, 또는 API 미지원 플랫폼
200Incorrect link링크 누락 또는 형식 오류
200The quantity must be between 1 and N수량이 범위를 벗어남
200This service allows quantity 1 per order작성류(리뷰·댓글)에 quantity 2 이상 지정
200The "comments" field is required for this serviceSOOP 댓글에 comments 누락
200The "rating" must be between 1 and 5카카오맵 리뷰 rating 범위 오류
200The "photos" field must be a JSON array of data URLs
Each photo must be a data URL starting with "data:image"
Up to 4 photos are allowed
카카오맵 리뷰 photos 형식/개수 오류
200Incorrect order IDstatus 의 order/orders 누락 또는 타계정 주문
200Incorrect external_refexternal_ref 가 191자 초과
200Not enough funds on balance잔액 부족
200Lookup not supported for this service해당 서비스는 lookup 미지원
200Failed to store review content, order canceled카카오맵 리뷰 내용 저장 실패. 주문은 자동 취소·전액 환불됩니다
200link is requiredaction=openchat 의 link 누락 또는 512자 초과
200link must be a KakaoTalk openchat URL (open.kakao.com/o/...)action=openchat 에 카카오 오픈채팅 링크가 아닌 값
200lookup service unavailable · lookup failedaction=openchat 조회 서버 장애. 재시도 대상
200The amount must be between 10000 and Ncharge 의 amount 가 범위를 벗어남(최소 10,000원)
200Incorrect charge codecharge_status·charge_cancel 의 신청번호 누락, 없는 번호, 또는 타계정 신청
429Too many requests레이트리밋(100 req/sec, 키 단위) 초과. 재시도 대상

2. error_code 가 함께 오는 경우

lookup·openchat 의 링크 검증 실패는 {"valid":false,"error_code":"…","error":"…"}, add 의 재고 부족은 {"error_code":"insufficient_stock","error":"…"} 형태입니다. 아래가 전체 목록이며 그 외 값은 나오지 않습니다(알 수 없는 사유는 invalid 로 수렴).

★ error_code 로 분기하세요 (전 플랫폼 세분화)
2026-09-27 부터 모든 플랫폼의 lookup/add 실패가 세분 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_stockadd조건부이 대상의 남은 재고보다 많은 수량. error 문자열 끝의 Available: N 이 잔여치. N 이하로 줄여 재요청. 잔액 차감 없음
bad_link_formatlookup불가링크 형식이 그 서비스의 형식이 아님. 사용자 입력을 고쳐야 함
link_requiredlookup불가link 가 빈 값
room_not_foundlookup openchat add불가존재하지 않거나 종료된 오픈채팅방
room_lockedlookup add불가오픈채팅 인원/입장: 참여코드(비밀번호) 방 → 방장이 참여코드를 꺼야 입장 가능
not_friends_roomlookup add불가오픈채팅 인원/입장: 오픈프로필 방(프렌즈 캐릭터 입장 불가) → 일반 그룹 오픈채팅방으로 진행
target_not_foundlookup불가대상을 찾을 수 없음(삭제/비공개) — 오늘의집 유저·상품·콘텐츠, 에이블리 상품·마켓, 크몽 서비스, 티스토리 글, SOOP 대상
post_not_foundlookup불가카카오톡 채널 게시글이 없거나 삭제됨
post_privatelookup불가비공개이거나 발행되지 않은 게시글
not_broadcastinglookup불가SOOP 라이브 UP: 대상이 방송 중이 아님(방송 중일 때만 가능)
scrap_unsupportedlookup불가그 콘텐츠 유형은 해당 작업을 지원하지 않음(예: 오늘의집 커뮤니티 글 스크랩)
review_blockedlookup add불가카카오맵 리뷰: 그 장소가 리뷰 작성을 막아둠(다른 장소로 진행)
channel_not_foundlookup불가카카오톡 채널을 찾을 수 없음
place_not_foundlookup불가카카오맵 장소를 찾을 수 없음
chat_disabledlookup불가채널이 1:1 채팅을 꺼둠 → 채널 메시지(58) 주문 불가. 채널 관리자센터에서 채팅을 켜야 함
unsupported_servicelookup불가그 서비스는 이 조회를 지원하지 않음
lookup_unavailablelookup openchat가능조회 서버 일시 장애. 잠시 후 재시도
networklookup가능조회 중 네트워크 오류. 재시도
invalidlookup openchat불가위 어느 것에도 해당하지 않는 링크 오류(포괄)
method_unavailablecharge불가그 충전 수단이 없거나 꺼져 있음. error 끝에 Available: … 로 쓸 수 있는 수단을 알려줍니다 — charge_methods 를 먼저 조회하세요
pending_existscharge불가대기 중인 신청이 이미 있음. 응답 pending 에 그 신청이 담겨 옵니다 — 입금하거나 charge_cancel 후 재신청
not_cancellablecharge_cancel불가대기 상태가 아닌 신청(이미 확정·취소됨)
rate_unavailablecharge가능USDT 시세를 못 가져옴. 잠시 후 재시도
match_slot_fullcharge가능그 금액대의 유일한 입금액을 만들지 못함(대기 건이 몰린 경우). 금액을 조금 바꿔 재신청
재시도 규칙
재시도해도 되는 것은 HTTP 429, 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"