SitesGraph Tools
Utilities for data extraction, discovery and validation
Site Analyser
Test the enrichment engine on any domain. Extract data, tech, and SEO info instantly.
URL Parser
Test your declarative data models against specific URLs and preview extracted JSON.
Email Discovery
Find all associated email addresses for a specific website across the web.
Email Validator
Verify if an email address exists and can actively receive mail via SMTP checking.
Phone Lookup
Reverse phone lookup to find matching places and domains in the database.
Tag Tester
Test your taxonomy against sample texts to see auto-extracted tags.
Weather Tool
Find closest location info and current/historical weather.
System Administration
Manage data, taxonomy, queues and background tasks

Search Tools

Domain Search
Search across all internally indexed domains and pages in your database.
Web Search
Search the live web and automatically discover new domains.

Core

Metrics
View database size, queue counts, and indexing statistics.
Domains
Filter, browse, and export all indexed domains.
Queue
Manage domains waiting to be enriched or processed.

Data Modules

Places & Maps
Manage Google Maps data, places, and indexing.
Geolocations
Explore and build country, region, and city datasets.
Taxonomy & Tags
Configure tag types and keywords for classification.
Emails
Manage discovered email addresses and their status.
Social Links
Filter and browse discovered social media profiles.
Instagram Data
Manage and crawl Instagram profiles and posts.

System

Data Models
Manage declarative schemas for structured URL parsing.
S3 & DuckDB Tools
Export to S3, import domains, and run DuckDB queries.
LLM Requests
Review logs and costs of all AI enrichment requests.
Team & API Keys
Manage user accounts, roles, and API access keys.
Workers
Monitor and manage active background processing nodes.
API Documentation
Integrate SitesGraph directly into your applications
Authentication

Pass your API key using the X-API-Key header or api_key query parameter.

Example: curl -H "X-API-Key: YOUR_KEY" https://api.sitesgraph.com/v1/domains/stripe.com

1. Domain Lookup GET /v1/domains/{domain}

Retrieves enriched data for a specific domain.

NodeJS (Axios)
const axios = require('axios');

