Machine Learning — entry 017 of 24
Not Human Search
Not Human Search indexes websites and MCP servers by "agentic readiness" — how easily an AI agent can interact with a site via APIs, machine-readable docs, or MCP — exposing search, per-domain reports, and a live /check crawl that returns a 7-signal readiness score. It ships a public OpenAPI spec and an llms.txt file at its API root, with anonymous access to basic queries capped at a free 10-checks-per-hour rate limit, and Stripe-billed starter/pro/scale plans for higher-volume access or commerce endpoints like score monitoring and GEO score-fix services.
GreatAPIs Score
Auth quickstart
- No key needed — call it now.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Endpoints
/1
GET/API index — list of endpoints and base URLs
| Status | Description | Schema |
|---|---|---|
200 | API index document | — |
action-interests1
POST/action-interestsRecord caller-attested principal interest in one controlled next step
application/json — ActionInterestRequest (required)
| Status | Description | Schema |
|---|---|---|
200 | Exact idempotent replay of the existing receipt | ActionInterestResponse |
201 | New provider-independent action-interest receipt | ActionInterestResponse |
403 | Cross-origin browser mutation rejected; native agents without browser-origin headers remain supported | — |
404 | Missing | — |
409 | This search result already recorded a different controlled action | — |
429 | Temporary free abuse limit exceeded | — |
action-receipts1
POST/action-receipts/verifyVerify immutable NHS signature separately from freshness and current accounting state
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | Signature validity, time-window status, and current online commercial state when available | — |
action-tickets2
POST/action-ticketsPrepare an authorization-attested action for a disclosed paid offer
application/json — ActionTicketRequest (required)
| Status | Description | Schema |
|---|---|---|
200 | Exact replay with the attribution bearer reconstructed from the persisted ticket snapshot | ActionTicketPreparationResponse |
201 | New ticket, raw attribution bearer, and POST handoff endpoint; no provider action URL and no charge | ActionTicketPreparationResponse |
400 | Invalid JSON | — |
404 | Exact public offer or returned-offer evidence unavailable; intentionally indistinguishable | — |
409 | Provider claim | — |
410 | Exact replay refers to an expired ticket authorization | — |
429 | Temporary action-ticket safety limit exceeded | — |
503 | Signed provider actions are not configured | — |
POST/action-tickets/handoffRecord an NHS-observed handoff and reveal the provider action URL
application/json — ActionTicketHandoffRequest (required)
| Status | Description | Schema |
|---|---|---|
200 | Exact replay of the existing durable handoff receipt and provider URL; neither party charged | ActionTicketHandoffResponse |
201 | New durable observed-handoff receipt and attributed provider URL; neither party charged | ActionTicketHandoffResponse |
400 | Invalid JSON | — |
404 | Ticket or exact bearer not found | — |
409 | Verified commercial evidence unavailable | — |
410 | Ticket attribution expired; neither party charged | — |
429 | Temporary handoff safety limit exceeded | — |
api-keys2
GET/api-keys/subscribeList the optional priority-throughput API key plan and checkout contract
| Status | Description | Schema |
|---|---|---|
200 | Priority throughput only; baseline discovery and organic results remain free | — |
POST/api-keys/subscribeCreate a Stripe Checkout session for a paid API key subscription
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | Stripe Checkout URL and activation URL | — |
503 | Stripe is not configured | — |
catalog1
GET/catalogAgent-readable commerce catalog
| Status | Description | Schema |
|---|---|---|
200 | Catalog for score-fix service and API subscription plans | — |
categories1
GET/categoriesGet all category buckets and their counts
| Status | Description | Schema |
|---|---|---|
200 | Category counts across the index | — |
check1
POST/checkOn-demand agentic readiness check (live crawl)
application/json
| Status | Description | Schema |
|---|---|---|
200 | Score + 7 signals | — |
429 | Rate limit exceeded | — |
checkout1
POST/checkoutCreate a Stripe Checkout URL for a GEO uplift order
application/json (required)
| Status | Description | Schema |
|---|---|---|
201 | Stripe Checkout URL | — |
501 | Requested payment mode is not supported | — |
monitor1
POST/monitor/registerRegister an email to monitor a site's agentic readiness score
application/json (required)
| Status | Description | Schema |
|---|---|---|
201 | Monitor registered | — |
400 | Invalid email or domain | — |
429 | Too many monitors for this email | — |
provider17
POST/provider/action-tickets/resolveResolve separately consented controlled intent after an observed handoff
application/json — ProviderControlledIntentResolveRequest (required)
| Status | Description | Schema |
|---|---|---|
200 | Exact separately consented controlled-intent bundle; no charge or proof created | ProviderControlledIntentResolution |
400 | Malformed | — |
401 | Valid active claim-scoped provider key required | — |
404 | Consented controlled intent unavailable; wrong claim | — |
410 | Correctly signed attribution bearer expired | — |
429 | Temporary provider resolver safety limit exceeded | — |
503 | Provider exchange | — |
GET/provider/claimsList provider claims and DNS ownership-check status for the signed-in account
| Status | Description | Schema |
|---|---|---|
200 | Provider claims with safe ownership-freshness status | — |
401 | Human account session required | — |
POST/provider/claimsBegin an indexed-domain provider claim
application/json (required)
| Status | Description | Schema |
|---|---|---|
201 | Claim, one-time DNS TXT challenge, and ownership-freshness contract | ProviderClaimChallengeResponse |
401 | Human account session required | — |
409 | Domain is already claimed or the account already has a claim | — |
POST/provider/claims/{claim_id}/challengeRotate a pending claim's DNS challenge
| Name | In | Required | Type |
|---|---|---|---|
claim_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Rotated one-time DNS TXT challenge and ownership-freshness contract | ProviderClaimChallengeResponse |
POST/provider/claims/{claim_id}/keys/rotateRotate the claim-scoped provider callback key
| Name | In | Required | Type |
|---|---|---|---|
claim_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | New provider key returned once; prior keys revoked | — |
POST/provider/claims/{claim_id}/revokeRevoke a provider claim, keys, offers, and outstanding action authorization
| Name | In | Required | Type |
|---|---|---|---|
claim_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Claim revoked | — |
POST/provider/claims/{claim_id}/verifyVerify the claim's DNS TXT challenge and return the callback key once
| Name | In | Required | Type |
|---|---|---|---|
claim_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Verified claim, current ownership freshness, and a newly issued provider key returned once when applicable | ProviderClaimVerifyResponse |
409 | DNS challenge missing | — |
POST/provider/commercial-acceptancesRecord one provider-authenticated commercial acceptance
| Name | In | Required | Type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
application/json — ProviderCommercialAcceptanceRequest (required)
| Status | Description | Schema |
|---|---|---|
200 | Exact idempotent replay of the existing provider-authenticated acceptance | ProviderCommercialAcceptanceResponse |
201 | New provider-authenticated acceptance; owner verification is still required and commercial proof is false | ProviderCommercialAcceptanceResponse |
400 | Invalid header | — |
401 | Valid active claim-scoped provider key required | — |
409 | Stale claim | — |
GET/provider/demandRead privacy-thresholded demand for the authenticated claim domain
| Name | In | Required | Type |
|---|---|---|---|
days | query | no | integer |
| Status | Description | Schema |
|---|---|---|
200 | Privacy-thresholded aggregate demand for the authenticated claim domain | ProviderDemandResponse |
400 | Invalid days | — |
401 | Valid active claim-scoped provider key required | — |
404 | Authenticated claim is no longer verified and fresh | — |
429 | Temporary provider read safety limit exceeded | — |
500 | Provider demand query failed | — |
503 | Provider key authentication unavailable | — |
GET/provider/offersList offers owned by the signed-in provider account
| Name | In | Required | Type |
|---|---|---|---|
claim_id | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | Provider offers and commercial states | — |
POST/provider/offersCreate a draft provider-funded action offer
application/json (required)
| Status | Description | Schema |
|---|---|---|
201 | Draft offer created | — |
409 | Offer inventory limit reached | — |
GET/provider/offers/{offer_id}Get one offer owned by the signed-in provider account
| Name | In | Required | Type |
|---|---|---|---|
offer_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Provider offer | — |
PUT/provider/offers/{offer_id}Update an owned draft offer
| Name | In | Required | Type |
|---|---|---|---|
offer_id | path | yes | string |
application/json — ProviderOfferRequest (required)
| Status | Description | Schema |
|---|---|---|
200 | Updated offer | — |
POST/provider/offers/{offer_id}/pausePause an owned offer
| Name | In | Required | Type |
|---|---|---|---|
offer_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Offer paused | — |
POST/provider/outcomesRecord an idempotent provider-reported action outcome
| Name | In | Required | Type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | Exact idempotent replay | — |
201 | New signed provider-outcome receipt | — |
401 | Valid claim-scoped provider key required | — |
409 | Invalid transition | — |
GET/provider/pilot-statusRead claim-scoped pilot continuity status
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
| Status | Description | Schema |
|---|---|---|
200 | Current status for the authenticated provider claim | ProviderPilotStatusResponse |
400 | Invalid limit | — |
401 | Valid active claim-scoped provider key required | — |
404 | Authenticated claim is no longer verified and fresh | — |
429 | Temporary provider read safety limit exceeded | — |
500 | Provider pilot status query failed | — |
503 | Provider key authentication unavailable | — |
GET/provider/receipts/{receipt_id}Retrieve one receipt owned by the authenticated provider
| Name | In | Required | Type |
|---|---|---|---|
receipt_id | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Signed provider receipt | — |
401 | Valid claim-scoped provider key required | — |
404 | Receipt not found for this provider | — |
quote1
POST/quoteCreate a deterministic quote
application/json
| Status | Description | Schema |
|---|---|---|
200 | Quote with amount, total, currency, and required checkout metadata | — |
search1
GET/searchSearch for agent-ready sites
| Name | In | Required | Type |
|---|---|---|---|
q | query | no | string |
category | query | no | string |
tag | query | no | string |
min_score | query | no | integer |
has_api | query | no | boolean |
has_mcp | query | no | boolean |
has_openapi | query | no | boolean |
has_llms_txt | query | no | boolean |
page | query | no | integer |
| Status | Description | Schema |
|---|---|---|
200 | Search results | — |
429 | Temporary search safety limit exceeded; free access resumes after the reset | — |
site1
GET/site/{domain}Get detailed agentic readiness report for a site
| Name | In | Required | Type |
|---|---|---|---|
domain | path | yes | string |
search_id | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | Site details, plus a noncommercial action-interest opportunity only after an exact new receipt-bound selection | SelectedSiteDetail |
stats1
GET/statsGet index statistics
| Status | Description | Schema |
|---|---|---|
200 | Index stats | — |
submit1
POST/submitSubmit a site for crawling
application/json
| Status | Description | Schema |
|---|---|---|
201 | Submitted for crawling | — |
top1
GET/topTop-scored agent-ready sites
| Name | In | Required | Type |
|---|---|---|---|
category | query | no | string |
has_mcp | query | no | boolean |
has_openapi | query | no | boolean |
has_llms_txt | query | no | boolean |
has_api | query | no | boolean |
limit | query | no | integer |
| Status | Description | Schema |
|---|---|---|
200 | Top sites | — |
verify-mcp1
GET/verify-mcpLive-probe a URL for MCP compliance
| Name | In | Required | Type |
|---|---|---|---|
url | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Probe result | — |
400 | url query param missing | — |
429 | Temporary live-probe safety limit exceeded; free access resumes after the reset | — |
Try it
Developer reference
https://nothumansearch.ai/api/v1- GET/search
- GET/top
- GET/stats
- GET/categories
Availability
Changelog
- gained an OpenAPI spec