REST API
Bearer-token API for Site Audit, AI Visibility, Conversion, and Content Quality. Pro and Business only.
Overview
One key starts audits, polls them, and reads the account that owns the key. Nothing here uses the browser session.
- Base URL:
https://wpaq.com/api/v1 - Create a key at Dashboard → Integrations. The full value is shown once.
- Connect an agent on the MCP server page. It calls this same API.
Authentication
Send the key on every request.
export WPAQ_API_KEY="wpaq_..."
"Authorization: Bearer $WPAQ_API_KEY"401— missing, invalid, or revoked key.403— the account is not on Pro or Business right now. The key is kept. Upgrade and the same key works again.
{
"detail": "Pro or Business plan required. This API key was not revoked, but the account is not on Pro or Business."
}Rate limits
Hourly caps sit on top of the monthly Site Audit quota. GET polling is not on these caps.
POST /api/v1/site-audits per account, and 8/hour per source IP.
POST for AI Visibility, Conversion, and Content Quality, per account and per IP, on Pro and Business.
A repeated 429 lengthens the window. Wait, then retry. A monthly Site Audit quota miss is also 429.
Credits and quota
- Site Audits count against the plan's monthly Site Audit allowance. They do not spend AI credits.
- AI Visibility, Conversion, and Content Quality cost 10 credits when the hostname is a DNS-verified website on the account, and 20 credits otherwise. Short balance is
402. - An unverified Site Audit (including any third-party host) is capped at 25 pages on Pro and 100 pages on Business. DNS verification unlocks the plan's full crawl.
- Read balances with the quotas and AI usage endpoints below.
Polling
Create returns immediately. Poll GET until the run is finished.
AUDIT_ID=$(curl -sS -X POST "https://wpaq.com/api/v1/site-audits" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}' | jq -r .id)
while true; do
STATUS=$(curl -sS "https://wpaq.com/api/v1/site-audits/$AUDIT_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY" | jq -r .status)
echo "$STATUS"
case "$STATUS" in
completed|completed_with_warnings|failed) break ;;
esac
sleep 15
donestatus is queued, running, completed, completed_with_warnings, or failed. Warnings mean some pages were skipped. Scores stay null until the run finishes. Starting the same host again within 6 hours returns the existing Site Audit (reused_report: true).
Errors
Every error body is {"detail": "human-readable message"}.
Invalid URL, bad questionnaire answers, website limit, or DNS TXT not found yet.
Missing, invalid, or revoked API key.
Not enough AI credits for an AI Visibility, Conversion, or Content Quality run.
Account is not on Pro or Business. The key is not deleted.
That id is missing or belongs to another account.
Site Audit share was requested before the report finished.
Hourly rate limit or monthly Site Audit quota.
{ "detail": "Audit not found" }Site Audit
Full-depth crawl on Pro and Business. No AI credits.
/api/v1/site-auditsurl (required), optional crawl_mode (bfs, sitemap_only, url_list) and url_list (max 200, only with url_list). Errors: 400, 429. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/site-audits" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","crawl_mode":"bfs"}'{
"id": "b5659908-1c0a-4e2a-9f10-0a1b2c3d4e5f",
"url": "https://example.com/",
"hostname": "example.com",
"website_id": null,
"website_verified": null,
"score_delta": null,
"status": "queued",
"scan_type": "full",
"pages_discovered": 0,
"pages_scanned": 0,
"pages_failed": 0,
"overall_score": null,
"technical_score": null,
"seo_score": null,
"performance_score": null,
"accessibility_score": null,
"security_score": null,
"progress": { "step": "queued" },
"error_message": null,
"created_at": "2026-10-31T18:00:00Z",
"completed_at": null,
"user_id": "7c1e0a00-0000-4000-8000-000000000001",
"screenshots": [],
"site_screenshot": null,
"media_token": "example-media-token",
"pages": []
}/api/v1/site-audits/{id}curl -sS "https://wpaq.com/api/v1/site-audits/$AUDIT_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "b5659908-1c0a-4e2a-9f10-0a1b2c3d4e5f",
"url": "https://example.com/",
"hostname": "example.com",
"status": "completed",
"scan_type": "full",
"pages_discovered": 12,
"pages_scanned": 12,
"pages_failed": 0,
"overall_score": 91,
"technical_score": 92,
"seo_score": 88,
"performance_score": 95,
"accessibility_score": 97,
"security_score": 82,
"progress": { "step": "done" },
"error_message": null,
"created_at": "2026-10-31T18:00:00Z",
"completed_at": "2026-10-31T18:02:14Z",
"screenshots": [],
"site_screenshot": null,
"pages": []
}/api/v1/site-audits/{id}/progresscurl -sS "https://wpaq.com/api/v1/site-audits/$AUDIT_ID/progress" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "b5659908-1c0a-4e2a-9f10-0a1b2c3d4e5f",
"status": "running",
"url": "https://example.com/",
"hostname": "example.com",
"progress": { "step": "crawling", "pages_scanned": 4 },
"pages_discovered": 12,
"pages_scanned": 4,
"error_message": null,
"created_at": "2026-10-31T18:00:00Z",
"queue": null
}/api/v1/site-audits/{id}/findingscurl -sS "https://wpaq.com/api/v1/site-audits/$AUDIT_ID/findings" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"items": [
{
"id": "f1a2b3c4-0000-4000-8000-000000000010",
"check_id": "title_missing",
"category": "seo",
"severity": "medium",
"title": "Missing title",
"description": "This page has no title element.",
"technical_details": "",
"recommendation": "Add a unique title.",
"evidence": {},
"difficulty": "medium",
"impact": "medium",
"url": "https://example.com/"
}
]
}/api/v1/site-audits/{id}/findings/{finding_id}curl -sS "https://wpaq.com/api/v1/site-audits/$AUDIT_ID/findings/$FINDING_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "f1a2b3c4-0000-4000-8000-000000000010",
"check_id": "title_missing",
"category": "seo",
"severity": "medium",
"title": "Missing title",
"description": "This page has no title element.",
"technical_details": "",
"recommendation": "Add a unique title.",
"evidence": {},
"difficulty": "medium",
"impact": "medium",
"url": "https://example.com/"
}AI Visibility
Domain-scoped. 10 credits verified, 20 unverified. Create omits the report. GET includes it when you ask after the run exists.
/api/v1/ai-visibility-auditsurl. Errors: 400, 402, 429. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/ai-visibility-audits" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'{
"id": "vis-9f2c0000-0000-4000-8000-000000000020",
"type": "visibility",
"url": "https://example.com/",
"hostname": "example.com",
"status": "running",
"website_id": null,
"website_verified": null,
"overall_score": null,
"credits_charged": 20,
"credits_refunded": false,
"progress": { "step": "running" },
"error_message": null,
"has_screenshot": false
}/api/v1/ai-visibility-audits/{id}report when status is terminal. Errors: 404. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS "https://wpaq.com/api/v1/ai-visibility-audits/$CHECK_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "vis-9f2c0000-0000-4000-8000-000000000020",
"type": "visibility",
"url": "https://example.com/",
"hostname": "example.com",
"status": "completed",
"overall_score": 68,
"credits_charged": 20,
"credits_refunded": false,
"has_screenshot": true,
"report": { "summary": "Example report object. The live payload is the full structured report." }
}Conversion
Landing-page audit plus questionnaire. Same 10 / 20 credit rule.
/api/v1/conversion-audits/questionnairecurl -sS "https://wpaq.com/api/v1/conversion-audits/questionnaire" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"questions": [
{
"id": "primary_goal",
"prompt": "Primary goal of this page",
"allow_multiple": true,
"required": true,
"allow_other": true,
"options": [
{ "id": "signup", "label": "Get signups / trials" },
{ "id": "demo", "label": "Book a demo" }
]
}
]
}/api/v1/conversion-auditsurl and answers (map of question id to { "selected": [], "other": "" }). Errors: 400, 402, 429. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/conversion-audits" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/pricing","answers":{"primary_goal":{"selected":["signup"],"other":""}}}'{
"id": "con-9f2c0000-0000-4000-8000-000000000030",
"type": "convert",
"url": "https://example.com/pricing",
"hostname": "example.com",
"status": "running",
"credits_charged": 20,
"credits_refunded": false,
"questionnaire": { "primary_goal": { "selected": ["signup"], "other": "" } },
"has_screenshot": false
}/api/v1/conversion-audits/{id}report after the run is stored. Errors: 404. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS "https://wpaq.com/api/v1/conversion-audits/$CHECK_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "con-9f2c0000-0000-4000-8000-000000000030",
"type": "convert",
"status": "completed",
"overall_score": 74,
"credits_charged": 10,
"website_verified": true,
"has_screenshot": true,
"report": { "summary": "Example. The live report is the full structured Conversion Audit." }
}Content Quality
One page URL. Same 10 / 20 credit rule. No questionnaire.
/api/v1/quality-auditsurl. Errors: 400, 402, 429. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/quality-audits" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/blog/post"}'{
"id": "qua-9f2c0000-0000-4000-8000-000000000040",
"type": "quality",
"url": "https://example.com/blog/post",
"hostname": "example.com",
"status": "running",
"credits_charged": 20,
"credits_refunded": false,
"has_screenshot": false
}/api/v1/quality-audits/{id}report on GET. Errors: 404. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS "https://wpaq.com/api/v1/quality-audits/$CHECK_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "qua-9f2c0000-0000-4000-8000-000000000040",
"type": "quality",
"status": "completed",
"overall_score": 81,
"credits_charged": 10,
"has_screenshot": true,
"report": { "summary": "Example. The live report is the full structured Content Quality Audit." }
}Websites
Only websites on the key owner's account. Another account's id is 404.
/api/v1/websitescurl -sS "https://wpaq.com/api/v1/websites" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"items": [
{
"id": "web-a1b20000-0000-4000-8000-000000000050",
"url": "https://example.com/",
"hostname": "example.com",
"name": "Example",
"verified": false,
"health": 91,
"latest_scan_id": "b5659908-1c0a-4e2a-9f10-0a1b2c3d4e5f"
}
],
"workspace_role": "owner"
}/api/v1/websitesurl (required), optional name and client_tag. Errors: 400 if the URL is rejected or the plan website limit is reached. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/websites" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","name":"Example"}'{
"id": "web-a1b20000-0000-4000-8000-000000000050",
"url": "https://example.com/",
"hostname": "example.com",
"name": "Example",
"verified": false,
"verification": {
"txt_value": "wpaq-site-verification=exampleToken",
"txt_hostnames": ["example.com", "example.com", "_wpaq-verify.example.com"]
}
}/api/v1/websites/{id}curl -sS "https://wpaq.com/api/v1/websites/$WEBSITE_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"id": "web-a1b20000-0000-4000-8000-000000000050",
"url": "https://example.com/",
"hostname": "example.com",
"name": "Example",
"verified": true,
"health": 91,
"latest_scan_id": "b5659908-1c0a-4e2a-9f10-0a1b2c3d4e5f",
"issues": [],
"history": []
}/api/v1/websites/{id}/verify400 if it is not visible yet. Already verified returns already_verified: true. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/websites/$WEBSITE_ID/verify" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"ok": true,
"already_verified": false,
"verified": true
}Usage
Read-only. Does not spend credits.
/api/v1/quotascurl -sS "https://wpaq.com/api/v1/quotas" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"plan": "pro",
"period": "2026-10",
"websites": { "used": 2, "limit": 10, "unlimited": false },
"scans": { "used": 4, "limit": 50, "unlimited": false },
"ai": { "used": 20, "limit": 200, "remaining": 180 }
}/api/v1/ai/usagewebsite_id scopes the calendar and recent events. The balance stays account-wide. Unknown website is 404. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS "https://wpaq.com/api/v1/ai/usage" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"remaining": 180,
"used": 20,
"limit": 200,
"plan": "pro",
"period": "2026-10",
"total_events": 2,
"events": [
{
"created_at": "2026-10-31T18:05:00Z",
"credits": 10,
"label": "Example credit event"
}
],
"days": []
}History
/api/v1/historytype (scan, visibility, convert, quality), website_id, limit (1–200, default 20), offset. Unknown website is 404. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS "https://wpaq.com/api/v1/history?type=scan&website_id=$WEBSITE_ID&limit=20" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"items": [
{
"id": "b5659908-1c0a-4e2a-9f10-0a1b2c3d4e5f",
"type": "scan",
"website_id": "web-a1b20000-0000-4000-8000-000000000050",
"hostname": "example.com",
"url": "https://example.com/",
"status": "completed",
"overall_score": 91,
"created_at": "2026-10-31T18:00:00Z",
"completed_at": "2026-10-31T18:02:14Z",
"pages_scanned": 12
}
],
"total": 1,
"limit": 20,
"offset": 0
}Exports
The file uses the same generator as the dashboard. Business white-label branding is applied on the Site Audit PDF.
PDF is available on any account. Excel, Markdown, and CSV are Pro and Business. An API key is already one of those plans. Site Audit export waits until the run is completed or completed_with_warnings (otherwise 409). The other three wait until completed (otherwise 400). Another account's audit is 404.
| Audit | Paths | Content type |
|---|---|---|
| Site Audit | GET /api/v1/site-audits/{id}/export.pdf.xlsx .md .csv | PDF, Excel, Markdown, or CSV |
| AI Visibility | GET /api/v1/ai-visibility-audits/{id}/export.pdf.xlsx .md | PDF, Excel, or Markdown |
| Conversion | GET /api/v1/conversion-audits/{id}/export.pdf.xlsx .md | PDF, Excel, or Markdown |
| Content Quality | GET /api/v1/quality-audits/{id}/export.pdf.xlsx .md | PDF, Excel, or Markdown |
curl -sS -D - -o example.md "https://wpaq.com/api/v1/site-audits/$AUDIT_ID/export.md" \
-H "Authorization: Bearer $WPAQ_API_KEY"The body is the file. Content-Disposition carries the filename. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.
Webhooks
Business only. The signing secret is shown once.
Same public HTTPS rule as the dashboard. Private and loopback addresses are rejected. Delivery is one POST with an 8 second timeout and no retry. Event names and the payload are on the Webhooks page.
/api/v1/webhooksurl and optional events. Omitted events default to ["scan.completed"]. Errors: 400, 403 on Pro. Also 401 (bad key) and 403 (account is not Pro or Business). See Errors.curl -sS -X POST "https://wpaq.com/api/v1/webhooks" \
-H "Authorization: Bearer $WPAQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/wpaq","events":["scan.completed","visibility.completed"]}'{
"id": "hook_example",
"url": "https://example.com/hooks/wpaq",
"secret": "shown-once",
"events": ["scan.completed", "visibility.completed"],
"message": "Store this secret securely; it is shown once."
}/api/v1/webhookscurl -sS "https://wpaq.com/api/v1/webhooks" \
-H "Authorization: Bearer $WPAQ_API_KEY"{
"items": [
{
"id": "hook_example",
"url": "https://example.com/hooks/wpaq",
"events": ["scan.completed"],
"enabled": true
}
]
}/api/v1/webhooks/{id}/testcurl -sS -X POST "https://wpaq.com/api/v1/webhooks/$HOOK_ID/test" \
-H "Authorization: Bearer $WPAQ_API_KEY"{ "ok": true, "event": "scan.completed" }/api/v1/webhooks/{id}curl -sS -X DELETE "https://wpaq.com/api/v1/webhooks/$HOOK_ID" \
-H "Authorization: Bearer $WPAQ_API_KEY"{ "ok": true }Not in this API
- Screenshot files
- Per-finding AI explanations and Conversion visual mockups
- Compare, re-audit, score history, monitoring, and page exclusions
- Slack, team, branding settings, key management, and billing
Those stay on the signed-in dashboard. A Bearer token on a session-only route is 401.
GitHub Action
The public Action starts a Site Audit and polls it.
- uses: KushalAzza/wpaq-public/actions/scan@v1
with:
api-key: ${{ secrets.WPAQ_API_KEY }}
url: https://example.com
min-score: "70"Source: KushalAzza/wpaq-public/actions/scan. It only starts a Site Audit.