API Credit Usage

You need to login or signup to use the BuiltWith API. After logging in your actual API key will be shown here.

Introduction

Get XML, JSON, CSV and TSV results of relationships between websites that show what sites are linked together, by what and for how long.

Pages return up to 1,000 match records by default; 1,000 is also the maximum. Reading all pages for one domain costs 1 credit per API key/domain across all pages while the local cache is active. Each request renews the 10-minute cache window. Cache expiry, eviction, a server restart or a request reaching another server may cause a new charge.

The general access method is as follows -
https://api.builtwith.com/rv5/api.[xml|json|csv|tsv]?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=[DOMAIN]&PAGE=1

🤖 AI Agent Prompt
Reference https://api.builtwith.com/llms.txt and
https://raw.githubusercontent.com/builtwith/builtwith-ai-sdk/refs/heads/main/README.md
Add builtwith AI api to my app as a client. Make a call to the relationships API for the domain hotelscombined.com
Authentication

You must provide your API key in each lookup. Our endpoints are HTTPS only, providing key encryption. Never expose your API key.

Your API Key is
00000000-0000-0000-0000-000000000000

You can supply your key as a query string parameter or as an HTTP header:

  • Query string: ?KEY=00000000-0000-0000-0000-000000000000
  • HTTP header: Authorization: API 00000000-0000-0000-0000-000000000000
Start with PAGE=1. Each response contains up to 500 match records. Pass next_page as PAGE while more_results is true. Each page request uses one API credit. Identifiers may span pages; merge them by Type and Value, and matches by Domain. Keep LOOKUP and IP unchanged. Results are ordered by identifier then domain; live data changes may shift pages. An identifier without matches counts as one result. A page beyond the available results returns empty Identifiers. PAGE must be between 1 and 2147483647; OFFSET and SKIP are not accepted. CSV and TSV include source identifier rows in addition to matches, followed by a footer with MAX, TOTAL, PAGE, NEXT PAGE and MORE RESULTS.
Get Domain Example

JSON Get Single Domain
https://api.builtwith.com/rv5/api.json?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=builtwith.com&PAGE=1

XML Get Single Domain
https://api.builtwith.com/rv5/api.xml?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=hotelscombined.com&PAGE=1

CSV Get Single Domain
https://api.builtwith.com/rv5/api.csv?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=builtwith.com&PAGE=1

TSV Get Single Domain
https://api.builtwith.com/rv5/api.Tsv?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=builtwith.com&PAGE=1

Reference
Parameters
The following GET parameters can be supplied for lookups
NameExamplesRequired
KEY00000000-0000-0000-0000-000000000000
This is your key, use this for lookups.
Yes
LOOKUPcnn.com
news.ycombinator.com
Domains and sub-domains work with the Relationship API (not internal pages)
Supply one domain per request.
Yes
PAGE1
The page number, starting at 1 (the default). Use the returned next_page as PAGE for the next request while more_results is true.
No
IPyes
Load website IP data, this increases the amount of results considerably.
No
API Meta
NameExampleDescription
results24The total number of domain/identifier matches, counting an identifier without matches as one result.
page1The requested page number.
max_per_page1000The default and maximum number of match records per page is 1,000. Identifiers may span pages.
next_page2The number to provide as PAGE when more_results is true; 0 when finished.
more_resultstrueThis will be true if there's more results.
Responses
Format: Relationships[Relationship->Identifiers[Identifer]]
Relationship
Results is the top level response that identifies the lookup.
NameExampleDescription
Domainhotelscombined.comThe domain that was looked up.
IdentifiersIdentifier explained below.Explained below.
Identifier
Identifiers are the unique codes that are found on the domain and other domains that also have it.
NameExampleDescription
Typegoogle-analyticsThe type of identifier See all Types
Value454517The value of the identifier - typically the code of the identifier like an IP address or an account id.
First1368860400000The date we first detected this identifier in epoch ms.
Last1398860400000The date we last detected this identifier in epoch ms.
MatchesMatch explained below.Explain below.
Match
Matches are other domains that have this identifier.
NameExampleDescription
Domaincom-hotel.comThe domain name of the match.
First1398860400000The date we first detected this on the matched domain in epoch ms.
Last1418860400000The date we last detected this on the matched domain in epoch ms.
OverlaptrueIf this domain used the identifier at the same time as the lookup Domain.
API Libraries
Node.js NPM

