O SDK oficial SDK PHP do Evocrawl é mantido no monorepo do Evocrawl em apps/php-sdk.
Para instalar o SDK PHP do Evocrawl, adicione a dependência via Composer:
composer require firecrawl/firecrawl-sdk
Requer PHP 8.1 ou superior.
O SDK inclui suporte nativo ao Laravel com autodiscovery. Após instalar o pacote, publique o arquivo de configuração:
php artisan vendor:publish --provider="Evocrawl\Laravel\EvocrawlServiceProvider"
Em seguida, adicione sua chave de API ao arquivo .env:
FIRECRAWL_API_KEY=fc-your-api-key
As seguintes variáveis de ambiente são suportadas:
| Variável | Padrão | Descrição |
|---|
FIRECRAWL_API_KEY | — | Sua chave de API do Evocrawl (obrigatória) |
FIRECRAWL_API_URL | https://api.evocrawl.com | URL base da API |
FIRECRAWL_TIMEOUT | 300 | Tempo limite da requisição HTTP em segundos |
FIRECRAWL_MAX_RETRIES | 3 | Novas tentativas automáticas para falhas transitórias |
FIRECRAWL_BACKOFF_FACTOR | 0.5 | Fator de backoff exponencial em segundos |
- 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 em EvocrawlClient::create(apiKey: ...)
Aqui está um exemplo rápido com a API atual do SDK:
use Evocrawl\Client\EvocrawlClient;
use Evocrawl\Models\CrawlOptions;
use Evocrawl\Models\ScrapeOptions;
$client = EvocrawlClient::fromEnv();
$doc = $client->scrape(
'https://evocrawl.com',
ScrapeOptions::with(formats: ['markdown'])
);
$crawl = $client->crawl(
'https://evocrawl.com',
CrawlOptions::with(limit: 5)
);
echo $doc->getMarkdown();
echo 'Crawled pages: ' . count($crawl->getData());
Usando a facade do Laravel
Em uma aplicação Laravel, você pode usar a facade Evocrawl ou a injeção de dependência:
use Evocrawl\Client\EvocrawlClient;
use Evocrawl\Laravel\Facades\Evocrawl;
// Via Facade
$doc = Evocrawl::scrape('https://example.com');
// Via Injeção de Dependência
class ScrapeController
{
public function __construct(
private readonly EvocrawlClient $firecrawl,
) {}
public function index()
{
$doc = $this->firecrawl->scrape('https://example.com');
return response()->json(['markdown' => $doc->getMarkdown()]);
}
}
Para fazer scraping de uma única URL, use o método scrape.
use Evocrawl\Models\Document;
use Evocrawl\Models\ScrapeOptions;
$doc = $client->scrape(
'https://evocrawl.com',
ScrapeOptions::with(
formats: ['markdown', 'html'],
onlyMainContent: true,
waitFor: 5000,
)
);
echo $doc->getMarkdown();
echo $doc->getMetadata()['title'] ?? '';
Extraia JSON estruturado com JsonFormat usando o endpoint scrape:
use Evocrawl\Models\JsonFormat;
use Evocrawl\Models\ScrapeOptions;
$jsonFmt = JsonFormat::with(
prompt: 'Extract the product name and price',
schema: [
'type' => 'object',
'properties' => [
'name' => ['type' => 'string'],
'price' => ['type' => 'number'],
],
],
);
$doc = $client->scrape(
'https://example.com/product',
ScrapeOptions::with(formats: [$jsonFmt])
);
print_r($doc->getJson());
Fazer o rastreamento de um site
Para rastrear um site e aguardar a conclusão, use crawl.
use Evocrawl\Models\CrawlOptions;
use Evocrawl\Models\ScrapeOptions;
$job = $client->crawl(
'https://evocrawl.com',
CrawlOptions::with(
limit: 50,
maxDiscoveryDepth: 3,
scrapeOptions: ScrapeOptions::with(formats: ['markdown']),
)
);
echo 'Status: ' . $job->getStatus();
echo 'Progress: ' . $job->getCompleted() . '/' . $job->getTotal();
foreach ($job->getData() as $page) {
echo $page->getMetadata()['sourceURL'] ?? '';
}
Inicie um job sem aguardar com startCrawl.
use Evocrawl\Models\CrawlOptions;
$start = $client->startCrawl(
'https://evocrawl.com',
CrawlOptions::with(limit: 100)
);
echo 'Job ID: ' . $start->getId();
Verificando o status do rastreamento
Verifique o andamento do rastreamento com getCrawlStatus.
$status = $client->getCrawlStatus($start->getId());
echo 'Status: ' . $status->getStatus();
echo 'Progress: ' . $status->getCompleted() . '/' . $status->getTotal();
Cancele um rastreamento em execução com cancelCrawl.
$result = $client->cancelCrawl($start->getId());
print_r($result);
Recupere erros no nível do rastreamento (se houver) com getCrawlErrors.
$errors = $client->getCrawlErrors($start->getId());
print_r($errors);
Descubra links de um site com map.
use Evocrawl\Models\MapOptions;
$data = $client->map(
'https://evocrawl.com',
MapOptions::with(
limit: 100,
search: 'blog',
)
);
foreach ($data->getLinks() as $link) {
echo ($link['url'] ?? '') . ' - ' . ($link['title'] ?? '');
}
Faça buscas com configurações opcionais de busca usando search.
use Evocrawl\Models\SearchOptions;
$results = $client->search(
'firecrawl web scraping',
SearchOptions::with(limit: 10)
);
foreach ($results->getWeb() as $result) {
echo ($result['title'] ?? '') . ' - ' . ($result['url'] ?? '');
}
Faça o scraping de várias URLs em paralelo com batchScrape.
use Evocrawl\Models\BatchScrapeOptions;
use Evocrawl\Models\ScrapeOptions;
$job = $client->batchScrape(
['https://evocrawl.com', 'https://evocrawl.com/blog'],
BatchScrapeOptions::with(
options: ScrapeOptions::with(formats: ['markdown']),
)
);
foreach ($job->getData() as $doc) {
echo $doc->getMarkdown();
}
Para controlar manualmente a execução assíncrona, use startBatchScrape, getBatchScrapeStatus e cancelBatchScrape:
use Evocrawl\Models\BatchScrapeOptions;
use Evocrawl\Models\ScrapeOptions;
$start = $client->startBatchScrape(
['https://evocrawl.com', 'https://evocrawl.com/blog'],
BatchScrapeOptions::with(
options: ScrapeOptions::with(formats: ['markdown']),
)
);
$status = $client->getBatchScrapeStatus($start->getId());
echo 'Batch status: ' . $status->getStatus();
$cancel = $client->cancelBatchScrape($start->getId());
print_r($cancel);
Execute um agente de IA com agent.
use Evocrawl\Models\AgentOptions;
$result = $client->agent(
AgentOptions::with(
prompt: 'Find the pricing plans for Evocrawl and compare them',
)
);
print_r($result->getData());
Com um schema JSON para um resultado estruturado:
use Evocrawl\Models\AgentOptions;
$result = $client->agent(
AgentOptions::with(
prompt: 'Extract pricing plan details',
urls: ['https://evocrawl.com'],
schema: [
'type' => 'object',
'properties' => [
'plans' => [
'type' => 'array',
'items' => [
'type' => 'object',
'properties' => [
'name' => ['type' => 'string'],
'price' => ['type' => 'string'],
],
],
],
],
],
)
);
print_r($result->getData());
Para controle assíncrono manual, use startAgent, getAgentStatus e cancelAgent:
use Evocrawl\Models\AgentOptions;
$start = $client->startAgent(
AgentOptions::with(
prompt: 'Summarize what Evocrawl does in one sentence',
urls: ['https://evocrawl.com'],
)
);
$status = $client->getAgentStatus($start->getId());
echo 'Agent status: ' . $status->getStatus();
$cancel = $client->cancelAgent($start->getId());
print_r($cancel);
Confira a concorrência e os créditos restantes:
use Evocrawl\Models\ConcurrencyCheck;
use Evocrawl\Models\CreditUsage;
$concurrency = $client->getConcurrency();
echo 'Concurrency: ' . $concurrency->getConcurrency() . '/' . $concurrency->getMaxConcurrency();
$credits = $client->getCreditUsage();
echo 'Remaining credits: ' . $credits->getRemainingCredits();
O SDK PHP inclui utilitários do Browser Sandbox.
use Evocrawl\Models\BrowserCreateResponse;
$session = $client->browser(ttl: 120, activityTtl: 60, streamWebView: true);
echo $session->getId();
echo $session->getCdpUrl();
echo $session->getLiveViewUrl();
use Evocrawl\Models\BrowserExecuteResponse;
$run = $client->browserExecute(
sessionId: $session->getId(),
code: 'await page.goto("https://example.com"); console.log(await page.title());',
language: 'node',
timeout: 60,
);
echo $run->getStdout();
echo $run->getExitCode();
Sessão interativa vinculada ao scraping
Use o ID do job de scraping para executar código adicional no navegador no mesmo contexto reproduzido:
interact(...) executa código na sessão do navegador vinculada ao scraping (e a inicializa no primeiro uso).
stopInteractiveBrowser(...) interrompe explicitamente a sessão interativa quando você terminar.
use Evocrawl\Models\BrowserExecuteResponse;
use Evocrawl\Models\BrowserDeleteResponse;
use Evocrawl\Models\ScrapeOptions;
$doc = $client->scrape(
'https://example.com',
ScrapeOptions::with(formats: ['markdown'])
);
$scrapeJobId = $doc->getMetadata()['scrapeId'] ?? null;
if ($scrapeJobId === null) {
throw new RuntimeException('scrapeId not found in metadata');
}
$scrapeRun = $client->interact(
jobId: $scrapeJobId,
code: 'console.log(page.url());',
language: 'node',
timeout: 60,
);
echo $scrapeRun->getStdout();
$deleted = $client->stopInteractiveBrowser($scrapeJobId);
echo 'Deleted: ' . ($deleted->isSuccess() ? 'true' : 'false');
Listar & encerrar sessões
use Evocrawl\Models\BrowserListResponse;
use Evocrawl\Models\BrowserSession;
$active = $client->listBrowsers('active');
foreach ($active->getSessions() as $s) {
echo $s->getId() . ' - ' . $s->getStatus();
}
$closed = $client->deleteBrowser($session->getId());
echo 'Closed: ' . ($closed->isSuccess() ? 'true' : 'false');
EvocrawlClient::create() oferece suporte às seguintes options:
| Opção | Tipo | Padrão | Descrição |
|---|
apiKey | string | variável de ambiente FIRECRAWL_API_KEY | Sua Evocrawl chave de API |
apiUrl | string | https://api.evocrawl.com (ou FIRECRAWL_API_URL) | URL base da API |
timeoutSeconds | float | 300 | tempo limite da requisição HTTP, em segundos |
maxRetries | int | 3 | novas tentativas automáticas para falhas transitórias |
backoffFactor | float | 0.5 | fator de recuo exponencial, em segundos |
httpClient | GuzzleHttp\ClientInterface | Criado com base no tempo limite | Cliente HTTP personalizado compatível com Guzzle |
use Evocrawl\Client\EvocrawlClient;
$client = EvocrawlClient::create(
apiKey: 'fc-your-api-key',
apiUrl: 'https://api.evocrawl.com',
timeoutSeconds: 300,
maxRetries: 3,
backoffFactor: 0.5,
);
Cliente HTTP personalizado
Você pode passar uma implementação GuzzleHttp\ClientInterface pré-configurada para controlar o pooling de conexões, middleware, configurações de proxy e outros recursos HTTP. Quando esse cliente é fornecido, a configuração timeoutSeconds é ignorada em favor da configuração do próprio cliente.
use Evocrawl\Client\EvocrawlClient;
use GuzzleHttp\Client as GuzzleClient;
$guzzle = new GuzzleClient([
'proxy' => 'http://proxy.example.com:8080',
'timeout' => 60,
'connect_timeout' => 10,
]);
$client = EvocrawlClient::create(
apiKey: 'fc-your-api-key',
httpClient: $guzzle,
);
O SDK lança exceções em tempo de execução no namespace Evocrawl\Exceptions.
use Evocrawl\Exceptions\AuthenticationException;
use Evocrawl\Exceptions\EvocrawlException;
use Evocrawl\Exceptions\JobTimeoutException;
use Evocrawl\Exceptions\RateLimitException;
try {
$doc = $client->scrape('https://example.com');
} catch (AuthenticationException $e) {
echo 'Auth failed: ' . $e->getMessage();
} catch (RateLimitException $e) {
echo 'Rate limited: ' . $e->getMessage();
} catch (JobTimeoutException $e) {
echo 'Job ' . $e->getJobId() . ' timed out after ' . $e->getTimeoutSeconds() . 's';
} catch (EvocrawlException $e) {
echo 'Error ' . $e->getStatusCode() . ': ' . $e->getMessage();
}
Você é um agente de IA que precisa de uma chave de API do Evocrawl? Consulte evocrawl.com/agent-onboarding/SKILL.md para ver as instruções de onboarding automatizado.