axios.get("https://api.sitesgraph.com/v1/domains/stripe.com", {
  headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(res => console.log(res.data));
Python3 (Requests)
import requests

headers = {"X-API-Key": "YOUR_API_KEY"}
response = requests.get(
  "https://api.sitesgraph.com/v1/domains/stripe.com", 
  headers=headers
)
print(response.json())
2. Lead Generation GET /v1/leads

Fetch a list of domains matching specific criteria (e.g. tld, type, has_email).

NodeJS (Axios)
const axios = require('axios');

axios.get("https://api.sitesgraph.com/v1/leads", {
  params: { tld: "be", type: "Restaurant", has_email: true },
  headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(res => console.log(res.data));
Python3 (Requests)
import requests

params = {"tld": "be", "type": "Restaurant", "has_email": "true"}
headers = {"X-API-Key": "YOUR_API_KEY"}
response = requests.get(
  "https://api.sitesgraph.com/v1/leads", 
  params=params, 
  headers=headers
)
print(response.json())
3. Trigger AI Enrichment POST /v1/domains/{domain}/llm-enrich

Triggers an LLM web search enrichment for the given domain. Generates an AI profile README, extracts people and normalises VAT.

NodeJS (Axios)
const axios = require('axios');

axios.post("https://api.sitesgraph.com/v1/domains/stripe.com/llm-enrich", {}, {
  headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(res => console.log(res.data));
Python3 (Requests)
import requests

headers = {"X-API-Key": "YOUR_API_KEY"}
response = requests.post(
  "https://api.sitesgraph.com/v1/domains/stripe.com/llm-enrich", 
  headers=headers
)
print(response.json())
System Metrics
Database, Queue, and Indexing statistics
Total Domains
{{stats.domains||0}}
Enriched Domains
{{stats.enriched_domains||0}}
Queue (Todo)
{{stats.todo||0}}
Queue (Error)
{{stats.error||0}}
Total URLs/Pages
{{stats.pages||0}}
Total Emails
{{stats.emails||0}}
Total Places
{{stats.places||0}}
Place Categories
{{stats.categories||0}}
Total Tags
{{stats.tags||0}}
Place Queries
{{stats.queries||0}}
Data Models
{{stats.models||0}}
DB Size
{{stats.db_size_gb !== undefined ? stats.db_size_gb + ' GB' : '—'}}
LLM Requests
Log of all AI enrichment requests
LLM Requests
Domain Model Tokens (In/Out) Cost Created At Actions
{{req.domain}} {{req.model}} {{req.input_tokens}} / {{req.output_tokens}} ${{req.cost?.toFixed(5)}} {{ago(req.created_at)}}
No LLM requests found.
System Workers
Manage active background processing nodes
Active Workers
IP / Hostname (PID) Status Last Pinged Actions
{{w.ip_address}} offline {{w.status}} {{ago(w.last_pinged_at)}}
No workers found. Start a worker to see it here.
Domains ({{domainsTotal||exportTotal}})
Filter, browse and export your indexed domains
Filters
{{exportTotal}} domains match
{{exportError}}
Results{{exportRows.length ? ' — '+exportRows.length+' shown' : ''}}
Domain Name Type Email Tel Address Country TLD Technologies LD+JSON HTTP Crawled/Found CC Pages Indexed
{{d.domain}} {{d.name||'—'}} {{d.type}} {{d.email||'—'}} {{d.telephone||'—'}} {{d.address_locality||(d.street_address?'Yes':'—')}} {{d.country||'?'}} {{d.tld?'.'+d.tld:'?'}}
{{t}} +{{d.techs.length-3}}
{{d.http_status||'?'}} {{d.crawl_pages_visited || 1}} / {{d.crawl_urls_discovered || '?'}} {{d.cc_200_pages || '—'}} {{ago(d.fetched_at)}}
Run a search to see domains
Places Database
Manage and export crawled places
Total Places
{{placesMetrics.total || 0}}
With Domain
{{placesMetrics.with_domain || 0}}
With Phone
{{placesMetrics.with_phone || 0}}
With Email
{{placesMetrics.with_email || 0}}
Places
ID Title Category Score Reviews Address City Country Phone Website Domain Created At Actions
{{p.id}} {{p.title}} Closed {{p.category_name || '—'}} {{p.total_score || '—'}} {{p.reviews_count || 0}} {{p.address || '—'}} {{p.city || '—'}} {{p.country_code || '—'}} {{p.phone || '—'}} {{p.website}} {{p.domain}} {{p.created_at ? new Date(p.created_at).toLocaleString() : '—'}}
No places found
Place Categories
Overview of crawled categories
All Categories
IDCategory NameDescriptionClustersPlaces CountActions
{{c.id || '—'}} {{c.name}} {{c.description || '—'}}
{{cl}}
{{c.count || 0}}
No categories found
Place Clusters
Group place categories for easy querying
All Clusters
NameDescriptionCategoriesActions
{{cl.name}} {{cl.description || '—'}} {{(cl.categories || []).join(', ')}}
No clusters found
Place Queries
Manage Maps crawling jobs via Apify
{{selectedQueries.length}} selected
All Queries ({{placeQueriesTotal}})
LabelSearch Term(s)CategoriesLocationStatusResults / MaxRun IDActions
{{q.label}} {{q.search_term || '—'}} {{q.category_filter || '—'}} {{q.location || '—'}} {{q.status}} {{q.total_results || 0}} / {{q.max_results || 100}}
{{q.run_id}}
No queries found
{{placeQueriesOffset+1}}–{{Math.min(placeQueriesOffset+placeQueriesLimit,placeQueriesTotal)}} of {{placeQueriesTotal}}
TLDs Statistics
Overview of all Top Level Domains
Unique TLDs
{{tldsMetrics.total || 0}}
Total Domains
{{tldsMetrics.sum_domains || 0}}
Enriched Domains
{{tldsMetrics.sum_enriched || 0}}
All TLDs ({{tldsMetrics.total}})
TLDDomain CountEnriched CountLast Updated
.{{t.tld}} {{t.domain_count}} {{t.enriched_count || 0}} ({{ ((t.enriched_count || 0) / t.domain_count * 100).toFixed(1) }}%) {{ago(t.updated_at)}}
No TLDs found
Manage Tag Types ({{tagtypes.length}})
Configure taxonomy tag types
All Tag Types
IDName (EN)Description (EN)WikipediaActions
{{t.id}} {{t.name_en}} {{t.desc_en || '—'}} Link
Manage Tags ({{tags.length}})
Configure taxonomy tags
All Tags
IDName (EN)TypeParentDescription (EN)KeywordsActions
{{t.id}} {{t.name_en}} {{t.type}} {{ getTagLabel(t.parent_id) }} {{t.desc_en || '—'}} {{(t.keywords||[]).join(', ')}}
Tag Tester
Detect tags from text
Test Text
{{ex.label}}
Detected Tags Calculated: {{testDate.toLocaleString()}}
{{res.tag}} {{Math.round(res.probability * 100)}}%
No tags detected
Raw JSON Output
{{ toJson(testResults) }}
Social Links
Manage and filter discovered social media profiles
Filters
Social Links ({{socialsTotal}})
Domain Network URL Discovered
{{s.domain}} {{s.network}} {{s.url}} {{ago(s.created_at)}}
No social links found.
{{socialFilters.offset+1}}–{{Math.min(socialFilters.offset+socialFilters.limit,socialsTotal)}} of {{socialsTotal}}
Email Addresses
Manage and track email validity and statuses
Filters
Emails ({{emailsTotal}})
Email Domain Type Status Last Checked Notes Actions
{{e.email}} {{e.domain}} {{e.type}} {{e.status}} {{ago(e.last_checked_at)}} {{e.notes || '—'}}
No emails found.
{{emailFilters.offset+1}}–{{Math.min(emailFilters.offset+emailFilters.limit,emailsTotal)}} of {{emailsTotal}}
Processing Queue
Manage domains waiting to be enriched
Queue Items
Domain Priority Status Error Message Created At Actions
{{q.domain}} {{q.priority}} {{q.status}} {{q.error_message||'—'}} {{ago(q.created_at)}}
Queue is empty!
Site Analyser
Test the enrichment engine on any domain
{{analyserError}}
Results for {{analyserInput}}
{{ toJson(analyserResult) }}
Name {{analyserResult.name || '—'}}
Type {{analyserResult.type || '—'}}
Email {{analyserResult.email || '—'}}
Telephone {{analyserResult.telephone || '—'}}
Country {{analyserResult.country || '—'}}
HTTP {{analyserResult.http_status}}
Load Time {{analyserResult.load_time_ms}}ms
Techs {{(analyserResult.technologies||[]).map(t=>t.label).join(', ') || 'None'}}
Keywords {{(analyserResult.seo?.content_keywords||[]).slice(0, 15).join(', ') || 'None'}} {{(analyserResult.seo?.content_keywords?.length > 15) ? '...' : ''}}
URL Parser
Test data models against specific URLs
No matching data model found for this URL. Create a model first.
{{parserError}}
Parsed Results {{parserResult.model}}
{{ toJson(parserResult.result) }}
Data Models
Declarative schemas for structured page parsing
All models ({{allModels.length}})
Domain Model ID Regex Entity Fields Examples Actions
{{m.domain_name || m.domain||'—'}} {{m.model_id || m.id}} {{m.regex || m.regexes?.[0]||'—'}} {{m.mapping?.entity || m.entity||'—'}} {{m.mapping?.schema?.length || m.schema?.length||0}} {{(m.example_urls || m.exampleUrls || []).length}}
No data models yet.
Run parser on a domain
{{runParserResult}}
Segments
Manage user and lead segments
All Segments ({{segments.length}})
Name Source Query/Keyword Records Created Actions
{{seg.name}} {{seg.source || '—'}} {{seg.query || '—'}} {{seg.users_count || 0}} {{ago(seg.created_at)}}
No segments yet. Create one to get started.
{{activeSegment.name}}
Manage records and settings for this segment
Data & Records
Rules
Recommendations
Settings
API & Export
API Endpoint & Export

Access segment data programmatically using the API. You can configure the export parameters below and copy the generated API URL.

Test API
Please select an API Key first.
General Settings
Rule Configuration
Rules saved!

Domain Filters

Places Filters

{{c.name}}
{{cat}}
No categories set.
{{c.name}}
{{loc}}
No locations set.
{{kw}}
No keywords set.

Import Matched Records

Add the domains matching your rules to the segment records to start enriching them.

Predicted Match {{segmentPrediction || 0}}
Records
{{segmentUsersTotal}}
Emails
{{segmentStats.with_email || 0}}
Valid Emails
{{segmentStats.email_delivered || 0}}
Unverified
{{(segmentStats.email_unknown || 0) + (segmentStats.email_unchecked || 0)}}
Enriched
{{segmentStats.done || 0}}
Queued
{{segmentStats.todo || 0}}
Processing
{{segmentStats.processing || 0}}
Records in Segment ({{segmentUsersTotal}})
Email Domain Status Name Place Info Added Actions
{{u.display_email || u.email}} {{u.email_status}}
{{u.domain}} {{u.domain_status}} {{u.name || '—'}}
Reason: {{u.message}}
Closed {{u.place_data.score}} ({{u.place_data.reviews}}) {{u.place_data.category}}
{{u.place_data.city}} Maps
{{ago(u.created_at)}}
No records in this segment.
Similar Domains (AI Discovered)
{{segmentRecsError}}
Domain Name Type Country/TLD Match Score Actions
{{rec.domain}} {{rec.name || '—'}} {{rec.type}} {{rec.country || rec.tld || '—'}} Score: {{ (rec.kw_overlap * 2) + rec.trait_score }}
No recommendations found. Try adding more enriched domains to build a profile first.
{{detailDomain}}
{{detailResult.name}} · {{detailResult.type||'Unknown type'}}
{{detailError}}
Web Search
Search the live web and automatically discover & index domains
{{webSearchError}}
Results ({{webSearchResult.from_cache ? 'Cached' : 'Live'}})
No results found.
Domain Search
Search across all internally indexed domains and pages in your database (use spaces or + for AND, commas for OR)
{{searchError}}
Results ({{searchResult.count}})
Domain Name Description Type Email TLD Lang
{{d.domain}} {{d.name||'—'}} {{d.description||'—'}} {{d.type}} {{d.email||'—'}} {{d.tld||'?'}} {{d.language||'?'}}
URL Title Type HTTP
{{u.url.replace(/^https?:\/\//,'')}} {{u.page_title||'—'}} {{u.page_type}} {{u.http_status}}
No results found.
{{view}} Database
Explore geographic data
{{view}} ({{geoCountry.toUpperCase()}}) ({{geoTotal}})
Actions
No data found
{{geoOffset+1}}–{{Math.min(geoOffset+50,geoTotal)}} of {{geoTotal}}
Weather & Geo Tool
Find closest location info and current/historical weather
Location lookup
{{c.name}} {{c.admin2 || c.admin1}}, {{c.country_iso2}} {{c.latitude}}, {{c.longitude}}
Historical Weather
{{weatherError}}
Current Location & Weather

Location Match

City {{weatherResult.city?.name || '—'}} ({{weatherResult.city?.postcode || '—'}})
Province {{weatherResult.province?.name || '—'}}
State/Reg {{weatherResult.region?.name || '—'}}
Country {{weatherResult.city?.country || '—'}}
Closest ✈️ {{weatherResult.city?.closest_airport?.name || '—'}} ({{weatherResult.city?.closest_airport?.distance_km || 0}} km)

Current Weather

No current weather data available.
Historical Weather for {{weatherDate}}
Condition {{weatherHistoryResult.daily[0].condition}}
Temp Range {{weatherHistoryResult.daily[0].temp_min_c}}°C - {{weatherHistoryResult.daily[0].temp_max_c}}°C
Precipitation {{weatherHistoryResult.daily[0].precipitation_sum_mm}} mm
Max Wind {{weatherHistoryResult.daily[0].wind_speed_max_kmh}} km/h

Hourly Breakdown

TimeTempConditionWindPrecip
{{h.time.substring(11, 16)}} {{h.temp_c}}°C {{h.condition}} {{h.wind_direction}} {{h.wind_speed_kmh}} km/h {{h.precipitation_mm}} mm
No historical data found for this date.
Email Validator
Verify if an email address exists and can receive mail via SMTP checking
{{validatorError}}
Validation Result {{validatorResult.status}}
Reason {{validatorResult.reason}}
Reverse Phone Lookup
Find places and domains associated with a phone number
{{phoneLookupError}}
Matching Domains ({{phoneLookupResult.domains.length}})
Domain Name Type Email Phone
{{d.domain}} {{d.name||'—'}} {{d.type}} {{d.email||'—'}} {{d.telephone||'—'}}
Matching Places ({{phoneLookupResult.places.length}})
ID Title Category Address Phone Domain
{{p.id}} {{p.title}} {{p.category_name || '—'}} {{p.address || '—'}} {{p.phone || '—'}} {{p.domain}}
No matching domains or places found for this phone number.
Manage Users
Invite or remove users from the platform
Users
NameEmailCreatedActions
{{u.name || '—'}} {{u.role}} {{u.email}} {{ago(u.created_at)}}
No users found
Manage API Keys
Add, update, or remove API keys for users
API Keys
UserLabelKeyStatusLast UsedActions
{{k.user_name || k.user_email}} {{k.label || '—'}} {{k.api_key}} {{k.active ? 'Active' : 'Disabled'}} {{ago(k.last_used_at)}}
No API keys found
Instagram Profiles
Manage and crawl discovered Instagram accounts
Profiles ({{igProfilesTotal}})
ProfileDomainLocationFollowersScoreStatusActions
{{p.username}}
{{p.full_name || '—'}}
{{p.domain}} {{p.city || '?'}}, {{p.country || '?'}} {{p.follower_count != null ? p.follower_count : '—'}} {{Math.round(p.score)}} {{p.fetched_at ? 'Crawled' : 'Pending'}}
No profiles found
{{igProfilesOffset+1}}–{{Math.min(igProfilesOffset+50,igProfilesTotal)}} of {{igProfilesTotal}}
@{{igDetailResult.username}}
{{igDetailResult.full_name || 'Instagram Profile'}}
Max Posts:
{{igDetailResult.full_name || igDetailResult.username}}
{{igDetailResult.biography}}
{{igDetailResult.domain}} {{igDetailResult.business_email}} {{igDetailResult.business_phone_number}} {{igDetailResult.city || '?'}}, {{igDetailResult.country || '?'}}
{{igDetailResult.follower_count || 0}} followers {{igDetailResult.following_count || 0}} following {{igDetailResult.media_count || 0}} posts Score: {{Math.round(igDetailResult.score)}} Tagged: {{igDetailResult.tagged_count}} Language: {{igDetailResult.language || '?'}}

Recent Posts ({{igDetailPosts.length}})

{{new Date(post.taken_at).toLocaleString()}}

{{post.caption}}

{{post.like_count || 0}} {{post.comment_count || 0}}
ER: {{(post.engagement_rate * 100).toFixed(2)}}%
No posts found.
Instagram Posts
Search across indexed Instagram posts
Posts ({{igPostsTotal}})
MediaProfileCaptionEngagementDate
{{p.username}} {{p.caption || '—'}}
{{p.like_count || 0}} {{p.comment_count || 0}} {{(p.engagement_rate * 100).toFixed(1)}}%
{{new Date(p.taken_at).toLocaleDateString()}}
No posts found
{{igPostsOffset+1}}–{{Math.min(igPostsOffset+50,igPostsTotal)}} of {{igPostsTotal}}
Admin Tools
Manage data operations with S3 and DuckDB
Export Database to S3

Exports the domains and urls tables as Parquet files to the configured S3 bucket.

{{s3ExportJob.message}} {{s3ExportJob.progress}} / {{s3ExportJob.total}}
{{s3ExportJob.message || s3ExportResult}}
{{s3ExportJob.message}}
Import Domains from S3

Imports domain list CSV from the configured S3 bucket.

{{s3ImportJob.message}} {{s3ImportJob.progress}} / {{s3ImportJob.total}}
{{s3ImportJob.message || s3ImportResult}}
{{s3ImportJob.message}}
Query S3 Data (DuckDB)
{{duckdbError}}
{{key}}
{{val}}
No results found.
System Settings
Manage authentication and configuration
Authentication

You are logged in as {{currentUser?.name || currentUser?.email}} ({{currentUser?.role}}).

Email Discovery
Find all emails for a specific website or domain
{{hunterError}}
Found {{hunterResult.count}} emails for {{hunterResult.domain}}
Email Type Sources
{{e.email}} Different Domain Found on {{e.source_website}} {{e.status}}
{{e.type}}
+{{e.sources.length - 3}} more
No emails found for this domain.