One API to search any eCommerce site

Do you need reliable, programmatic access to search results from eCommerce sites? Use our API to search products on 20+ sites.

example of performing a search API call with curl

Firefetch just works, and they are the only ones with such a wide coverage. It was a no-brainer for our team.”
— our test client (agent startup in stealth mode)

Your AI-powered agent can do a lot, but it can't get websites right (yet).

You can't just pass your LLM a website URL and say “search for this and this item”. It might try browse the site but it's gonna get stuff wrong, and your users will notice.

🧑‍💻

Building your AI agent startup

😮‍💨

Struggle to write integrations for hundreds of sites

😔

Can't reliably offer a web-connected agent

We offer one thing: a single API to get reliable search resultsfrom any eCommerce site you want

  • We continuously monitor our search integrations to stay up to date with changing website structure. Our custom AI models repair broken code within minutes.
  • Our API returns search results as fast as the website allows, minimizing the time your users have to stare at your loading animation (no matter how slick it is).
  • You just have to set up a single integration to gain access to 20+ websites -- and if you need others, we'll get on it.
Internal logs showcasing broken integration detection.

20+ supported sites

Adidas
AliExpress
ASOS
Best Buy
Cider
Depop
Etsy
Express
Farfetch
Fashion Nova
Forever 21
Home Depot
Macy's
Nike
Nordstrom
Sephora
SHEIN
SSENSE
Ulta
Urban Outfitters

+ any other site you need. Just reach out to us and we'll make it work.

Feature Comparison

The best at what we do

See how our product compares to the competition across key features.

WhatFirefetchbrowse.aiapify.comoxylabs.io
Fetch search results

Yes

Yes

SERP only

Yes

Sites supported

20+, more on request

Configure any site yourself\nLimited number of sites

If you can find ones that work...

Google & Amazon

Maintained

Yes

Need to maintain yourself

Depends on the actor

Yes

Realtime results

Yes

Task/queue system

Response times

1-6 seconds

35+ seconds

Pricing

Save yourself a never-ending headache and focus on your mission-critical processes

Let us handle the scraping. You focus on what you do best.

🏗️ Building

When your agents are in the gym

$117

/ site / month

  • 10,000 requests / site / month
  • Up to 50 websites
FEATURED

🏭 At scale

When your agents are getting buff

$207

/ site / month

  • 50,000 requests / site / month
  • Unlimited websites
  • 24/7 support

🏢 Enterprise

When your agents eat gyms for breakfast

  • Cross-site search credits
  • Custom API limits
  • SLA guarantees
  • Non-eCommerce site support

Avoid the headache of in-house scraping

Scraping is a pain. You will spend too much time building the scrapers, and too much headspace maintaining them. We take care of it so that your team can focus on building the best AI agent out there.

Firefetch just works

  • Our service is designed for reliability
  • High uptime due to AI-maintained scraper code
  • We only charge for successful requests (obviously)

One API, many sites

  • More sites than any other service
  • Set up a single integration
  • Unified parameters & output format
  • You can always check in with us if you need support for other sites

FAQ

Frequently Asked Questions

  • Something quite like Firefetch just doesn’t exist. Some services allow you to build your own scrapers; others provide search APIs for a single website. We:
    • Provide a single search API for hundreds of sites
    • Keep everything maintained
    • Enable realtime access to search results
  • Especially in AI agent workflows, speed is crucial. Our infrastructure is designed to fetch results as quickly as each website allows. You make a request and get the results. No queues, tasks, or anything like that.
  • Our secret sauce is our AI-driven monitoring and repair system. It checks our integrations continuously and fixes issues in real-time, drastically reducing downtimes and inaccuracies in data scraping, with an additional layer of human validation.
  • Absolutely! If you need programmatic access to search results for sites we don’t currently support, also outside of eCommerce, get in touch. We can integrate new sites quickly.
  • Firefetch was built by two devs who are very passionate about their work. If there are any issues, we’ll personally get to the bottom of it and work it out.
  • You can search around and hook into to a bunch of different services. But are you really gonna want to maintain a subscription + integration for every single website you need access to? It's a headache. With us, adding a website is as easy as sending a message. And you get consistent quality, every time.

    There are also more general services like Apify. Apify provides programmatically accessible scrapers for many websites, but have you tried them out? They are unreliable, not guaranteed to actually work, and worst, extremely slow. You're not gonna want your users to have to wait 30+ seconds for some search results that might be empty because you're just using some unvetted third-party scraper.

  • Of course! Send us a message:

🌊🌊🌊👋 hey there

JulyPaul

