API Reference
Complete email checker API reference. Endpoints, parameters, response codes for email verification and validation.
BillionVerify API는 강력한 이메일 인증 기능을 제공하는 RESTful 서비스입니다. 모든 API 요청은 HTTPS를 통해 이루어져야 합니다.
기본 URL
https://api.billionverify.com/v1OpenAPI 사양
전체 API 사양은 OpenAPI 3.0 형식으로 제공됩니다:
- OpenAPI YAML: https://api.billionverify.com/openapi.yaml
- 대화형 API 문서: https://api.billionverify.com/docs
OpenAPI 사양을 Postman, Insomnia 등의 도구로 가져오거나 클라이언트 라이브러리 생성에 사용할 수 있습니다.
인증
모든 API 요청은 BV-API-KEY 헤더를 사용한 인증이 필요합니다:
BV-API-KEY: YOUR_API_KEYBillionVerify 대시보드에서 API 키를 발급받으세요.
예제
curl -X POST https://api.billionverify.com/v1/verify/single \
-H "BV-API-KEY: bv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'요청 제한
| 플랜 | 시간당 요청 | 일일 요청 |
|---|---|---|
| Free | 100 | 1,000 |
| Starter | 1,000 | 10,000 |
| Professional | 10,000 | 100,000 |
| Enterprise | 맞춤 | 맞춤 |
요청 제한 정보는 응답 헤더에 포함됩니다:
| 헤더 | 설명 |
|---|---|
X-RateLimit-Limit | 허용된 최대 요청 수 |
X-RateLimit-Remaining | 윈도우 내 남은 요청 수 |
X-RateLimit-Reset | 제한이 재설정되는 Unix 타임스탬프 |
요청 제한을 초과하면 429 Too Many Requests 응답을 받게 됩니다:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please try again later.",
"retry_after": 3600
}
}엔드포인트
단일 이메일 인증
상세 결과와 함께 단일 이메일 주소를 인증합니다.
POST /verify/single요청
{
"email": "user@example.com",
"check_smtp": true
}파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
email | string | 예 | - | 인증할 이메일 주소 |
smtp_check | boolean | 아니오 | true | SMTP 메일박스 인증 수행 |
timeout | integer | 아니오 | 5000 | 요청 타임아웃(밀리초, 최대: 30000) |
응답
{
"email": "user@example.com",
"status": "valid",
"result": {
"deliverable": true,
"valid_format": true,
"valid_domain": true,
"valid_mx": true,
"disposable": false,
"role": false,
"catchall": false,
"free": false,
"smtp_valid": true
},
"score": 0.95,
"reason": null,
"credits_used": 1
}응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
email | string | 인증된 이메일 주소 |
status | string | 인증 상태: valid, invalid, unknown, catchall |
result | object | 상세 인증 결과 |
score | number | 신뢰도 점수 (0.0 - 1.0) |
reason | string | invalid/unknown 상태의 이유 (nullable) |
credits_used | integer | 소비된 크레딧 수 |
Result 객체 필드
| 필드 | 타입 | 설명 |
|---|---|---|
deliverable | boolean | 이메일이 메시지를 받을 수 있는지 여부 |
valid_format | boolean | 이메일이 유효한 구문인지 여부 |
valid_domain | boolean | 도메인이 존재하는지 여부 |
valid_mx | boolean | 도메인에 MX 레코드가 있는지 여부 |
disposable | boolean | 일회용 서비스의 이메일인지 여부 |
role | boolean | 역할 기반 이메일인지 여부 (info@, support@) |
catchall | boolean | 도메인이 모든 이메일을 수락하는지 여부 |
free | boolean | 무료 제공업체의 이메일인지 여부 |
smtp_valid | boolean | SMTP 인증 통과 여부 |
대량 이메일 인증
여러 이메일 주소를 동기적으로 인증합니다. 소량의 대량 인증(최대 50개)에 적합합니다.
POST /verify/bulk요청
{
"emails": [
"user1@example.com",
"user2@example.com",
"user3@example.com"
],
"check_smtp": true
}파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
emails | array | 예 | - | 이메일 주소 배열 (최대: 50) |
check_smtp | boolean | 아니오 | true | SMTP 인증 수행 |
응답
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"results": [
{
"email": "user1@example.com",
"status": "valid",
"score": 0.95,
"is_deliverable": true,
"is_disposable": false,
"is_catchall": false,
"is_role": false,
"is_free": false,
"domain": "example.com",
"smtp_check": true,
"reason": null,
"credits_used": 1
}
],
"total_emails": 3,
"valid_emails": 2,
"invalid_emails": 1,
"credits_used": 3,
"process_time": 2500
}
}크레딧 확인
현재 크레딧 잔액 및 사용 정보를 가져옵니다.
GET /credits응답
{
"available": 9500,
"used": 500,
"total": 10000,
"plan": "Professional",
"resets_at": "2025-02-01T00:00:00Z",
"rate_limit": {
"requests_per_hour": 10000,
"remaining": 9850
}
}파일 업로드 검증
CSV 또는 Excel 파일을 업로드하여 비동기 이메일 검증을 수행합니다. 대규모 목록에 적합합니다.
POST /verify/file요청
curl -X POST https://api.billionverify.com/v1/verify/file \
-H "BV-API-KEY: sk_your_api_key" \
-F "file=@emails.csv"파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
file | file | 예 | CSV 또는 Excel 파일 (최대: 20MB, 100,000행) |
email_column | string | 아니오 | 이메일이 포함된 열 이름 (미지정 시 자동 감지) |
지원 파일 형식
- CSV (.csv)
- Excel (.xlsx, .xls)
- 텍스트 (.txt) - 줄당 하나의 이메일
응답
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"task_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"status": "pending",
"message": "File uploaded successfully, processing started",
"file_name": "emails.csv",
"file_size": 45678,
"estimated_count": 1000,
"unique_emails": 950,
"total_rows": 1000,
"email_column": "email",
"status_url": "/v1/verify/file/7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"created_at": "2026-02-04T10:30:00Z"
}
}파일 작업 상태 조회
파일 검증 작업의 상태를 확인합니다.
GET /verify/file/{job_id}응답 (처리 중)
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"status": "processing",
"file_name": "emails.csv",
"total_emails": 1000,
"processed_emails": 450,
"progress_percent": 45,
"valid_emails": 380,
"invalid_emails": 50,
"unknown_emails": 20,
"created_at": "2026-02-04T10:30:00Z"
}
}응답 (완료)
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"status": "completed",
"file_name": "emails.csv",
"total_emails": 1000,
"processed_emails": 1000,
"progress_percent": 100,
"valid_emails": 850,
"invalid_emails": 100,
"unknown_emails": 30,
"role_emails": 15,
"catchall_emails": 5,
"disposable_emails": 0,
"credits_used": 970,
"process_time_seconds": 125.5,
"result_file_path": "results/2026/02/04/result_xxx.csv",
"download_url": "/v1/verify/file/7143874e-21c5-43c1-96f3-2b52ea41ae6a/results",
"created_at": "2026-02-04T10:30:00Z",
"completed_at": "2026-02-04T10:32:05Z"
}
}검증 결과 다운로드
완료된 작업의 검증 결과를 다운로드합니다.
GET /verify/file/{job_id}/results쿼리 파라미터
| 파라미터 | 타입 | 기본값 | 설명 |
|---|---|---|---|
valid | boolean | - | 유효한 이메일 포함 |
invalid | boolean | - | 무효한 이메일 포함 |
catchall | boolean | - | 캐치올 이메일 포함 |
role | boolean | - | 역할 이메일 포함 |
unknown | boolean | - | 알 수 없는 이메일 포함 |
필터 파라미터 없이 요청하면 전체 결과 파일을 반환합니다. 필터 파라미터가 있으면 일치하는 이메일만 포함된 CSV를 반환합니다.
예제: 전달 가능한 이메일 다운로드
curl -o deliverable.csv \
"https://api.billionverify.com/v1/verify/file/{job_id}/results?valid=true&catchall=true&role=true" \
-H "BV-API-KEY: sk_your_api_key"인증 상태
| 상태 | 점수 | 의미 | 권장 조치 |
|---|---|---|---|
valid | 0.9+ | 이메일이 존재하며 메시지를 받을 수 있음 | 발송 안전 |
invalid | 0.1 | 이메일이 존재하지 않거나 받을 수 없음 | 목록에서 제거 |
unknown | 0.5 | 유효성을 확인할 수 없음 | 나중에 재시도하거나 주의해서 사용 |
risky | 0.4 | 위험 요소 존재 | 주의해서 사용, 반송 모니터링 |
disposable | 0.3 | 일회용 이메일 주소 | 제거 고려 |
catchall | 0.7 | 도메인이 모든 이메일을 수락 (캐치올) | 반송 여부 모니터링 |
role | 0.6 | 역할 기반 이메일 (info@, support@ 등) | 일반적으로 전달 가능하나 참여도가 낮을 수 있음 |
오류 응답
모든 오류는 일관된 형식을 따릅니다:
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error message",
"details": "Additional context (optional)"
}
}HTTP 상태 코드
| 코드 | 설명 |
|---|---|
200 | 성공 |
400 | 잘못된 요청 - 유효하지 않은 파라미터 |
401 | 인증 실패 - 유효하지 않거나 누락된 API 키 |
403 | 금지됨 - 권한 부족 |
404 | 찾을 수 없음 - 리소스가 존재하지 않음 |
429 | 너무 많은 요청 - 요청 제한 초과 |
500 | 내부 서버 오류 |
503 | 서비스 사용 불가 |
오류 코드
| 코드 | HTTP 상태 | 설명 |
|---|---|---|
INVALID_API_KEY | 401 | API 키가 유효하지 않거나 누락됨 |
RATE_LIMIT_EXCEEDED | 429 | 너무 많은 요청 |
INSUFFICIENT_CREDITS | 403 | 크레딧 부족 |
INVALID_EMAIL | 400 | 이메일 형식이 유효하지 않음 |
INVALID_REQUEST | 400 | 요청 본문 형식이 잘못됨 |
JOB_NOT_FOUND | 404 | 대량 작업 ID를 찾을 수 없음 |
TIMEOUT | 504 | 인증 시간 초과 |
Webhooks
파일 검증 작업이 완료되면 실시간 알림을 받습니다.
Webhook 생성
POST /webhooks요청
{
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"]
}파라미터
| 파라미터 | 유형 | 필수 | 설명 |
|---|---|---|---|
url | string | 예 | Webhook 알림을 받을 HTTPS URL |
events | array | 예 | 구독할 이벤트 |
응답
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"id": "673f3bff-81ea-4730-9cef-af1eb7f134bf",
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"],
"secret": "5c609e6893ab3b65ce8940549a030bc165762fe171e0b38f880bd570099619bf",
"is_active": true,
"created_at": "2026-02-04T10:30:00Z",
"updated_at": "2026-02-04T10:30:00Z"
}
}중요: secret은 Webhook 생성 시에만 반환됩니다. 안전하게 저장하세요 - Webhook 서명 검증에 필요합니다.
Webhook 목록
GET /webhooks응답
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"webhooks": [
{
"id": "673f3bff-81ea-4730-9cef-af1eb7f134bf",
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"],
"is_active": true,
"created_at": "2026-02-04T10:30:00Z",
"updated_at": "2026-02-04T10:30:00Z"
}
],
"total": 1
}
}Webhook 삭제
DELETE /webhooks/{webhook_id}응답
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"message": "Webhook deleted successfully",
"webhook_id": "673f3bff-81ea-4730-9cef-af1eb7f134bf"
}
}Webhook 이벤트
| 이벤트 | 설명 |
|---|---|
file.completed | 파일 검증 작업이 성공적으로 완료됨 |
file.failed | 파일 검증 작업 실패 |
Webhook 페이로드
이벤트가 발생하면 Webhook URL로 POST 요청을 보냅니다:
{
"event": "file.completed",
"timestamp": "2026-02-04T10:35:00Z",
"data": {
"job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"file_name": "emails.csv",
"total_emails": 1000,
"valid_emails": 850,
"invalid_emails": 100,
"role_emails": 30,
"catchall_emails": 10,
"unknown_emails": 10,
"disposable_emails": 0,
"credits_used": 990,
"process_time_seconds": 125.5,
"result_file_path": "results/2026/02/04/result_xxx.csv",
"download_url": ""
}
}Webhook 헤더
| 헤더 | 설명 |
|---|---|
X-Webhook-Event | 이벤트 유형 (예: file.completed) |
X-Webhook-Signature | 검증용 HMAC-SHA256 서명 |
X-Webhook-Timestamp | Webhook 전송 시 Unix 타임스탬프 |
User-Agent | BillionVerify-Webhook/1.0 |
Webhook 서명 검증
Webhook이 BillionVerify에서 온 것인지 확인하려면 HMAC-SHA256 서명을 계산합니다:
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}import hmac
import hashlib
def verify_webhook_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)모범 사례
1. 환경 변수 사용
API 키를 하드코딩하지 마세요:
// Good
const apiKey = process.env.BV_API_KEY;
// Bad - don't do this
const apiKey = 'bv_live_xxx';2. 요청 제한 처리
지수 백오프를 구현하세요:
async function verifyWithRetry(email, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await verify(email);
} catch (error) {
if (error.code === 'RATE_LIMIT_EXCEEDED') {
await sleep(Math.pow(2, i) * 1000);
continue;
}
throw error;
}
}
}3. 여러 이메일에는 대량 처리 사용
10개 이상의 이메일을 인증할 때는 대량 엔드포인트를 사용하세요:
// Good - single API call
const job = await client.verifyBulk(emails);
// Bad - many individual calls
for (const email of emails) {
await client.verify(email);
}4. 대량 작업에 웹훅 구현
계속 폴링하지 말고 웹훅을 사용하세요:
// Submit with webhook
const job = await client.verifyBulk(emails, {
webhookUrl: 'https://your-app.com/webhook',
});SDK
더 쉬운 통합을 위해 공식 SDK를 사용하세요: