API
Two endpoints, no key, no sign-up
Everything the API returns is already on a public page, so putting a key in front of it would add a barrier without adding a protection. It is rate limited per address instead — 60 requests a minute, which is more than any honest use needs.
2
Endpoints
A lookup and a search. That is the whole surface.
60/min
Rate limit
Per IP address. No key to request or rotate.
607,297
Domains reachable
The same corpus the site serves.
CORS
Open
Callable straight from a browser.
Reference
Look up a domain
Returns the assessment for one domain: its score, the verdict in words, the registration and certificate facts behind it, and the findings the analysis produced.
GET
https://legitsonar.com/api/v1/domains/{domain}
Request
curl https://legitsonar.com/api/v1/domains/cp.rs
Response 200
{
"domain": "cp.rs",
"score": 100,
"band": 5,
"verdict": "Likely trustworthy",
"summary": "The signals we can check all point the same way. Normal care still applies.",
"analysed_at": "2026-09-03T14:24:36+00:00",
"registration": {
"age_days": 6688,
"registered_at": "2008-05-12T00:00:00+00:00",
"renews_at": "2027-05-12T00:00:00+00:00",
"owner_disclosed": true,
"organisation": "PREMTEC DOO",
"country": null
},
"certificate": {
"valid": true,
"issuer": "Let's Encrypt",
"validation": "domain"
},
"findings": {
"positive": [
"This site seems to sell products online (how to check if it is a shop scam)",
"According to the SSL check the certificate is valid",
"This website has existed for quite some years",
"DNSFilter considers this website safe"
],
"negative": [
"This website does not have many visitors",
"Searching on Social Media we found negative links",
"No reviews were found on commonly used review sites"
]
},
"tld": "rs",
"links": {
"report": "https://legitsonar.com/check-website/cp.rs",
"pdf": "https://legitsonar.com/check-website/cp.rs/report.pdf"
}
}
Errors
| Status | error | When |
|---|---|---|
| 404 | not_found |
Nothing on file yet. The response carries an analyse link —
opening it runs a live scan and creates the record. |
| 429 | — | Over 60 requests in a minute. Retry-After says how long to wait. |
Search by name
The same index the type-ahead uses. Matches on any part of a domain name, ordered by relevance.
GET
https://legitsonar.com/api/v1/search?q={query}&limit={1-50}
Request
curl 'https://legitsonar.com/api/v1/search?q=paypal&limit=5'
Response 200
{
"query": "paypal",
"count": 3,
"results": [
{
"domain": "brightpics-paypaldetails-paypaldetails.ph",
"score": 100,
"band": 5,
"analysed_at": "2026-08-28T10:16:44+00:00",
"links": {
"report": "https://legitsonar.com/check-website/brightpics-paypaldetails-paypaldetails.ph"
}
},
{
"domain": "paypal0013008.ph",
"score": 80,
"band": 4,
"analysed_at": "2026-08-21T20:52:20+00:00",
"links": {
"report": "https://legitsonar.com/check-website/paypal0013008.ph"
}
},
{
"domain": "paypal0203008.ph",
"score": 80,
"band": 4,
"analysed_at": "2026-08-21T20:52:21+00:00",
"links": {
"report": "https://legitsonar.com/check-website/paypal0203008.ph"
}
}
]
}
Before you build on it
Four things worth knowing
Responses are cached for five minutes
An assessment only moves when a scan lands, so the endpoint sends
Cache-Control: public, max-age=300. Respect it and you will rarely
meet the rate limit.
A score is a snapshot
analysed_at is on every response for a reason. A site can be sold or
compromised the day after it was assessed — treat an old timestamp as a reason to
re-check, not as a current fact.
The version is in the path
Fields may be added to v1 without warning; nothing will be removed or
change meaning. A breaking change gets a new prefix, and this page will say so.
Do not use it to generate traffic
Reading an assessment is free. Triggering new scans in bulk is not what the limits are for, and it makes this server send requests to other people's sites. See the terms.
Need something the API does not do?
Batch submission, webhooks on a score change, higher limits — none of it exists yet, and what gets built depends on who asks for it.