BillionVerify LogoBillionVerify

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/v1

OpenAPI 사양

전체 API 사양은 OpenAPI 3.0 형식으로 제공됩니다:

OpenAPI 사양을 Postman, Insomnia 등의 도구로 가져오거나 클라이언트 라이브러리 생성에 사용할 수 있습니다.

인증

모든 API 요청은 BV-API-KEY 헤더를 사용한 인증이 필요합니다:

BV-API-KEY: YOUR_API_KEY

BillionVerify 대시보드에서 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"}'

요청 제한

플랜시간당 요청일일 요청
Free1001,000
Starter1,00010,000
Professional10,000100,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
}

파라미터

파라미터타입필수기본값설명
emailstring-인증할 이메일 주소
smtp_checkboolean아니오trueSMTP 메일박스 인증 수행
timeoutinteger아니오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
}

응답 필드

필드타입설명
emailstring인증된 이메일 주소
statusstring인증 상태: valid, invalid, unknown, catchall
resultobject상세 인증 결과
scorenumber신뢰도 점수 (0.0 - 1.0)
reasonstringinvalid/unknown 상태의 이유 (nullable)
credits_usedinteger소비된 크레딧 수

Result 객체 필드

필드타입설명
deliverableboolean이메일이 메시지를 받을 수 있는지 여부
valid_formatboolean이메일이 유효한 구문인지 여부
valid_domainboolean도메인이 존재하는지 여부
valid_mxboolean도메인에 MX 레코드가 있는지 여부
disposableboolean일회용 서비스의 이메일인지 여부
roleboolean역할 기반 이메일인지 여부 (info@, support@)
catchallboolean도메인이 모든 이메일을 수락하는지 여부
freeboolean무료 제공업체의 이메일인지 여부
smtp_validbooleanSMTP 인증 통과 여부

대량 이메일 인증

여러 이메일 주소를 동기적으로 인증합니다. 소량의 대량 인증(최대 50개)에 적합합니다.

POST /verify/bulk

요청

{
  "emails": [
    "user1@example.com",
    "user2@example.com",
    "user3@example.com"
  ],
  "check_smtp": true
}

파라미터

파라미터타입필수기본값설명
emailsarray-이메일 주소 배열 (최대: 50)
check_smtpboolean아니오trueSMTP 인증 수행

응답

{
  "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"

파라미터

파라미터타입필수설명
filefileCSV 또는 Excel 파일 (최대: 20MB, 100,000행)
email_columnstring아니오이메일이 포함된 열 이름 (미지정 시 자동 감지)

지원 파일 형식

  • 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

쿼리 파라미터

파라미터타입기본값설명
validboolean-유효한 이메일 포함
invalidboolean-무효한 이메일 포함
catchallboolean-캐치올 이메일 포함
roleboolean-역할 이메일 포함
unknownboolean-알 수 없는 이메일 포함

필터 파라미터 없이 요청하면 전체 결과 파일을 반환합니다. 필터 파라미터가 있으면 일치하는 이메일만 포함된 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"

인증 상태

상태점수의미권장 조치
valid0.9+이메일이 존재하며 메시지를 받을 수 있음발송 안전
invalid0.1이메일이 존재하지 않거나 받을 수 없음목록에서 제거
unknown0.5유효성을 확인할 수 없음나중에 재시도하거나 주의해서 사용
risky0.4위험 요소 존재주의해서 사용, 반송 모니터링
disposable0.3일회용 이메일 주소제거 고려
catchall0.7도메인이 모든 이메일을 수락 (캐치올)반송 여부 모니터링
role0.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_KEY401API 키가 유효하지 않거나 누락됨
RATE_LIMIT_EXCEEDED429너무 많은 요청
INSUFFICIENT_CREDITS403크레딧 부족
INVALID_EMAIL400이메일 형식이 유효하지 않음
INVALID_REQUEST400요청 본문 형식이 잘못됨
JOB_NOT_FOUND404대량 작업 ID를 찾을 수 없음
TIMEOUT504인증 시간 초과

Webhooks

파일 검증 작업이 완료되면 실시간 알림을 받습니다.

Webhook 생성

POST /webhooks

요청

{
  "url": "https://your-app.com/webhooks/billionverify",
  "events": ["file.completed", "file.failed"]
}

파라미터

파라미터유형필수설명
urlstringWebhook 알림을 받을 HTTPS URL
eventsarray구독할 이벤트

응답

{
  "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-TimestampWebhook 전송 시 Unix 타임스탬프
User-AgentBillionVerify-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를 사용하세요:

다음 단계

On this page