이체톡 API 문서
입금이 들어오면 이체톡이 가맹점 서버로 웹훅을 보내고, 놓친 거래는 조회 API로 가져올 수 있어요.
1. 시작하기
- 가맹점 콘솔에 가입합니다.
- 기기 연결 메뉴에서 6자리 코드를 받아 이체톡 앱에 입력합니다.
- 설정 메뉴에서 웹훅 URL을 등록하고, 웹훅 서명키와 API 키를 확인합니다.
| 구분 | 값 |
|---|---|
| API Base URL | https://api.ichetalk.com/v1 |
| 인증 | Authorization: Bearer {API_KEY} |
| 형식 | JSON (UTF-8), 시간은 ISO 8601 (+09:00) |
2. 웹훅
입금 알림이 파싱되어 parse_status = parsed가 되면 등록된 URL로 즉시 POST 합니다.
5초 안에 2xx로 응답해 주세요. 실패하면 1분 → 5분 → 15분 → 1시간 → 6시간 간격으로 최대 5번 재시도합니다.
헤더
| 헤더 | 설명 |
|---|---|
X-IcheTalk-Event | deposit.created · withdrawal.created · webhook.test |
X-IcheTalk-Timestamp | 전송 시각(Unix 초) |
X-IcheTalk-Signature | sha256= + HMAC-SHA256(웹훅 서명키, "{timestamp}.{원본 body}") |
본문
{
"id": "tx_10293", // 거래 고유 ID (중복 처리에 사용)
"event": "deposit.created",
"type": "deposit", // deposit | withdrawal
"depositor": "김민지", // 입금자명 (출금이면 받는 사람)
"amount": 50000,
"balance": 1250000, // 없으면 null
"bank": "KB국민",
"account_hint": "123456**789",
"parse_status": "parsed", // parsed | review
"parser": "gpt", // gpt | regex
"device_id": 3,
"notified_at": "2026-10-07T13:22:05+09:00",
"received_at": "2026-10-07T13:22:06+09:00",
"raw": { "title": "입금 50,000원", "text": "김민지 → 내 통장", "app": "KB스타뱅킹" }
}
같은 id가 재시도로 여러 번 올 수 있으니 id 기준으로 중복 처리해 주세요.
서명 검증 예제 - PHP
<?php
$secret = getenv('ICHETALK_WEBHOOK_SECRET');
$body = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_ICHETALK_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_ICHETALK_SIGNATURE'] ?? '';
$expect = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);
if (!hash_equals($expect, $sig) || abs(time() - (int)$ts) > 300) { http_response_code(401); exit; }
$e = json_decode($body, true);
if ($e['event'] === 'deposit.created') {
// 예) 입금자명 + 금액이 일치하는 '입금대기' 주문을 찾아 결제완료 처리
// UPDATE orders SET status='paid' WHERE status='wait_deposit' AND depositor=? AND amount=? ORDER BY id LIMIT 1
}
http_response_code(200); echo 'ok';
서명 검증 예제 - Node.js (Express)
app.post('/ichetalk/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const ts = req.get('X-IcheTalk-Timestamp');
const sig = req.get('X-IcheTalk-Signature');
const expect = 'sha256=' + crypto.createHmac('sha256', process.env.ICHETALK_WEBHOOK_SECRET)
.update(ts + '.' + req.body).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expect), Buffer.from(sig || ''))) return res.sendStatus(401);
const e = JSON.parse(req.body);
// ... 주문 매칭
res.send('ok');
});
서명 검증 예제 - Python (FastAPI)
@app.post("/ichetalk/webhook")
async def hook(request: Request):
body = await request.body()
ts = request.headers.get("x-ichetalk-timestamp", "")
expect = "sha256=" + hmac.new(SECRET.encode(), f"{ts}.".encode() + body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expect, request.headers.get("x-ichetalk-signature", "")):
raise HTTPException(401)
e = json.loads(body)
return "ok"
3. 조회 API
GET /v1/transactions
since_id 이후의 거래를 오래된 순으로 가져옵니다. 웹훅을 놓쳤을 때 주기적으로 호출해 보완하세요.
| 파라미터 | 설명 |
|---|---|
since_id | 이 숫자 ID 이후 거래 (기본 0) |
limit | 1~200 (기본 50) |
type | deposit(기본) · withdrawal |
curl -H "Authorization: Bearer {API_KEY}" \
"https://api.ichetalk.com/v1/transactions?since_id=0&limit=50"
{ "ok": true, "data": [ { ...웹훅 본문과 동일... } ], "next_since_id": 10293 }
GET /v1/transactions/{id}
거래 1건을 조회합니다. tx_10293 또는 10293 모두 가능합니다.
4. 파싱 상태
| 상태 | 의미 | 웹훅 |
|---|---|---|
parsed | AI 추출 + 원문 대조 검증 통과 | 자동 발송 |
review | 추출했지만 확인이 필요(이름 없음, 원문 불일치 등) | 콘솔에서 확인 후 발송 |
ignored | 입출금 알림이 아님(광고, 인증번호 등) | - |
failed | 금액을 찾지 못함 | - |
5. 오류 응답
{ "ok": false, "error": { "code": "unauthorized", "message": "API 키가 올바르지 않습니다." } }
| HTTP | code |
|---|---|
| 400 | invalid_request · invalid_code |
| 401 | unauthorized |
| 404 | not_found |
| 429 | rate_limited (분당 300회) |
| 500 | server_error |