Skip to content

apify/impit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ce2432c · Apr 26, 2025
Jan 14, 2025
Jan 17, 2025
Apr 22, 2025
Jan 14, 2025
Apr 26, 2025
Apr 26, 2025
Apr 23, 2025
Jan 17, 2025
Apr 8, 2025
Apr 26, 2025
Mar 2, 2025
Jan 23, 2025
Feb 25, 2025

Repository files navigation

impit | browser impersonation made simple

impit is a rust library that allows you to impersonate a browser and make requests to websites. It is built on top of reqwest, rustls and tokio and supports HTTP/1.1, HTTP/2, and HTTP/3.

The library provides a simple API for making requests to websites, and it also allows you to customize the request headers, use proxies, custom timeouts and more.

use impit::impit::Impit;
use impit::emulation::Browser;

#[tokio::main]
async fn main() {
   let mut impit = Impit::builder()
       .with_browser(Browser::Firefox)
       .with_http3()
       .build();

   let response = impit.get(String::from("https://example.com"), None).await;

   match response {
       Ok(response) => {
           println!("{}", response.text().await.unwrap());
       }
       Err(e) => {
           println!("{:#?}", e);
       }
   }
}

Other projects

If you are looking for a command-line tool that allows you to make requests to websites, check out the impit-cli project.

If you'd prefer to use impit from a Node.js application, check out the impit-node folder, or download the package from npm:

npm install impit

The interface is the same as the native fetch.

import { Impit } from 'impit';

// Set up the Impit instance
const impit = new Impit({
    browser: "Chrome", // or "Firefox"
    proxyUrl: "http://localhost:8080",
    ignoreTlsErrors: true,
});

// Use the `fetch` method as you would with the built-in `fetch` function
const response = await impit.fetch("https://example.com");

console.log(response.status);
console.log(response.headers);
console.log(await response.text());
// console.log(await response.json());
// ...

Usage from Rust

Technically speaking, the impit project is a somewhat thin wrapper around reqwest that provides a more ergonomic API for making requests to websites. The real strength of impit is that it uses patched versions of rustls and other libraries that allow it to make browser-like requests.

Note that if you want to use this library in your rust project, you have to add the following dependencies to your Cargo.toml file:

[dependencies]
impit = { git="https://github.com/apify/impit.git", branch="master" }

[patch.crates-io]
rustls = { git="https://github.com/apify/rustls.git" }
h2 = { git="https://github.com/apify/h2.git" }

Without the patched dependencies, the project won't build.

Note that you also have to build your project with rustflags = "--cfg reqwest_unstable", otherwise, the build will also fail. This is because impit uses unstable features of reqwest (namely http3 support), which are not available in the stable version of the library.