← Back to home

Stack & API

How we built AI Search Readiness Score, and how you can access it programmatically.

Tech Stack

Frontend

Next.js 14

App Router with SSR and static generation

API

Fastify 4

High-performance REST API with BullMQ workers

Database

PostgreSQL 16

Primary data store with Drizzle ORM

Queue

Redis 7

BullMQ job queue for async scan pipeline

Crawler

Playwright

Headless browser for JS-rendered page analysis

LLM

GPT-4o

Vertical detection and content analysis checks

Monitoring

Perplexity API

AI citation checks across 20 queries

Infra

Docker Compose

Single-VPS deployment with nginx reverse proxy

Scoring Model

Your score out of 100 is computed as a weighted sum of four baskets:

Score = 0.25 × MR + 0.30 × EX + 0.25 × TR + 0.20 × OR
25
MR
Machine Readability
30
EX
Extractability
25
TR
Trust & Entity
20
OR
Offering Readiness

26 total checks: 9 core (visible to free), 13 premium, 4 LLM-based. JS-heavy sites receive a penalty multiplier on MR if server-rendered content is below 50 words.

Public API

Programmatic access to trigger scans and retrieve results. No API key required — rate limited to 5 requests per hour per IP.

GET/api/score?url=...&email=...&niche=...

Trigger a scan

Starts a new scan and returns a scan ID for polling.

curl "https://getaisearchscore.com/api/score?url=https://example.com&email=you@example.com"

# Response:
{
  "scanId": "abc-123...",
  "status": "queued",
  "pollUrl": "https://getaisearchscore.com/api/scans/abc-123...",
  "resultsUrl": "https://getaisearchscore.com/results/abc-123..."
}
GET/api/scans/:id

Poll scan results

Poll until status is completed or failed. Returns score, sub-scores, and check results.

curl "https://getaisearchscore.com/api/scans/abc-123..."

# Response includes: status, estimatedScore, mrScore,
# estimatedExScore, estimatedTrScore, orScore, checks[], ...

Parameters

ParamRequiredDescription
urlYesFull URL to scan (e.g. https://example.com)
emailYesEmail to associate with scan results
nicheNoBusiness vertical hint (e.g. ecommerce, saas, local_business)

Rate limit: 5 requests per hour per IP. Domain rate limit: 1 scan per domain per 24 hours. Results are available at the pollUrl once the scan completes (typically 1-2 minutes).