Skip to content

.NET

Get started with Firecrawl in .NET. Scrape, search, and interact with web data using the REST API.

Prerequisites

  • .NET 6.0+
  • A Firecrawl API key, get one free

Search the web

Firecrawl works with .NET through the REST API using HttpClient.

csharp
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

var apiKey = Environment.GetEnvironmentVariable("FIRECRAWL_API_KEY");
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);

var content = new StringContent(
  JsonSerializer.Serialize(new { query = "firecrawl web scraping", limit = 5 }),
  Encoding.UTF8,
  "application/json"
);

var response = await client.PostAsync("https://api.firecrawl.dev/v2/search", content);
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

Example response

json
{
  "success": true,
  "data": {
    "web": [
      {
        "url": "https://docs.firecrawl.dev",
        "title": "Firecrawl Documentation",
        "markdown": "# Firecrawl\n\nFirecrawl is a web scraping API..."
      }
    ]
  }
}

Scrape a page

csharp
var scrapeContent = new StringContent(
  JsonSerializer.Serialize(new { url = "https://example.com" }),
  Encoding.UTF8,
  "application/json"
);

var scrapeResponse = await client.PostAsync("https://api.firecrawl.dev/v2/scrape", scrapeContent);
var scrapeJson = await scrapeResponse.Content.ReadAsStringAsync();

using var doc = JsonDocument.Parse(scrapeJson);
var markdown = doc.RootElement.GetProperty("data").GetProperty("markdown").GetString();
Console.WriteLine(markdown);

Example response

json
{
  "success": true,
  "data": {
    "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...",
    "metadata": {
      "title": "Example Domain",
      "sourceURL": "https://example.com"
    }
  }
}

Interact with a page

Start a browser session, interact with the page using natural-language prompts, then close the session.

Step 1, Scrape to start a session

csharp
var sessionContent = new StringContent(
  JsonSerializer.Serialize(new { url = "https://www.amazon.com", formats = new[] { "markdown" } }),
  Encoding.UTF8,
  "application/json"
);

var sessionResponse = await client.PostAsync("https://api.firecrawl.dev/v2/scrape", sessionContent);
var sessionJson = await sessionResponse.Content.ReadAsStringAsync();

using var sessionDoc = JsonDocument.Parse(sessionJson);
var scrapeId = sessionDoc.RootElement
  .GetProperty("data")
  .GetProperty("metadata")
  .GetProperty("scrapeId")
  .GetString();

Console.WriteLine($"scrapeId: {scrapeId}");

Step 2, Send interactions

csharp
var interactUrl = $"https://api.firecrawl.dev/v2/scrape/{scrapeId}/interact";

// Search for a product
var searchBody = new StringContent(
  JsonSerializer.Serialize(new { prompt = "Search for iPhone 16 Pro Max" }),
  Encoding.UTF8,
  "application/json"
);

var searchResult = await client.PostAsync(interactUrl, searchBody);
Console.WriteLine(await searchResult.Content.ReadAsStringAsync());

// Click on the first result
var clickBody = new StringContent(
  JsonSerializer.Serialize(new { prompt = "Click on the first result and tell me the price" }),
  Encoding.UTF8,
  "application/json"
);

var clickResult = await client.PostAsync(interactUrl, clickBody);
Console.WriteLine(await clickResult.Content.ReadAsStringAsync());

Step 3, Stop the session

csharp
await client.DeleteAsync(interactUrl);
Console.WriteLine("Session stopped");

Reusable client class

For repeated use, wrap the API in a typed client:

csharp
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

public class FirecrawlClient
{
  private readonly HttpClient _http;
  private const string BaseUrl = "https://api.firecrawl.dev/v2";

  public FirecrawlClient(string apiKey)
  {
      _http = new HttpClient();
      _http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
  }

  private async Task<JsonDocument> PostAsync(string endpoint, object payload)
  {
      var content = new StringContent(
          JsonSerializer.Serialize(payload),
          Encoding.UTF8,
          "application/json"
      );

      var response = await _http.PostAsync($"{BaseUrl}{endpoint}", content);
      response.EnsureSuccessStatusCode();

      var json = await response.Content.ReadAsStringAsync();
      return JsonDocument.Parse(json);
  }

  public async Task<JsonDocument> ScrapeAsync(string url)
  {
      return await PostAsync("/scrape", new { url });
  }

  public async Task<JsonDocument> SearchAsync(string query, int limit = 5)
  {
      return await PostAsync("/search", new { query, limit });
  }
}

// Usage
var firecrawl = new FirecrawlClient(Environment.GetEnvironmentVariable("FIRECRAWL_API_KEY")!);
var result = await firecrawl.SearchAsync("firecrawl web scraping");
Console.WriteLine(result.RootElement);

Next steps

Search docs

Search the web and get full page content

Scrape docs

All scrape options including formats, actions, and proxies

Interact docs

Click, fill forms, and extract dynamic content

API Reference

Complete REST API documentation