> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firecrawl.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Rust

> Comece a usar o Firecrawl com Rust. Pesquise, faça scraping e interaja com dados da web usando o SDK oficial.

<div id="prerequisites">
  ## Pré-requisitos
</div>

* Rust 1.70+ com Cargo
* Uma chave de API do Firecrawl — [obtenha uma grátis](https://www.firecrawl.dev/app/api-keys)

<div id="install-the-crate">
  ## Instale o crate
</div>

Adicione `firecrawl` ao seu `Cargo.toml`:

```toml theme={null}
[dependencies]
firecrawl = "2"
tokio = { version = "1", features = ["full"] }
serde_json = "1"
```

<div id="search-the-web">
  ## Faça uma busca na web
</div>

```rust theme={null}
use firecrawl::{Client, SearchOptions};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new("fc-YOUR-API-KEY")?;

    let results = client.search(
        "firecrawl web scraping",
        SearchOptions { limit: Some(5), ..Default::default() },
    ).await?;

    if let Some(web) = results.data.web {
        for item in web {
            if let firecrawl::SearchResultOrDocument::WebResult(r) = item {
                println!("{} - {}", r.url, r.title.unwrap_or_default());
            }
        }
    }
    Ok(())
}
```

<div id="scrape-a-page">
  ## Faça scraping de uma página
</div>

```rust theme={null}
let doc = client.scrape("https://example.com", None).await?;
println!("{}", doc.markdown.unwrap_or_default());
```

<Accordion title="Exemplo de resposta">
  ```json theme={null}
  {
    "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...",
    "metadata": {
      "title": "Example Domain",
      "sourceURL": "https://example.com"
    }
  }
  ```
</Accordion>

<div id="interact-with-a-page">
  ## Interaja com uma página
</div>

Faça scraping de uma página para obter um `scrapeId` e, em seguida, use a API de interação para controlar a sessão do navegador:

```rust theme={null}
use firecrawl::{Client, ScrapeOptions, Format, ScrapeExecuteOptions};

let doc = client.scrape(
    "https://www.amazon.com",
    ScrapeOptions {
        formats: Some(vec![Format::Markdown]),
        ..Default::default()
    },
).await?;

let scrape_id = doc.metadata
    .as_ref()
    .and_then(|m| m.scrape_id.as_deref())
    .expect("scrapeId not found");

// Envie um prompt para interagir com a página
let run = client.interact(
    scrape_id,
    ScrapeExecuteOptions {
        prompt: Some("Search for iPhone 16 Pro Max".to_string()),
        ..Default::default()
    },
).await?;

let run = client.interact(
    scrape_id,
    ScrapeExecuteOptions {
        prompt: Some("Click on the first result and tell me the price".to_string()),
        ..Default::default()
    },
).await?;

println!("{:?}", run.output);

// Encerre a sessão
client.stop_interaction(scrape_id).await?;
```

<div id="environment-variable">
  ## Variável de ambiente
</div>

Defina `FIRECRAWL_API_KEY` em vez de passar a chave diretamente:

```bash theme={null}
export FIRECRAWL_API_KEY=fc-YOUR-API-KEY
```

```rust theme={null}
let api_key = std::env::var("FIRECRAWL_API_KEY")?;
let client = Client::new(api_key)?;
```

<div id="next-steps">
  ## Próximos passos
</div>

<CardGroup cols={2}>
  <Card title="Documentação de busca" icon="magnifying-glass" href="/pt-BR/features/search">
    Faça uma busca na web e obtenha o conteúdo completo da página
  </Card>

  <Card title="Documentação de scraping" icon="file-lines" href="/pt-BR/features/scrape">
    Todas as opções de scraping, incluindo formatos, ações e proxies
  </Card>

  <Card title="Documentação de interação" icon="hand-pointer" href="/pt-BR/features/interact">
    Clique, preencha formulários e extraia conteúdo dinâmico
  </Card>

  <Card title="Referência do SDK Rust" icon="rust" href="/pt-BR/sdks/rust">
    Referência completa do SDK com crawl, map, extração em lote e outros recursos
  </Card>
</CardGroup>