Firefetch was built by a tiny team of two AI devs from Amsterdam who see software engineering as a creative craft. We are obsessed with building elegant, scalable, and reliable systems.

We are dedicated to delivering true value. It's what our personal pride is staked on.

Search API's for eCommerce sites, done right

Don't waste time searching and testing a bunch of single-site services with unknown reliability and slow API's...

Snippets

We want to make integration as easy as possible, so here are some snippets to provide an explanation of the Firefetch API, and formatted results, to your LLM.

When you sign up for Firefetch, we’ll personally help you get set up and integrated in an optimal way.

    1. *Searching eCommerce stores:**
       This functionality enables you to perform searches across different ecommerce platforms to retrieve comprehensive product listings. You can send a search term along with optional site-specific parameters. The response will be structured data, including product names, prices, URLs, and images, equipping you with detailed information to assist users in exploring and making purchase decisions.
    
    2. *eCommerce search results:**
       The output you will receive consists of multiple listings with:
       - *Title*: The name or title of each product.
       - *Regular Price*: The price of the product before any discounts.
       - *Sale Price*: Optionally, the current sale price of the product.
       - *Detail URL*: A direct link to the product's detail page on the ecommerce website, which can be used for deeper exploration or purchase.
       - *Image URLs*: A list of URLs to images of the product, providing a visual guide to help in the evaluation process.
    
    from typing import List
    
    
    def format_site_configs(site_configs: List[dict]) -> str:
        formatted_sites = []
        for config in site_configs:
            site_info = f"Site: {config['site']}\n"
            parameters = "Parameters:\n" + "\n".join(
                f"  {key}: {value}"
                for key, value in config["additional_parameters_schema"].items()
            )
            formatted_sites.append(f"{site_info}{parameters}\n")
        return "\n".join(formatted_sites)
    
    
    def format_search_results(search_results: "SearchResults") -> str:
        formatted_results = f"Search results for site '{search_results.site}' with query '{search_results.query}':\n"
        for result in search_results.results:
            result_info = (
                f"  Title: {result.title}\n"
                f"  Original Price: {result.price_original}\n"
                f"  Active Price: {result.price_active}\n"
                f"  Detail URL: {result.detail_url}\n"
                f"  Image URLs: {', '.join(result.image_urls)}\n"
            )
            formatted_results += result_info + "\n"
        return formatted_results
    
    
    function formatSiteConfigs(siteConfigs) {
      return siteConfigs
        .map((config) => {
          const siteInfo = `Site: ${config.site}\n`
          const parameters =
            'Parameters:\n' +
            Object.entries(config.additional_parameters_schema)
              .map(([key, value]) => `  ${key}: ${value}`)
              .join('\n')
          return `${siteInfo}${parameters}\n`
        })
        .join('\n')
    }
    
    function formatSearchResults(searchResults) {
      let formattedResults = `Search results for site '${searchResults.site}' with query '${searchResults.query}':\n`
      searchResults.results.forEach((result) => {
        const resultInfo = `  Title: ${result.title}\n  Original Price: ${result.price_original}\n  Active Price: ${result.price_active}\n  Detail URL: ${result.detail_url}\n  Image URLs: ${result.image_urls.join(', ')}\n`
        formattedResults += resultInfo + '\n'
      })
      return formattedResults
    }
      
    interface SiteConfig {
      site: string
      additional_parameters_schema: Record<string, any>
    }
    
    interface ApiListingPreview {
      title: string
      price_original: string
      price_active: string
      detail_url: string
      image_urls: string[]
    }
    
    interface SearchResults {
      site: string
      query: string
      results: ApiListingPreview[]
    }
    
    function formatSiteConfigs(siteConfigs: SiteConfig[]): string {
      return siteConfigs
        .map((config) => {
          const siteInfo = `Site: ${config.site}\n`
          const parameters =
            'Parameters:\n' +
            Object.entries(config.additional_parameters_schema)
              .map(([key, value]) => `  ${key}: ${value}`)
              .join('\n')
          return ` ${siteInfo}${parameters}\n`
        })
        .join('\n')
    }
    
    function formatSearchResults(searchResults: SearchResults): string {
      let formattedResults = `Search results for site '${searchResults.site}' with query '${searchResults.query}':\n`
      searchResults.results.forEach((result) => {
        const resultInfo = `  Title: ${result.title}\n  Original Price: ${result.price_original}\n  Active Price: ${result.price_active}\n  Detail URL: ${result.detail_url}\n  Image URLs: ${result.image_urls.join(', ')}\n`
        formattedResults += resultInfo + '\n'
      })
      return formattedResults
    }