인증
모든 요청에서 API 키를 Authorization 헤더의 Bearer 토큰으로 보내세요. 키는 서버에 보관하고, 브라우저 코드나 모바일 앱에는 절대 넣지 마세요.
Authorization: Bearer YOUR_API_KEY
모든 엔드포인트의 기본 URL은 https://bouncebell.com/api/v1입니다.
주소 하나 검증
GET https://bouncebell.com/api/v1/verify
| 매개변수 | 필수 | 설명 |
|---|---|---|
email | 예 | 검증할 주소. URL 인코딩하세요. |
timeout | 아니요 | 메일 서버를 기다리는 시간(초), 3~30. 기본값 10. 시간이 초과되면 상태는 unknown이 되며 크레딧은 사용되지 않습니다. |
예시
curl "https://bouncebell.com/api/v1/verify?email=rini.elizabeth%40acme-foods.example" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"email": "rini.elizabeth@acme-foods.example",
"status": "valid",
"reason": "mailbox_exists",
"domain": "acme-foods.example",
"mx_record": "mx1.acme-foods.example",
"disposable": false,
"role": false,
"free_provider": false,
"catch_all": false,
"did_you_mean": null,
"checked_at": "2026-10-30T09:30:12Z",
"credits_used": 1
}
결과 필드
| 필드 | 유형 | 설명 |
|---|---|---|
email | string | 보낸 그대로의 주소. |
status | string | 판정 결과. 상태를 참고하세요. |
reason | string | 판정 사유. 예: mailbox_not_found 또는 no_mail_server. |
domain | string | 도메인 부분(소문자). |
mx_record | string or null | 우선순위가 가장 높은 메일 서버. |
disposable | boolean | 도메인이 임시 메일함 서비스이면 true. |
role | boolean | info@ 또는 support@ 같은 공유 메일함이면 true. |
free_provider | boolean | Gmail 같은 무료 메일 제공업체이면 true. |
catch_all | boolean | 도메인이 모든 주소를 수신하면 true. |
did_you_mean | string or null | 도메인에 오타가 있어 보일 때 제안하는 수정된 주소. |
checked_at | string | 검증 실행 시각, ISO 8601 UTC 형식. |
credits_used | integer | 1, 상태가 unknown이면 0. |
상태
| 상태 | 의미 | 권장 조치 |
|---|---|---|
valid | 메일함이 존재하며 메일을 수신합니다. | 보내기 |
invalid | 주소, 도메인 또는 메일함이 존재하지 않습니다. | 삭제 |
disposable | 임시 메일함 서비스입니다. | 삭제 |
catch_all | 도메인이 모든 주소를 수신하므로 메일함을 확인할 수 없습니다. | 검토 |
role | 존재하는 공유 메일함입니다. | 검토 |
unknown | 메일 서버가 제시간에 응답하지 않았습니다. 요금 없음. | 나중에 재시도 |
배치
요청 한 번에 최대 100,000개의 주소를 보낼 수 있습니다. 배치는 백그라운드에서 실행됩니다. 상태를 폴링하거나 callback_url을 지정하면 배치가 완료될 때 해당 URL을 호출합니다.
배치 생성
POST https://bouncebell.com/api/v1/batches
curl -X POST "https://bouncebell.com/api/v1/batches" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "October import", "emails": ["a@example.com", "b@example.com"],
"callback_url": "https://yourapp.example/hooks/bouncebell"}'
{ "id": "bat_8f2k1q3m9x7w4p", "status": "queued", "total": 2, "done": 0 }
배치를 생성할 때 고유 주소마다 크레딧이 예약되고, 완료 시 알 수 없음 결과에 대한 크레딧은 환불됩니다. 콜백은 {"event": "batch.completed", "batch_id": "...", "status": "done", "counts": {...}}가 담긴 POST를 받습니다. 콜백 URL은 HTTPS를 사용해야 합니다.
진행 상황 확인
GET https://bouncebell.com/api/v1/batches/{id}
{ "id": "bat_8f2k1q3m9x7w4p", "status": "running", "total": 2, "done": 1 }
상태는 queued, running, done 중 하나입니다. done이면 응답에 상태별 counts도 포함됩니다.
결과 다운로드
GET https://bouncebell.com/api/v1/batches/{id}/results
기본적으로 JSON을 반환합니다. CSV 파일이 필요하면 ?format=csv를 추가하세요. 각 행에는 단건 검증과 같은 필드가 포함됩니다.
크레딧
GET https://bouncebell.com/api/v1/credits
{ "credits_remaining": 33420 }
오류 및 제한
오류가 발생하면 error 코드와 읽기 쉬운 message가 담긴 JSON 본문이 반환됩니다.
| HTTP 코드 | 오류 | 조치 방법 |
|---|---|---|
| 400 | bad_request | 매개변수가 없거나 잘못되었습니다. 메시지를 확인하세요. |
| 401 | invalid_key | 키가 올바른지, 폐기되지 않았는지 확인하세요. |
| 402 | no_credits | 크레딧을 추가로 구매하세요. |
| 403 | email_not_confirmed | 가입 시 이메일로 보내 드린 인증 링크를 여세요. |
| 404 | not_found | 배치가 존재하지 않거나 30일 후 삭제되었습니다. |
| 429 | rate_limited | 속도를 줄이세요. Retry-After 헤더에 표시된 초만큼 기다리세요. |
| 500 | server_error | 잠시 후 다시 시도하세요. 계속 발생하면 지원팀에 문의하세요. |
단건 검증은 키당 초당 20건으로 제한됩니다. 더 필요하면 문의하세요.