Add a website
curl --request POST \
--url https://intentleads.si/api/v1/sites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"domain": "example.com",
"monthly_cap": 500,
"name": "Main site"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({domain: 'example.com', monthly_cap: 500, name: 'Main site'})
};
fetch('https://intentleads.si/api/v1/sites', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://intentleads.si/api/v1/sites"
payload = {
"domain": "example.com",
"monthly_cap": 500,
"name": "Main site"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"code": "V1",
"kind": "visitors",
"name": "Main site",
"domain": "example.com",
"status": "active",
"monthly_cap": 500,
"identified_this_period": 137,
"period": {
"start": "2026-11-09",
"end": "2026-12-09"
},
"install_snippet": "<script src=\"https://…/p.js\" async></script>",
"setup_error": null,
"note": "Identified visitors arrive as leads on this site's lane (GET /api/v1/leads?lane=V1&since=last). Each person is charged once per billing month on the intent meter of your balance, up to monthly_cap."
}{
"error": "invalid_domain",
"message": "domain must be a website address like example.com."
}{
"error": "unauthorized",
"message": "Send a valid API key as: Authorization: Bearer il_live_…"
}{
"error": "admin_key_required",
"message": "This needs an admin API key. Owners create one under Settings → API keys."
}{
"error": "site_exists",
"message": "example.com is already set up."
}{
"error": "internal_error",
"message": "Something went wrong. Try again."
}Add a website
Websites: the people we identify among a site’s US visitors arrive as leads. Each is charged once per billing month at intent prices, from your balance, up to monthly_cap.
Returns the install snippet once the site is connected (a few seconds).
Admin key required. Standard keys get 403 admin_key_required.
POST
/
api
/
v1
/
sites
Add a website
curl --request POST \
--url https://intentleads.si/api/v1/sites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"domain": "example.com",
"monthly_cap": 500,
"name": "Main site"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({domain: 'example.com', monthly_cap: 500, name: 'Main site'})
};
fetch('https://intentleads.si/api/v1/sites', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://intentleads.si/api/v1/sites"
payload = {
"domain": "example.com",
"monthly_cap": 500,
"name": "Main site"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"code": "V1",
"kind": "visitors",
"name": "Main site",
"domain": "example.com",
"status": "active",
"monthly_cap": 500,
"identified_this_period": 137,
"period": {
"start": "2026-11-09",
"end": "2026-12-09"
},
"install_snippet": "<script src=\"https://…/p.js\" async></script>",
"setup_error": null,
"note": "Identified visitors arrive as leads on this site's lane (GET /api/v1/leads?lane=V1&since=last). Each person is charged once per billing month on the intent meter of your balance, up to monthly_cap."
}{
"error": "invalid_domain",
"message": "domain must be a website address like example.com."
}{
"error": "unauthorized",
"message": "Send a valid API key as: Authorization: Bearer il_live_…"
}{
"error": "admin_key_required",
"message": "This needs an admin API key. Owners create one under Settings → API keys."
}{
"error": "site_exists",
"message": "example.com is already set up."
}{
"error": "internal_error",
"message": "Something went wrong. Try again."
}Authorizations
Headers
Only with an organization key: the workspace to act in (its id; ?workspace=<id> works too). Lanes, leads, exports, lists, websites and webhooks live in workspaces. Without it, an organization key acts in its only workspace, or gets 400 workspace_required (with the list of workspaces) when it has several. Workspace keys don't need it. On keys, team and activity it switches from the organization's own to that workspace's.
Body
application/json
Response
Added.