letagentsin-com Scan API
The Scan API from letagentsin-com — 2 operation(s) for scan.
The Scan API from letagentsin-com — 2 operation(s) for scan.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/letagentsin-com:letagentsin-com-scan-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Let Agents In Scan API
version: 1.0.0
description: Scores a domain on agent readiness across 5 funnel stages, using 16 deterministic HTTP checks. 18 points exist on paper; the score is out of `measurable`, the points that both applied and could be evaluated. No account, no key.
contact:
email: hello@letagentsin.com
url: https://letagentsin.com/methodology
servers:
- url: https://letagentsin.com
tags:
- name: Scan
paths:
/api/scan:
post:
summary: Scan a domain
operationId: scanDomain
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- domain
properties:
domain:
type: string
example: example.com
format:
type: string
enum:
- json
- sarif
- agent
default: json
description: json is the scorecard. sarif is SARIF 2.1.0 with one rule per check. agent is markdown written to be acted on, with one task per failing check. Also accepted as ?format= on the query string.
responses:
'200':
description: Scorecard
content:
application/json:
schema:
type: object
properties:
id:
type: string
domain:
type: string
scorecard:
type: object
properties:
formulaVersion:
type: string
total:
type: integer
max:
type: integer
description: The paper maximum, the same for every domain
measurable:
type: integer
description: 'The denominator: points that applied and could be evaluated on this domain'
stages:
type: array
description: The same score split by funnel stage, in the order an agent meets them
items:
type: object
properties:
stage:
type: string
enum:
- discovery
- entry
- signup
- provisioning
- integration
letter:
type: string
description: A to E, the order an agent meets the stages in
title:
type: string
question:
type: string
description: What the stage asks, in the words the site uses
points:
type: integer
max:
type: integer
description: The stage paper maximum, so the column can sum to more than the scorecard measurable
measurable:
type: integer
description: The stage denominator, after what did not apply and what we could not read
checks:
type: array
items:
type: object
properties:
id:
type: string
enum:
- answers_plain_request
- price_in_snippet
- llms_txt
- docs_without_js
- user_agents_allowed
- robots_paths_resolve
- no_crawl_delay
- agent_entry_point
- oauth_dcr
- mcp_present
- signup_no_captcha
- signup_reachable
- programmatic_provisioning
- self_serve
- typed_package
- machine_readable_api
why:
type: string
description: What this costs a vendor, in the words the report uses
points:
type: integer
max:
type: integer
detail:
type: string
notApplicable:
type: boolean
description: The check does not apply to a product of this kind, so it is out of the score and out of measurable
inconclusive:
type: boolean
description: Zero because we could not measure it, not because it is absent
label:
type: string
stage:
type: string
enum:
- discovery
- entry
- signup
- provisioning
- integration
unblock:
type: string
description: What to change, or for an unmeasured check what would make it measurable
reused:
type: boolean
description: The domain was scanned in the last few minutes and the stored result was returned rather than a new one
saved:
type: boolean
description: False when the measurement finished but the store would not accept it. The scorecard is complete and /r/{id} will stop resolving at the next deploy
warning:
type: string
description: 'Present with saved: false, in the words the page uses'
challengedAt:
type: object
description: 'Present when the vendor''s own edge answered a request with a browser challenge rather than a rate limit. It costs no points: the checks that could not be read are unmeasurable rather than failed. A rate limit anywhere else, ours or the registry''s, never appears here'
properties:
hosts:
type: array
items:
type: string
challenged:
type: integer
description: How many of the refusals carried a challenge marker
refused:
type: integer
description: How many requests those hosts refused in total, challenged or not
truncation:
type: object
description: Present when the scan ran out of its time budget. The checks it names were never asked, so a partial scan must not be read as a full one
properties:
incompletePhases:
type: array
items:
type: string
unmeasuredChecks:
type: array
items:
type: string
enum:
- answers_plain_request
- price_in_snippet
- llms_txt
- docs_without_js
- user_agents_allowed
- robots_paths_resolve
- no_crawl_delay
- agent_entry_point
- oauth_dcr
- mcp_present
- signup_no_captcha
- signup_reachable
- programmatic_provisioning
- self_serve
- typed_package
- machine_readable_api
detail:
type: string
application/sarif+json:
schema:
type: object
description: 'SARIF 2.1.0, returned for format: sarif. runs[0].results holds only the checks that failed; what passed, what was not measurable and what did not apply are counted in runs[0].properties'
externalDocs:
url: https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html
text/markdown:
schema:
type: string
description: 'Returned for format: agent. One task per failing check, each carrying the measurement behind it. Not JSON: do not parse it'
'400':
description: Not a domain, or a format outside the enum
'422':
description: Domain refused or unreachable
'429':
description: 'Rate limit reached: 5 per hour per registrable domain, 30 per hour per address'
'500':
description: The scan itself failed. Retrying does not help on its own; the address in the body is where to tell us.
'503':
description: 'The scan did not finish inside the gateway timeout. /api/scan/stream reports progress and does not go silent. A store that will not accept the write is NOT this: that answers 200 with saved: false, because the measurement is finished and it is yours either way.'
tags:
- Scan
/api/scan/stream:
post:
summary: Scan a domain with progress events
operationId: scanDomainStreaming
responses:
'200':
description: text/event-stream carrying step, done and failed events
tags:
- Scan