メインコンテンツへスキップ

インストール

公式の Go SDK は、Evocrawl のモノレポ内の apps/go-sdk で管理されています。 Evocrawl Go SDK をインストールするには、次を実行します。
go get github.com/firecrawl/firecrawl/apps/go-sdk
Go 1.23以降が必要です。

使用方法

  1. evocrawl.comでAPIキーを取得します
  2. APIキーを FIRECRAWL_API_KEY という名前の環境変数に設定するか、option.WithAPIKey(...) で渡します
以下は、現在のSDK APIを使った簡単な例です。
package main

import (
	"context"
	"fmt"
	"log"

	firecrawl "github.com/firecrawl/firecrawl/apps/go-sdk"
	"github.com/firecrawl/firecrawl/apps/go-sdk/option"
)

func main() {
	// クライアントを作成する(環境変数から FIRECRAWL_API_KEY を読み込む)
	client, err := firecrawl.NewClient()
	if err != nil {
		log.Fatal(err)
	}

	// または API キーを直接指定する
	client, err = firecrawl.NewClient(
		option.WithAPIKey("fc-your-api-key"),
	)
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()

	// 単一ページをスクレイピングする
	doc, err := client.Scrape(ctx, "https://evocrawl.com", &firecrawl.ScrapeOptions{
		Formats: []string{"markdown"},
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(doc.Markdown)

	// Web サイトをクロールする
	job, err := client.Crawl(ctx, "https://evocrawl.com", &firecrawl.CrawlOptions{
		Limit: firecrawl.Int(5),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Crawled pages: %d\n", len(job.Data))
}

URLをスクレイピングする

単一のURLをスクレイピングするには、Scrapeメソッドを使用します。
doc, err := client.Scrape(ctx, "https://evocrawl.com", &firecrawl.ScrapeOptions{
	Formats:         []string{"markdown", "html"},
	OnlyMainContent: firecrawl.Bool(true),
	WaitFor:         firecrawl.Int(5000),
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(doc.Markdown)
fmt.Println(doc.Metadata["title"])

JSON抽出

Scrape エンドポイントで JsonOptions を使用して、構造化されたJSONを抽出します:
doc, err := client.Scrape(ctx, "https://example.com/product", &firecrawl.ScrapeOptions{
	Formats: []string{"json"},
	JsonOptions: &firecrawl.JsonOptions{
		Prompt: "Extract the product name and price",
		Schema: map[string]interface{}{
			"type": "object",
			"properties": map[string]interface{}{
				"name":  map[string]interface{}{"type": "string"},
				"price": map[string]interface{}{"type": "number"},
			},
		},
	},
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(doc.JSON)

Web サイトをクロールする

Web サイトをクロールして完了を待つには、Crawl を使用します。
job, err := client.Crawl(ctx, "https://evocrawl.com", &firecrawl.CrawlOptions{
	Limit:             firecrawl.Int(50),
	MaxDiscoveryDepth: firecrawl.Int(3),
	ScrapeOptions: &firecrawl.ScrapeOptions{
		Formats: []string{"markdown"},
	},
})
if err != nil {
	log.Fatal(err)
}

fmt.Printf("Status: %s\n", job.Status)
fmt.Printf("Progress: %d/%d\n", job.Completed, job.Total)

for _, page := range job.Data {
	fmt.Println(page.Metadata["sourceURL"])
}

クロールを開始する

StartCrawl を使用すると、待機せずにジョブを開始できます。
resp, err := client.StartCrawl(ctx, "https://evocrawl.com", &firecrawl.CrawlOptions{
	Limit: firecrawl.Int(100),
})
if err != nil {
	log.Fatal(err)
}

fmt.Printf("Job ID: %s\n", resp.ID)

クロールのステータスを確認する

GetCrawlStatusでクロールの進行状況を確認します。
status, err := client.GetCrawlStatus(ctx, resp.ID)
if err != nil {
	log.Fatal(err)
}

fmt.Printf("Status: %s\n", status.Status)
fmt.Printf("Progress: %d/%d\n", status.Completed, status.Total)

クロールをキャンセルする

実行中のクロールは CancelCrawl でキャンセルできます。
result, err := client.CancelCrawl(ctx, resp.ID)
if err != nil {
	log.Fatal(err)
}

fmt.Println(result)

Web サイトのマッピング

Map を使ってサイト内のリンクを見つけます。
mapData, err := client.Map(ctx, "https://evocrawl.com", &firecrawl.MapOptions{
	Limit:             firecrawl.Int(100),
	Search:            firecrawl.String("blog"),
	IncludeSubdomains: firecrawl.Bool(true),
})
if err != nil {
	log.Fatal(err)
}

for _, link := range mapData.Links {
	fmt.Println(link["url"], "-", link["title"])
}

ウェブを検索する

Search を使うと、任意の検索設定で検索できます。
results, err := client.Search(ctx, "firecrawl web scraping", &firecrawl.SearchOptions{
	Limit: firecrawl.Int(10),
	ScrapeOptions: &firecrawl.ScrapeOptions{
		Formats: []string{"markdown"},
	},
})
if err != nil {
	log.Fatal(err)
}

for _, result := range results.Web {
	fmt.Println(result["title"], "-", result["url"])
}

バッチスクレイピング

BatchScrapeを使って複数のURLを並列にスクレイピングします。
urls := []string{
	"https://evocrawl.com",
	"https://evocrawl.com/blog",
}

job, err := client.BatchScrape(ctx, urls, &firecrawl.BatchScrapeOptions{
	ScrapeOptions: &firecrawl.ScrapeOptions{
		Formats: []string{"markdown"},
	},
})
if err != nil {
	log.Fatal(err)
}

for _, doc := range job.Data {
	fmt.Println(doc.Markdown)
}

Agent

Agent を使用して、AI エージェントを実行します。
status, err := client.Agent(ctx, &firecrawl.AgentOptions{
	Prompt: "Find the pricing plans for Evocrawl and compare them",
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(status.Data)
構造化された出力に JSON schema を使用する場合:
status, err := client.Agent(ctx, &firecrawl.AgentOptions{
	Prompt: "Extract pricing plan details",
	URLs:   []string{"https://evocrawl.com"},
	Schema: map[string]interface{}{
		"type": "object",
		"properties": map[string]interface{}{
			"plans": map[string]interface{}{
				"type": "array",
				"items": map[string]interface{}{
					"type": "object",
					"properties": map[string]interface{}{
						"name":  map[string]interface{}{"type": "string"},
						"price": map[string]interface{}{"type": "string"},
					},
				},
			},
		},
	},
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(status.Data)

使用量 & メトリクス

並行実行数と残りのクレジットを確認するには:
concurrency, err := client.GetConcurrency(ctx)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("Concurrency: %d/%d\n", concurrency.Concurrency, concurrency.MaxConcurrency)

credits, err := client.GetCreditUsage(ctx)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("Remaining credits: %d\n", credits.RemainingCredits)

Browser

Go SDK には、ブラウザサンドボックスを扱うためのヘルパーが含まれています。

セッションを作成する

session, err := client.Browser(ctx, &firecrawl.BrowserOptions{
	TTL:           firecrawl.Int(300),
	StreamWebView: firecrawl.Bool(true),
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(session.ID)
fmt.Println(session.CDPUrl)
fmt.Println(session.LiveViewURL)

コードの実行

result, err := client.BrowserExecute(ctx, session.ID,
	`await page.goto("https://example.com"); console.log(await page.title());`,
	&firecrawl.BrowserExecuteParams{
		Language: "node",
		Timeout:  firecrawl.Int(60),
	},
)
if err != nil {
	log.Fatal(err)
}

fmt.Println(result.Stdout)
fmt.Println(*result.ExitCode)

スクレイピングに紐づいた対話型セッション

スクレイピングジョブIDを使うと、同じ再生コンテキスト内で後続のブラウザコードを実行できます。
  • Interact(...) は、スクレイピングに紐づいたブラウザセッションでコードを実行します (初回使用時に初期化されます) 。
  • StopInteractiveBrowser(...) は、完了後に対話型セッションを明示的に停止します。
scrapeJobID := "550e8400-e29b-41d4-a716-446655440000"

execResp, err := client.Interact(ctx, scrapeJobID, "console.log(page.url())", &firecrawl.InteractParams{
	Language: "node",
	Timeout:  firecrawl.Int(60),
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(execResp.Stdout)

deleteResp, err := client.StopInteractiveBrowser(ctx, scrapeJobID)
if err != nil {
	log.Fatal(err)
}

fmt.Printf("Deleted: %v\n", deleteResp.Success)

セッションの一覧表示 & 終了

active, err := client.ListBrowsers(ctx, "active")
if err != nil {
	log.Fatal(err)
}

for _, s := range active.Sessions {
	fmt.Printf("%s - %s\n", s.ID, s.Status)
}

closed, err := client.DeleteBrowser(ctx, session.ID)
if err != nil {
	log.Fatal(err)
}

fmt.Printf("Closed: %v\n", closed.Success)

設定

firecrawl.NewClient() では、関数オプションを指定できます。
OptionTypeDefaultDescription
option.WithAPIKeystringFIRECRAWL_API_KEY 環境変数Evocrawl APIキー
option.WithAPIURLstringhttps://api.evocrawl.com (または FIRECRAWL_API_URL)APIのベースURL
option.WithTimeouttime.Duration5 * time.MinuteHTTPクライアントのタイムアウト
option.WithMaxRetriesint3一時的な障害発生時の自動リトライ
option.WithBackoffFactorfloat640.5秒単位の指数バックオフ係数
option.WithHTTPClient*http.Clientタイムアウト設定から生成事前設定済みのHTTPクライアントインスタンス
option.WithHeaderstring, stringすべてのリクエストに追加ヘッダーを付与
import (
	"net/http"
	"time"

	firecrawl "github.com/firecrawl/firecrawl/apps/go-sdk"
	"github.com/firecrawl/firecrawl/apps/go-sdk/option"
)

client, err := firecrawl.NewClient(
	option.WithAPIKey("fc-your-api-key"),
	option.WithAPIURL("https://api.evocrawl.com"),
	option.WithTimeout(5 * time.Minute),
	option.WithMaxRetries(3),
	option.WithBackoffFactor(0.5),
)

カスタム HTTP クライアント

事前設定済みの *http.Client を渡すことで、トランスポート設定、プロキシ設定、TLS 設定などを制御できます。これを指定した場合、WithTimeout 設定は無視され、代わりにそのクライアント自身の設定が使用されます。
import (
	"crypto/tls"
	"net"
	"net/http"
	"time"

	firecrawl "github.com/firecrawl/firecrawl/apps/go-sdk"
	"github.com/firecrawl/firecrawl/apps/go-sdk/option"
)

transport := &http.Transport{
	TLSClientConfig: &tls.Config{MinVersion: tls.VersionTLS12},
	DialContext: (&net.Dialer{
		Timeout: 10 * time.Second,
	}).DialContext,
}

custom := &http.Client{
	Transport: transport,
	Timeout:   60 * time.Second,
}

client, err := firecrawl.NewClient(
	option.WithAPIKey("fc-your-api-key"),
	option.WithHTTPClient(custom),
)

Context のサポート

すべてのメソッドは、キャンセルやデッドラインの制御のため、第1引数として context.Context を受け取ります。
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

doc, err := client.Scrape(ctx, "https://example.com", nil)

エラーハンドリング

SDK は、firecrawl パッケージ内で型付きエラーを使用します。
import "errors"

doc, err := client.Scrape(ctx, "https://example.com", nil)
if err != nil {
	var authErr *firecrawl.AuthenticationError
	var rateErr *firecrawl.RateLimitError
	var timeoutErr *firecrawl.JobTimeoutError
	var fcErr *firecrawl.EvocrawlError

	switch {
	case errors.As(err, &authErr):
		fmt.Println("Auth failed:", authErr.Message)
	case errors.As(err, &rateErr):
		fmt.Println("Rate limited:", rateErr.Message)
	case errors.As(err, &timeoutErr):
		fmt.Printf("Job %s timed out after %ds\n", timeoutErr.JobID, timeoutErr.TimeoutSeconds)
	case errors.As(err, &fcErr):
		fmt.Printf("Error %d: %s\n", fcErr.StatusCode, fcErr.Message)
	default:
		fmt.Println("Unexpected error:", err)
	}
}

再試行ロジック

SDK は一時的な障害に対して自動的に再試行を行います。
  • 再試行されるもの: 408、409、5xx エラー、および接続エラー
  • 再試行されないもの: 401、429、およびその他の 4xx エラー
  • バックオフ: 係数を設定できる指数バックオフ

ポインタヘルパー

SDK は、任意のポインタフィールド向けの便利な関数を提供します。
firecrawl.Bool(true)     // *bool
firecrawl.Int(50)        // *int
firecrawl.Int64(1000)    // *int64
firecrawl.String("test") // *string
firecrawl.Float64(0.5)   // *float64
Evocrawl API キーが必要な AI エージェントですか?自動オンボーディング手順については、evocrawl.com/agent-onboarding/SKILL.md を参照してください。