https://www.npmjs.com/package/builtwith-api
NPM package by Zach Caceres - https://github.com/zcaceres/builtwith-api

Microsoft .NET Nuget

https://www.nuget.org/packages/BuiltWith/
C# package by BuiltWith Pty Ltd - https://github.com/builtwith/BuiltWith-C-Client-API

Code Examples

https://github.com/builtwith/code-examples
Examples of all API endpoints in multiple languages

Code Examples

Here are implementation examples in different programming languages for making API requests. Start with PAGE=1, then pass next_page as PAGE while more_results is true:

var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.builtwith.com/rv5/api.json" +
                        "?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=wayfair.com&PAGE=1"),
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
import requests
url = "https://api.builtwith.com/rv5/api.json"
params = {
    'KEY': '00000000-0000-0000-0000-000000000000',
    'LOOKUP': 'wayfair.com',
    'PAGE': 1
}
response = requests.get(url, params=params)
print(response.json())
<?php
$url = "https://api.builtwith.com/rv5/api.json";
$params = array(
    'KEY' => '00000000-0000-0000-0000-000000000000',
    'LOOKUP' => 'wayfair.com',
    'PAGE' => 1
);
$url_with_params = $url . '?' . http_build_query($params);
$response = file_get_contents($url_with_params);
$data = json_decode($response, true);
print_r($data);
?>
const https = require('https');
const url = 'https://api.builtwith.com/rv5/api.json?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=wayfair.com&PAGE=1';
https.get(url, (res) => {
    let data = '';
    res.on('data', (chunk) => {
        data += chunk;
    });
    res.on('end', () => {
        console.log(JSON.parse(data));
    });
}).on('error', (err) => {
    console.log('Error: ' + err.message);
});
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class BuiltWithAPI {
    public static void main(String[] args) throws Exception {
        String url = "https://api.builtwith.com/rv5/api.json" +
                    "?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=wayfair.com&PAGE=1";
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("GET");
        BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        System.out.println(response.toString());
    }
}
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.builtwith.com/rv5/api.json')
uri.query = URI.encode_www_form({
    'KEY' => '00000000-0000-0000-0000-000000000000',
    'LOOKUP' => 'wayfair.com',
    'PAGE' => 1
})
response = Net::HTTP.get_response(uri)
data = JSON.parse(response.body)
puts data
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    url := "https://api.builtwith.com/rv5/api.json?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=wayfair.com&PAGE=1"
    resp, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(body))
}
curl -X GET
"https://api.builtwith.com/rv5/api.json?KEY=00000000-0000-0000-0000-000000000000&LOOKUP=wayfair.com&PAGE=1"
Special Domains

We maintain three lists of use for you when looking up domains: Ignore Domains, Ignore TLDs and the BuiltWith Suffix List.

Ignore List
This is our own internal list of domains we do not index. They are either blocked, contains too many misleading technologies or too many subdomains with user generated content.

Ignore TLDs
This lists the top-level domains and suffixes BuiltWith ignores when indexing websites.

BuiltWith Suffix List
This is based on the Public Suffix List but includes many additional entries for companies with subdomains that should be considered top level domains. This list provides us with better visibility for internal websites for example it brings northernbeaches.nsw.gov.au to the top level over nsw.gov.au.

Ignore Domains (XML, JSON or TXT)
https://api.builtwith.com/ignoresv1/api.json
Ignore TLDs (XML, JSON or TXT)
https://api.builtwith.com/ignoretldsv1/api.json
Suffix Domains (XML, JSON or TXT)
https://api.builtwith.com/suffixv1/api.json
Error Codes

Note error messages in this format cannot be guaranteed, your implementation should also consider non-200 response codes as errors. The Lookup property will be null (json) or not provided (xml) if the error is server related. View all potential well-formed error codes.

Terms of Use

Our standard terms cover the use all of our APIs.

In general, you can use the API to enhance your product in many ways. The only limitation is you cannot resell the data as-is or provide duplicate functionality to builtwith.com and its associated services.