O SDK Go oficial é mantido no monorepo do Evocrawl, em apps/go-sdk.
Para instalar o SDK Go do Evocrawl, execute:
go get github.com/firecrawl/firecrawl/apps/go-sdk
Requer Go 1.23 ou superior.
- Obtenha uma chave de API em evocrawl.com
- Defina a chave de API como uma variável de ambiente chamada
FIRECRAWL_API_KEY ou passe-a com option.WithAPIKey(...)
Aqui está um exemplo rápido usando a API atual do SDK:
package main
import (
"context"
"fmt"
"log"
firecrawl "github.com/firecrawl/firecrawl/apps/go-sdk"
"github.com/firecrawl/firecrawl/apps/go-sdk/option"
)
func main() {
// Cria um cliente (lê FIRECRAWL_API_KEY do ambiente)
client, err := firecrawl.NewClient()
if err != nil {
log.Fatal(err)
}
// Ou forneça a API key diretamente
client, err = firecrawl.NewClient(
option.WithAPIKey("fc-your-api-key"),
)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
// Faz scraping de uma única página
doc, err := client.Scrape(ctx, "https://evocrawl.com", &firecrawl.ScrapeOptions{
Formats: []string{"markdown"},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(doc.Markdown)
// Rastreia um site
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))
}
Fazendo scraping de uma URL
Para fazer scraping de uma única URL, use o método 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"])
Extraia JSON estruturado usando JsonOptions no endpoint Scrape:
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)
Para rastrear um site e aguardar a conclusão, use 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"])
}
Inicie um job sem aguardar com 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)
Verificando o status do rastreamento
Verifique o andamento do rastreamento com 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)
Cancele um rastreamento em execução com CancelCrawl.
result, err := client.CancelCrawl(ctx, resp.ID)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
Descubra links de um site usando 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"])
}
Pesquise com configurações opcionais de busca usando 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"])
}
Faça o scraping de várias URLs em paralelo com BatchScrape.
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)
}
Execute um agente com IA usando Agent.
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)
Com um schema JSON para resultado estruturado:
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)
Confira a concorrência e os créditos restantes:
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)
O SDK de Go inclui utilitários do Browser Sandbox.
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)
Sessão interativa vinculada ao scraping
Use um ID do job de scraping para executar código de navegador subsequente no mesmo contexto reproduzido:
Interact(...) executa código na sessão do navegador vinculada ao scraping (e a inicializa no primeiro uso).
StopInteractiveBrowser(...) encerra explicitamente a sessão interativa quando você terminar.
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)
Listar & Encerrar Sessões
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() aceita opções funcionais:
| Option | Type | Default | Description |
|---|
option.WithAPIKey | string | variável de ambiente FIRECRAWL_API_KEY | Sua chave de API do Evocrawl |
option.WithAPIURL | string | https://api.evocrawl.com (ou FIRECRAWL_API_URL) | URL base da API |
option.WithTimeout | time.Duration | 5 * time.Minute | Tempo limite do cliente HTTP |
option.WithMaxRetries | int | 3 | Retentativas automáticas para falhas transitórias |
option.WithBackoffFactor | float64 | 0.5 | Fator de backoff exponencial em segundos |
option.WithHTTPClient | *http.Client | Construído com base no tempo limite | Instância de cliente HTTP pré-configurada |
option.WithHeader | string, string | — | Adiciona um cabeçalho extra a todas as requisições |
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),
)
Cliente HTTP personalizado
Você pode passar um *http.Client pré-configurado para controlar configurações de transporte, proxy, TLS e muito mais. Quando fornecido, a configuração WithTimeout é ignorada em favor da configuração do próprio cliente.
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),
)
Todos os métodos aceitam um context.Context como primeiro argumento para controle de cancelamento e tempo limite:
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
doc, err := client.Scrape(ctx, "https://example.com", nil)
O SDK usa erros tipados no pacote 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)
}
}
O SDK tenta novamente automaticamente em falhas transitórias:
- Com retentativa: erros 408, 409, 5xx e falhas de conexão
- Sem retentativa: erros 401, 429 e outros erros 4xx
- Backoff: backoff exponencial com fator configurável
O SDK fornece funções auxiliares para campos de ponteiro opcionais:
firecrawl.Bool(true) // *bool
firecrawl.Int(50) // *int
firecrawl.Int64(1000) // *int64
firecrawl.String("test") // *string
firecrawl.Float64(0.5) // *float64
Você é um agente de IA que precisa de uma chave de API do Evocrawl? Consulte evocrawl.com/agent-onboarding/SKILL.md para instruções de onboarding automatizado.