Developers

The AZi API

The same engine behind our free tools, as an endpoint. Audit any page for technical SEO, AI citation readiness or its tech stack.

Short answer

Create a free key in your account, send it as a Bearer token, and call /api/v1/seo?url=example.com. You get JSON with a score and every individual check, each with the specific fix. 60 requests an hour, 500 a day, free.

Getting a key

Create an account, then generate a key at /account/api. The key is shown once — we store only a hash of it, so it cannot be shown again. Lose it and you revoke it and make a new one.

Authentication

Send the key as a Bearer token. That keeps it out of server logs and browser history:

curl "https://azi.solutions/api/v1/seo?url=example.com" \ -H "Authorization: Bearer azi_live_xxxxxxxxxxxx…"

A ?api_key= query parameter also works, but it is discouraged for exactly the reason above.

Endpoints

GET /api/v1/seo

Twenty weighted technical checks — title, meta, headings, canonical, indexability, schema, images, content depth, links, sitemap, compression, response time, security headers. Returns a 0–100 score, an A–F grade, and every check with its own fix.

GET /api/v1/ai-search

Whether a page is built to be quoted by AI answer engines. The heaviest weights go to the two things that decide it: whether the content exists in the raw HTML at all, and whether AI crawlers are allowed in robots.txt.

GET /api/v1/tech

Platform, framework, analytics, CDN and hosting detected from headers and page signatures.

GET /api/v1/me

Your key's tier, limits and current usage. Does not count against your quota.

Parameters

  • url — required on the three analysis endpoints. A public http or https address. Bare domains are accepted and https is assumed.

Response shape

{ "ok": true, "tool": "seo", "url": "https://example.com", "cached": false, "took_ms": 842, "data": { "score": 78, "grade": ["B", "Good, with gaps", "pass"], "counts": { "pass": 14, "warn": 4, "fail": 2, "info": 1 }, "checks": [ { "status": "fail", "label": "XML sitemap", "detail": "No sitemap.xml and none declared in robots.txt.", "weight": 2, "fix": "Publish a sitemap and submit it in Search Console." } ] }, "usage": { "hour": 3, "day": 11, "hourLimit": 60, "dayLimit": 500 } }

Rate limits

Free tier is 60 requests an hour and 500 a day. Every response carries the current position:

X-RateLimit-Limit: 60 X-RateLimit-Remaining: 57 X-RateLimit-Reset: 1840

Go over and you get 429 with a retry_after_seconds value. Repeat calls for the same URL are served from cache for an hour and still count, but return in milliseconds.

Errors

Every failure returns the same shape, with a stable machine-readable code:

{ "ok": false, "error": { "code": "bad_url", "message": "That is not a valid public http or https address." } }
CodeHTTPMeaning
no_key401No key sent
bad_key401Key invalid, revoked or expired
missing_url422No url parameter
bad_url422Not a valid public address
rate_limited429Hourly or daily limit reached
fetch_failed502We could not reach that page
upstream_error502That page returned a 4xx or 5xx

What this API will not do

It will not fetch private addresses. Anything resolving to a private or reserved IP range is refused, on every redirect hop. That is deliberate — an open fetcher is a server-side request forgery hole.

It does not run JavaScript. We read the HTML your server actually returns, which is precisely the point: that is what a search crawler and an AI crawler see too.

It is not a rank tracker. No free, legitimate source of live ranking positions exists — anyone offering one is scraping search results against their terms. We measure the page, not the market.

Version stability

The v1 path will not change shape under you. New fields may be added to data; existing fields will not be renamed or removed. Anything breaking goes to v2 with the old version left running.

Get a key

Free, no card, working in about a minute.

Create an API key →