Thunderbit Open API
시작하기
Thunderbit Open API는 강력한 웹 디스틸레이션 및 지능형 데이터 추출 기능을 제공하여 모든 웹 콘텐츠를 LLM에 적합한 형식으로 변환합니다.
주요 기능
🔥 웹 디스틸레이션 - 웹 페이지를 깔끔한 마크다운 형식으로 변환하여 AI 애플리케이션에 최적화
🧠 AI 기반 추출 - 스키마 또는 자연어 프롬프트를 사용하여 구조화된 데이터 추출
⚡ 배치 처리 - 비동기 작업 관리로 여러 URL을 동시에 처리
🛡️ 엔터프라이즈 지원 - JavaScript 렌더링, 안티봇 조치, 프록시 및 동적 콘텐츠를 자동으로 처리
자동 처리 기능
- 동적 콘텐츠: JavaScript로 렌더링된 페이지, SPA 및 AJAX로 로드된 콘텐츠
- 안티봇 보호: CAPTCHA 및 봇 감지 시스템 자동 처리
- 콘텐츠 처리: 최적의 AI 활용을 위한 지능형 정리 및 포맷팅
- 메타데이터 추출: 제목, 설명 및 구조화된 메타데이터 자동 추출
인증
모든 API 요청에는 헤더에 API 키가 필요합니다:
Authorization: Bearer <YOUR_API_KEY>
Thunderbit 대시보드에서 API 키를 발급받으세요.
요청 제한
| 플랜 | 요청 제한 | 동시 처리 | 적합한 용도 |
|---|
| Free | 10 요청/분 | 2 동시 | 테스트 및 프로토타이핑 |
| Pro | 100 요청/분 | 10 동시 | 프로덕션 앱 |
| Enterprise | 1000 요청/분 | 50 동시 | 대규모 운영 |
출력 형식
- 마크다운: 깔끔하고 LLM에 최적화된 마크다운 형식
- 구조화된 데이터: 스키마 기반 JSON 출력
- 메타데이터: 페이지 메타데이터 자동 추출
Base URL
https://open.thunderbit.com/v1 — 프로덕션 서버
Authentication
Type: HTTP Bearer (JWT). Header format: Authorization: Bearer YOUR_API_KEY
Thunderbit 대시보드에서 발급받은 API 키를 입력하세요. 헤더 형식: `Authorization: Bearer YOUR_API_KEY`
Error Responses
Unauthorized
인증 실패, 유효하지 않은 API 키
RateLimited
너무 많은 요청, 요청 제한 초과
- X-RateLimit-Limit: 요청 제한 상한
- X-RateLimit-Remaining: 남은 요청 수
- X-RateLimit-Reset: 초기화 타임스탬프
Schemas
Error
표준 오류 응답 형식
- success (boolean):
- error (object):
- code (string): 오류 코드:
- INVALID_URL: 유효하지 않은 URL 형식
- URL_NOT_ACCESSIBLE: 대상 URL에 접근할 수 없음
- TIMEOUT: 요청 타임아웃
- QUOTA_EXCEEDED: 할당량 초과
- RATE_LIMITED: 요청 제한 초과
- INVALID_SCHEMA: 유효하지 않은 스키마 형식
- EXTRACTION_FAILED: AI 추출 실패
- BATCH_SIZE_EXCEEDED: 배치 요청 수 한도 초과
- INVALID_WEBHOOK_URL: 유효하지 않은 웹훅 URL 형식 또는 HTTPS 아님
- WEBHOOK_DELIVERY_FAILED: 웹훅 콜백 전송 실패
- message (string): 오류 설명 메시지
Metadata
HTML 메타 태그, Open Graph, Twitter Cards에서 추출한 페이지 메타데이터
DistillResult
웹 페이지를 깔끔한 Markdown 형식으로 변환한 결과
ExtractResult
AI 기반 구조화 데이터 추출 결과
BatchJob
배치 처리 작업의 상태 및 결과
디스틸
웹 페이지를 깔끔하고 LLM에 적합한 마크다운 형식으로 변환합니다. JavaScript 렌더링, 동적 콘텐츠 및 안티봇 보호를 자동으로 처리합니다.
POST /distill — 단일 페이지 디스틸
웹 페이지를 깔끔하고 LLM에 적합한 마크다운 형식으로 변환합니다.
사용 사례:
- RAG(검색 증강 생성)를 위한 웹 콘텐츠 준비
- AI 처리를 위한 기사 콘텐츠 추출
- 문서 페이지를 마크다운으로 변환
- 동적 웹 애플리케이션 처리
포함 기능:
- 구조가 보존된 깔끔한 마크다운 콘텐츠
- 광고, 내비게이션 및 보일러플레이트 자동 제거
- 메타데이터 추출(제목, 설명, 언어)
- 동적 콘텐츠를 위한 JavaScript 렌더링
- 안티봇 조치 자동 처리
출력 형식:
최소한의 노이즈와 최대한의 정보로 LLM 활용에 최적화된 마크다운을 반환합니다.
Request Body
- url (string) *required: 디스틸할 웹 페이지의 URL
- timeout (number): 요청 타임아웃(밀리초) (기본값: 30000, 최대: 60000)
- waitFor (number): 콘텐츠 추출 전 동적 콘텐츠 렌더링을 위해 페이지 로드 후 대기할 시간(밀리초)
- includeTags (string[]): 이 HTML 태그의 콘텐츠만 포함 (예: ['article', 'main', 'div.content'])
- excludeTags (string[]): 이 HTML 태그의 콘텐츠 제외 (예: ['nav', 'footer', 'aside'])
- headers (object): 요청과 함께 전송할 사용자 정의 HTTP 헤더
Response (200): 성공 응답
- success (boolean):
- data (object):
- url (string): 디스틸된 URL
- markdown (string): 페이지에서 추출된 깔끔한 마크다운 콘텐츠
- html (string): 원본 HTML 콘텐츠 (선택 사항, 요청 시에만)
- metadata (object):
- title (string): <title> 태그 또는 Open Graph에서 추출된 페이지 제목
- description (string): 메타 설명 또는 발췌문
- language (string): 감지된 언어 코드 (ISO 639-1)
- author (string): 기사 작성자 (가능한 경우)
- publishedDate (string): 게시 날짜 (가능한 경우)
- image (string): Open Graph 또는 Twitter Card의 대표 이미지 URL
- sourceURL (string): 원본 URL (리다이렉트로 인해 요청된 URL과 다를 수 있음)
- statusCode (integer): 응답의 HTTP 상태 코드
- contentLength (integer): 마크다운 콘텐츠의 문자 수
- links (object[]): 콘텐츠에서 발견된 링크
Example Request
curl 'https://open.thunderbit.com/v1/distill' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"url":"https://example.com/article","timeout":30000,"waitFor":2000,"includeTags":["article","main"],"excludeTags":["nav","footer","aside"],"headers":{"User-Agent":"MyBot/1.0"}}'
Example Response
{
"success": true,
"data": {
"url": "https://example.com/article",
"markdown": "# Article Title\n\nContent...",
"html": "<article>...</article>",
"metadata": {
"title": "string",
"description": "string",
"language": "string",
"author": "string",
"publishedDate": "2025-01-01T00:00:00Z",
"image": "string",
"sourceURL": "string",
"statusCode": 1,
"contentLength": 1
},
"links": [
{
"text": "string",
"href": "string"
}
]
}
}
POST /batch/distill — 여러 페이지 배치 디스틸
비동기 처리로 여러 웹 페이지를 동시에 디스틸합니다.
사용 사례:
- 전체 웹사이트 섹션 또는 카테고리 처리
- 지식 베이스에 콘텐츠 일괄 가져오기
- 대규모 콘텐츠 마이그레이션
- 여러 소스에서 주기적인 콘텐츠 업데이트
작동 방식:
최대 100개의 URL로 배치 작업 제출
즉시 작업 ID 수신
상태 엔드포인트 폴링 또는 웹훅 알림 수신
완료 시 모든 결과 조회
기능:
- 높은 처리량을 위한 비동기 처리
- 실패 시 자동 재시도
- 완료 시 웹훅 알림
- URL별 상세한 상태 및 오류 보고
Request Body
- urls (string[]) *required: 디스틸할 URL 목록, 최대 100개
- timeout (number): 요청당 타임아웃(밀리초), 기본값 30000
- webhook (object): 웹훅 콜백 설정, 작업 완료 시 알림
- url (string): 웹훅 콜백 URL, HTTPS 필수
- headers (object): 사용자 정의 콜백 헤더, 인증에 사용 가능
Response (200): 성공 응답
- success (boolean):
- data (object):
- id (string): 배치 작업 ID
- status (string):
- total (integer):
- completed (integer):
- creditsUsed (integer):
Example Request
curl 'https://open.thunderbit.com/v1/batch/distill' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"urls":["https://example.com/page1","https://example.com/page2"],"timeout":1,"webhook":{"url":"string","headers":{}}}'
Example Response
{
"success": true,
"data": {
"id": "batch_abc123",
"status": "processing",
"total": 3,
"completed": 0,
"creditsUsed": 0
}
}
GET /batch/distill/{id} — 배치 디스틸 작업 상태 조회
배치 디스틸 작업의 상태를 확인하고 결과를 조회합니다.
응답 상태:
processing: 작업 진행 중
completed: 모든 URL 처리 완료
failed: 작업에서 치명적 오류 발생
폴링 모범 사례:
- 10개 미만의 URL 작업은 5-10초마다 폴링
- 더 큰 작업은 30-60초마다 폴링
- 더 나은 효율성을 위해 웹훅 사용
부분 결과:
작업이 진행 중인 동안 완료된 결과를 조회할 수 있습니다. results 배열에는 지금까지 처리된 모든 URL이 포함됩니다.
Parameters
- id (string) *required: 배치 작업 ID
Response (200): 성공 응답
- success (boolean):
- data (object):
- id (string):
- status (string):
- total (integer):
- completed (integer):
- creditsUsed (integer):
- results (object[]):
Example Request
curl 'https://open.thunderbit.com/v1/batch/distill/{id}' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
Example Response
{
"success": true,
"data": {
"id": "batch_abc123",
"status": "string",
"total": 1,
"completed": 1,
"creditsUsed": 1,
"results": [
{
"url": "string",
"success": true,
"markdown": "string",
"error": {
"code": "string",
"message": "string"
}
}
]
}
}
추출
AI 기반 구조화된 데이터 추출. JSON 스키마 또는 자연어 프롬프트를 사용하여 원하는 데이터 구조를 정의하면 AI가 정보를 추출합니다.
POST /extract — AI 기반 구조화된 추출
AI를 사용하여 웹 페이지에서 구조화된 데이터를 추출합니다. JSON 스키마로 원하는 출력 구조를 정의하면 AI가 지능적으로 정보를 추출합니다.
사용 사례:
- 이커머스 페이지에서 상품 정보 추출
- 채용 공고를 구조화된 형식으로 파싱
- 연락처 정보 및 비즈니스 세부 정보 추출
- 뉴스 기사를 구조화된 데이터로 변환
- 가격표 및 사양 스크래핑
작동 방식:
URL과 원하는 구조를 정의하는 JSON 스키마 제공
AI가 페이지 콘텐츠 분석
스키마에 맞는 데이터 추출
검증된 JSON 출력 반환
스키마 정의:
JSON 스키마를 사용하여 원하는 출력 구조를 정의합니다:
- 필드 유형: string, number, boolean, array, object
- 필드 설명: AI가 무엇을 추출해야 하는지 이해하도록 도움
- 필수 필드: 중요한 필드를 필수로 표시
- 중첩 구조: 복잡한 중첩 데이터 지원
스키마 예시:
{
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "상품명 또는 제목"
},
"price": {
"type": "number",
"description": "현재 가격 (USD)"
},
"availability": {
"type": "boolean",
"description": "상품 재고 여부"
},
"features": {
"type": "array",
"items": {"type": "string"},
"description": "주요 상품 특징 목록"
}
},
"required": ["title", "price"]
}
Request Body
- url (string) *required: 데이터를 추출할 웹 페이지의 URL
- schema (object) *required: JSON 스키마 형식의 데이터 구조 정의
- timeout (number): 요청 타임아웃(밀리초), 기본값 30000
Response (200): 성공 응답
- success (boolean):
- data (object):
- url (string):
- extract (object): 스키마와 일치하는 추출된 구조화된 데이터
- metadata (object):
- sourceURL (string):
- statusCode (integer):
- extractedAt (string):
- confidence (number): 추출 품질에 대한 AI 신뢰도 점수 (0-1)
- processingTime (integer): 처리 소요 시간(밀리초)
Example Request
curl 'https://open.thunderbit.com/v1/extract' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"url":"https://example.com/product","schema":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}},"required":["name","price"]},"timeout":1}'
Example Response
{
"success": true,
"data": {
"url": "https://example.com/product",
"extract": {
"name": "iPhone 15 Pro",
"price": 999,
"currency": "USD"
},
"metadata": {
"sourceURL": "string",
"statusCode": 1,
"extractedAt": "2025-01-01T00:00:00Z",
"confidence": 1,
"processingTime": 1
}
}
}
POST /extract/batch — 여러 페이지 배치 추출
AI를 사용하여 여러 URL에서 동시에 구조화된 데이터를 추출합니다.
사용 사례:
- 여러 페이지에서 상품 카탈로그 스크래핑
- 검색 결과 페이지에서 데이터 추출
- 목록 또는 디렉토리 페이지 일괄 처리
- 대규모 경쟁 정보 수집
작동 방식:
단일 스키마로 최대 50개의 URL 제출
즉시 작업 ID 응답 수신
모든 URL에 동일한 스키마 적용
상태 폴링 또는 웹훅 알림 수신
모든 구조화된 결과 한 번에 조회
기능:
- 모든 URL에 동일한 스키마 적용
- 속도를 위한 병렬 처리
- URL별 개별 오류 처리
- 웹훅 알림 가능
Request Body
- urls (string[]) *required: 데이터를 추출할 URL 목록, 최대 50개
- schema (object) *required: JSON 스키마 형식의 데이터 구조 정의
- timeout (number): 요청당 타임아웃(밀리초), 기본값 30000
- webhook (object): 웹훅 콜백 설정, 작업 완료 시 알림
- url (string): 웹훅 콜백 URL, HTTPS 필수
- headers (object):
Response (200): 성공 응답
- success (boolean):
- data (object):
- id (string):
- status (string):
- total (integer):
- completed (integer):
Example Request
curl 'https://open.thunderbit.com/v1/extract/batch' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"urls":["string"],"schema":{},"timeout":1,"webhook":{"url":"string","headers":{}}}'
Example Response
{
"success": true,
"data": {
"id": "batch_ext_xyz789",
"status": "string",
"total": 1,
"completed": 1
}
}
GET /extract/batch/{id} — 배치 추출 작업 상태 조회
배치 추출 작업의 상태를 확인하고 추출된 데이터를 조회합니다.
응답 상태:
processing: 추출 진행 중
completed: 모든 추출 완료
failed: 작업 실패 (오류 세부 정보 확인)
결과 형식:
결과 배열의 각 URL에는 다음이 포함됩니다:
- 스키마와 일치하는 추출된 데이터
- 성공/실패 상태
- 해당하는 경우 개별 오류 메시지
- 추출 품질에 대한 신뢰도 점수
Parameters
- id (string) *required: 배치 작업 ID
Response (200): 성공 응답
- success (boolean):
- data (object):
- id (string):
- status (string):
- total (integer):
- completed (integer):
- creditsUsed (integer):
- results (object[]):
Example Request
curl 'https://open.thunderbit.com/v1/extract/batch/{id}' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
Example Response
{
"success": true,
"data": {
"id": "string",
"status": "string",
"total": 1,
"completed": 1,
"creditsUsed": 1,
"results": [
{
"url": "string",
"success": true,
"extract": {},
"error": {
"code": "string",
"message": "string"
}
}
]
}
}