Thunderbit Open API
はじめに
Thunderbit Open APIは、強力なWebディスティレーションとインテリジェントなデータ抽出機能を提供し、あらゆるWebコンテンツをLLM対応フォーマットに変換します。
主な機能
🔥 Webディスティレーション - WebページをクリーンなMarkdown形式に変換、AIアプリケーションに最適
🧠 AI搭載の抽出 - スキーマまたは自然言語プロンプトを使用して構造化データを抽出
⚡ バッチ処理 - 非同期ジョブ管理で複数のURLを同時に処理
🛡️ エンタープライズ対応 - JavaScriptレンダリング、アンチボット対策、プロキシ、動的コンテンツを自動的に処理
自動処理される項目
- 動的コンテンツ: JavaScriptでレンダリングされたページ、SPA、AJAXで読み込まれたコンテンツ
- アンチボット保護: CAPTCHAおよびボット検出システムの自動処理
- コンテンツ処理: AI消費に最適なインテリジェントなクリーニングとフォーマット
- メタデータ抽出: タイトル、説明、構造化メタデータの自動抽出
認証
すべてのAPIリクエストにはヘッダーにAPIキーが必要です:
Authorization: Bearer <YOUR_API_KEY>
APIキーはThunderbitダッシュボードから取得してください。
レート制限
| プラン | リクエスト制限 | 同時接続数 | 推奨用途 |
|---|
| Free | 10リクエスト/分 | 2同時接続 | テストとプロトタイピング |
| Pro | 100リクエスト/分 | 10同時接続 | 本番アプリケーション |
| Enterprise | 1000リクエスト/分 | 50同時接続 | 大規模運用 |
出力フォーマット
- Markdown: クリーンなLLM最適化Markdownフォーマット
- 構造化データ: スキーマに基づく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: 無効なWebhook URLフォーマットまたはHTTPSでない
- WEBHOOK_DELIVERY_FAILED: Webhookコールバックの配信に失敗
- message (string): エラー説明メッセージ
Metadata
HTML metaタグ、Open Graph、Twitter Cardsから抽出されたページメタデータ
DistillResult
ウェブページをクリーンなMarkdown形式に変換した結果
ExtractResult
AI駆動の構造化データ抽出結果
BatchJob
バッチ処理ジョブのステータスと結果
ディスティル
WebページをクリーンなLLM対応Markdown形式に変換します。JavaScriptレンダリング、動的コンテンツ、アンチボット保護を自動的に処理します。
POST /distill — 単一ページのディスティル
WebページをクリーンなLLM対応Markdown形式に変換します。
ユースケース:
- RAG(Retrieval-Augmented Generation)用のWebコンテンツ準備
- AI処理用の記事コンテンツ抽出
- ドキュメントページのMarkdown変換
- 動的Webアプリケーションの処理
含まれる機能:
- 構造を保持したクリーンなMarkdownコンテンツ
- 広告、ナビゲーション、定型文の自動削除
- メタデータ抽出(タイトル、説明、言語)
- 動的コンテンツ用のJavaScriptレンダリング
- アンチボット対策の自動処理
出力フォーマット:
ノイズを最小限に抑え、信号を最大化したLLM消費に最適化されたMarkdownを返します。
Request Body
- url (string) *required: ディスティルするWebページの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): ページから抽出されたクリーンなMarkdownコンテンツ
- 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): Markdownコンテンツの文字数
- 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 — 複数ページのバッチディスティル
非同期処理で複数のWebページを同時にディスティルします。
ユースケース:
- Webサイト全体のセクションやカテゴリの処理
- ナレッジベースへのコンテンツの一括インポート
- 大規模なコンテンツ移行
- 複数ソースからの定期的なコンテンツ更新
動作の仕組み:
最大100個のURLでバッチジョブを送信
ジョブIDを即座に受信
ステータスエンドポイントをポーリングするか、Webhook通知を受信
完了時にすべての結果を取得
機能:
- 高スループットのための非同期処理
- 失敗時の自動リトライ
- 完了時のWebhook通知
- URLごとの詳細なステータスとエラーレポート
Request Body
- urls (string[]) *required: ディスティルするURLのリスト、最大100件
- timeout (number): リクエストごとのタイムアウト(ミリ秒)、デフォルト30000
- webhook (object): Webhookコールバック設定、タスク完了時に通知
- url (string): Webhookコールバック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秒ごとにポーリング
- 効率化のためにWebhookを使用
部分的な結果:
ジョブの処理中でも、完了した結果を取得できます。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を使用してWebページから構造化データを抽出します。JSONスキーマで希望する出力構造を定義すると、AIがインテリジェントに情報を抽出します。
ユースケース:
- ECサイトから商品情報を抽出
- 求人情報を構造化フォーマットにパース
- 連絡先情報とビジネス詳細を抽出
- ニュース記事を構造化データに変換
- 価格表や仕様をスクレイピング
動作の仕組み:
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: データを抽出するWebページの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が同じスキーマを使用して抽出
ステータスをポーリングするか、Webhook通知を受信
すべての構造化結果を一度に取得
機能:
- すべてのURLに同じスキーマを適用
- 高速化のための並列処理
- URLごとの個別エラー処理
- Webhook通知が利用可能
Request Body
- urls (string[]) *required: データを抽出するURLのリスト、最大50件
- schema (object) *required: JSONスキーマ形式のデータ構造定義
- timeout (number): リクエストごとのタイムアウト(ミリ秒)、デフォルト30000
- webhook (object): Webhookコールバック設定、タスク完了時に通知
- url (string): Webhookコールバック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"
}
}
]
}
}