{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"AI-Primed Remediation API","version":"1.0.0","description":"Account-scoped website audits and saved remediation drafts. API access is included in Pro, Team and Agency; the standalone API + Reports package is $79/month or $790/year — a developer entry point with API-origin dashboard reports/fix drafts, 5 active Sites and one user, no monitoring, extra seats or hosted injection, and no automatic overages. Read-only requests never crawl and are metered separately from audit submissions. Scheduled monitoring never draws on the API allowance. Results are technical observations, not guarantees of mentions. Deployed scheduled processing remains unverified; signed webhook activation and deployed receiver verification remain pending.","contact":{"url":"https://ai-primed.com/contact"}},"externalDocs":{"description":"Runnable JSON, curl, Python, JavaScript and local webhook verification examples","url":"https://ai-primed.com/docs/api"},"servers":[{"url":"https://ai-primed.com/api/public/v1"}],"security":[{"bearerKey":[]}],"tags":[{"name":"Audits","description":"Submit and retrieve account-owned observations."},{"name":"Scores","description":"Read saved scores without fetching websites."},{"name":"Specification","description":"Unauthenticated machine-readable reference."}],"x-account-allowances":{"api":{"requestsMonthly":5000,"auditsMonthly":1500,"auditsDaily":50,"requestsMinute":30,"auditsMinute":2,"concurrent":2},"team":{"requestsMonthly":25000,"auditsMonthly":2000,"auditsDaily":100,"requestsMinute":60,"auditsMinute":2,"concurrent":4},"agency":{"requestsMonthly":100000,"auditsMonthly":5000,"auditsDaily":250,"requestsMinute":120,"auditsMinute":4,"concurrent":8}},"paths":{"/audits":{"post":{"tags":["Audits"],"operationId":"createAudit","summary":"Queue one audit and generate saved fix drafts","description":"Requires write scope. JSON body at most 4096 bytes. Only a public hostname, not a URL, IP, credentials, path or bulk list. Reserves an active site slot atomically; does not consume competitor slots. Accepted attempts consume audit allowance even if fetching fails. Jobs are intended to wake approximately every minute; deployed scheduling is unverified. Use Retry-After and bounded polling; repeated POSTs may create new audits. No idempotency-key support.","x-required-key-scope":"write","x-max-body-bytes":4096,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditRequest"},"example":{"domain":"ai-primed.com"}}}},"responses":{"202":{"description":"Accepted and queued; persistent ID, not a completed score.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"Location":{"description":"Relative path to retrieve this audit.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before another attempt. Respect this value; do not retry POST automatically.","schema":{"const":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"},"example":{"id":"10000000-0000-4000-8000-000000000001","domain":"ai-primed.com","status":"queued","result_url":"/api/public/v1/audits/10000000-0000-4000-8000-000000000001"}}}},"400":{"description":"400: invalid_request, not_auditable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"error":{"code":"invalid_request","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}},"not_auditable":{"value":{"error":{"code":"not_auditable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"401":{"description":"401: unauthorized. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"error":{"code":"unauthorized","message":"Invalid or revoked API key.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"403":{"description":"403: forbidden, plan_required. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"error":{"code":"forbidden","message":"This key cannot create audits.","request_id":"30000000-0000-4000-8000-000000000003"}}},"plan_required":{"value":{"error":{"code":"plan_required","message":"API access requires Pro, Team, Agency or API + Reports.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"409":{"description":"409: site_limit, site_unavailable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"site_limit":{"value":{"error":{"code":"site_limit","message":"Site allowance reached. Archive a site or upgrade before adding another.","request_id":"30000000-0000-4000-8000-000000000003"}}},"site_unavailable":{"value":{"error":{"code":"site_unavailable","message":"This site is archived or is a competitor. Submit an active site instead.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"413":{"description":"413: body_too_large. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"body_too_large":{"value":{"error":{"code":"body_too_large","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"415":{"description":"415: unsupported_media_type. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unsupported_media_type":{"value":{"error":{"code":"unsupported_media_type","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"429":{"description":"429: rate_limited, monthly_limit, audit_minute_limit, audit_daily_limit, audit_monthly_limit, concurrency_limit. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before another attempt. Respect this value; do not retry POST automatically.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"value":{"error":{"code":"rate_limited","message":"Request rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"monthly_limit":{"value":{"error":{"code":"monthly_limit","message":"Monthly request allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_minute_limit":{"value":{"error":{"code":"audit_minute_limit","message":"Audit submission rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_daily_limit":{"value":{"error":{"code":"audit_daily_limit","message":"Daily audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_monthly_limit":{"value":{"error":{"code":"audit_monthly_limit","message":"Monthly audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"concurrency_limit":{"value":{"error":{"code":"concurrency_limit","message":"An audit is already queued or running. Wait for completion.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"503":{"description":"503: service_unavailable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"value":{"error":{"code":"service_unavailable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}}}}},"/audits/{id}":{"get":{"tags":["Audits"],"operationId":"getAudit","summary":"Retrieve an account-owned technical export","x-required-key-scope":"read or write","parameters":[{"name":"id","in":"path","required":true,"description":"Persistent audit UUID returned on submission.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Saved account-scoped observation. Failed or unscorable observations still return 200 with null score and grade.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"X-Audit-Error":{"description":"Present when audit.status is failed.","schema":{"const":"audit_failed"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditExport"},"example":{"schema":"agentready.audit/v1","exported_at":"2026-10-20T22:00:00Z","audit":{"id":"10000000-0000-4000-8000-000000000001","domain":"ai-primed.com","status":"queued","score":null,"grade":null,"started_at":"2026-10-20T22:00:00Z","completed_at":null,"scoring_mode":{"siteType":"content_site","detectedType":"content_site","overridden":false},"category_scores":{}},"findings":[],"fixes":[],"fetch_log":[],"raw_signals":{}}}}},"400":{"description":"400: invalid_request, not_auditable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"error":{"code":"invalid_request","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}},"not_auditable":{"value":{"error":{"code":"not_auditable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"401":{"description":"401: unauthorized. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"error":{"code":"unauthorized","message":"Invalid or revoked API key.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"403":{"description":"403: forbidden, plan_required. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"error":{"code":"forbidden","message":"This key cannot create audits.","request_id":"30000000-0000-4000-8000-000000000003"}}},"plan_required":{"value":{"error":{"code":"plan_required","message":"API access requires Pro, Team, Agency or API + Reports.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"404":{"description":"404: not_found. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"error":{"code":"not_found","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"429":{"description":"429: rate_limited, monthly_limit, audit_minute_limit, audit_daily_limit, audit_monthly_limit, concurrency_limit. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before another attempt. Respect this value; do not retry POST automatically.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"value":{"error":{"code":"rate_limited","message":"Request rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"monthly_limit":{"value":{"error":{"code":"monthly_limit","message":"Monthly request allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_minute_limit":{"value":{"error":{"code":"audit_minute_limit","message":"Audit submission rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_daily_limit":{"value":{"error":{"code":"audit_daily_limit","message":"Daily audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_monthly_limit":{"value":{"error":{"code":"audit_monthly_limit","message":"Monthly audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"concurrency_limit":{"value":{"error":{"code":"concurrency_limit","message":"An audit is already queued or running. Wait for completion.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"503":{"description":"503: service_unavailable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"value":{"error":{"code":"service_unavailable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}}}}},"/audits/{id}/fixes":{"get":{"tags":["Audits"],"operationId":"getFixes","summary":"Retrieve the same export including saved fix drafts","description":"Does not generate, apply or verify fixes. API-created audits save drafts during processing; older audits may have no saved fixes.","x-required-key-scope":"read or write","parameters":[{"name":"id","in":"path","required":true,"description":"Persistent audit UUID returned on submission.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Saved account-scoped observation. Failed or unscorable observations still return 200 with null score and grade.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"X-Audit-Error":{"description":"Present when audit.status is failed.","schema":{"const":"audit_failed"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditExport"},"example":{"schema":"agentready.audit/v1","exported_at":"2026-10-20T22:00:00Z","audit":{"id":"10000000-0000-4000-8000-000000000001","domain":"ai-primed.com","status":"queued","score":null,"grade":null,"started_at":"2026-10-20T22:00:00Z","completed_at":null,"scoring_mode":{"siteType":"content_site","detectedType":"content_site","overridden":false},"category_scores":{}},"findings":[],"fixes":[],"fetch_log":[],"raw_signals":{}}}}},"400":{"description":"400: invalid_request, not_auditable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"error":{"code":"invalid_request","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}},"not_auditable":{"value":{"error":{"code":"not_auditable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"401":{"description":"401: unauthorized. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"error":{"code":"unauthorized","message":"Invalid or revoked API key.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"403":{"description":"403: forbidden, plan_required. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"error":{"code":"forbidden","message":"This key cannot create audits.","request_id":"30000000-0000-4000-8000-000000000003"}}},"plan_required":{"value":{"error":{"code":"plan_required","message":"API access requires Pro, Team, Agency or API + Reports.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"404":{"description":"404: not_found. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"error":{"code":"not_found","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"429":{"description":"429: rate_limited, monthly_limit, audit_minute_limit, audit_daily_limit, audit_monthly_limit, concurrency_limit. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before another attempt. Respect this value; do not retry POST automatically.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"value":{"error":{"code":"rate_limited","message":"Request rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"monthly_limit":{"value":{"error":{"code":"monthly_limit","message":"Monthly request allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_minute_limit":{"value":{"error":{"code":"audit_minute_limit","message":"Audit submission rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_daily_limit":{"value":{"error":{"code":"audit_daily_limit","message":"Daily audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_monthly_limit":{"value":{"error":{"code":"audit_monthly_limit","message":"Monthly audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"concurrency_limit":{"value":{"error":{"code":"concurrency_limit","message":"An audit is already queued or running. Wait for completion.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"503":{"description":"503: service_unavailable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"value":{"error":{"code":"service_unavailable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}}}}},"/domains/{domain}/score":{"get":{"tags":["Scores"],"operationId":"getDomainScore","summary":"Read this account’s latest saved domain observation","description":"Never crawls. 404 when the account has no latest saved observation; null score is not zero.","x-required-key-scope":"read or write","parameters":[{"name":"domain","in":"path","required":true,"schema":{"$ref":"#/components/schemas/Domain"}}],"responses":{"200":{"description":"Saved account-scoped observation. Failed or unscorable observations still return 200 with null score and grade.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Score"},"example":{"domain":"ai-primed.com","audit_id":"10000000-0000-4000-8000-000000000001","score":null,"grade":null,"status":"failed","observed_at":"2026-10-20T22:00:00Z"}}}},"400":{"description":"400: invalid_request, not_auditable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"error":{"code":"invalid_request","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}},"not_auditable":{"value":{"error":{"code":"not_auditable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"401":{"description":"401: unauthorized. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"error":{"code":"unauthorized","message":"Invalid or revoked API key.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"403":{"description":"403: forbidden, plan_required. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"error":{"code":"forbidden","message":"This key cannot create audits.","request_id":"30000000-0000-4000-8000-000000000003"}}},"plan_required":{"value":{"error":{"code":"plan_required","message":"API access requires Pro, Team, Agency or API + Reports.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"404":{"description":"404: not_found. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"error":{"code":"not_found","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"429":{"description":"429: rate_limited, monthly_limit, audit_minute_limit, audit_daily_limit, audit_monthly_limit, concurrency_limit. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before another attempt. Respect this value; do not retry POST automatically.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"value":{"error":{"code":"rate_limited","message":"Request rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"monthly_limit":{"value":{"error":{"code":"monthly_limit","message":"Monthly request allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_minute_limit":{"value":{"error":{"code":"audit_minute_limit","message":"Audit submission rate exceeded.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_daily_limit":{"value":{"error":{"code":"audit_daily_limit","message":"Daily audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"audit_monthly_limit":{"value":{"error":{"code":"audit_monthly_limit","message":"Monthly audit submission allowance exhausted.","request_id":"30000000-0000-4000-8000-000000000003"}}},"concurrency_limit":{"value":{"error":{"code":"concurrency_limit","message":"An audit is already queued or running. Wait for completion.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}},"503":{"description":"503: service_unavailable. Unknown and other-account resources both return 404.","headers":{"Cache-Control":{"description":"Authenticated API responses are never cached.","schema":{"const":"no-store"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}},"X-Request-Id":{"description":"Support correlation ID; matches error.request_id on errors.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Request limit per minute. Present after successful request admission.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window, after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"UTC Unix reset seconds; a refusal may describe a daily/monthly or concurrency window instead.","schema":{"type":"integer"}},"X-RateLimit-Monthly-Remaining":{"description":"Shared account requests remaining in this UTC calendar month. Present after successful request admission.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"value":{"error":{"code":"service_unavailable","message":"See the error code and request ID.","request_id":"30000000-0000-4000-8000-000000000003"}}}}}}}}}},"/openapi.json":{"get":{"tags":["Specification"],"operationId":"getSpecification","summary":"Get this OpenAPI 3.1 specification","security":[],"responses":{"200":{"description":"No API key required. Does not consume API allowances.","headers":{"Cache-Control":{"schema":{"const":"public, max-age=300"}},"X-Content-Type-Options":{"schema":{"const":"nosniff"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}}},"webhooks":{"audit.completed":{"post":{"operationId":"receiveAuditCompleted","summary":"audit.completed — signed delivery, activation pending","description":"Signed delivery is implemented behind an isolated authenticated sender; sender deployment and receiver verification are pending, so configuration is not active yet. Public HTTPS port 443 only, numeric-IP connection pinning, peer and hostname certificate verification, no redirects, five-second total deadline, 64 KiB payload and 16 KiB response-header caps, at most five attempts, exponential backoff capped at one hour. Persist acceptance and deduplicate event IDs before 2xx. Key scope is not webhook authentication; verify HMAC.","security":[],"x-delivery-enabled":false,"x-delivery-implemented":true,"parameters":[{"name":"X-AI-Primed-Id","in":"header","required":true,"description":"Event UUID; must match the signed body id. Deduplicate durably after verification.","schema":{"type":"string","format":"uuid"}},{"name":"X-AI-Primed-Timestamp","in":"header","required":true,"description":"Unix seconds at this delivery attempt. Reject timestamps more than 300 seconds away from your clock.","schema":{"type":"string","pattern":"^[0-9]{1,12}$"}},{"name":"X-AI-Primed-Signature","in":"header","required":true,"description":"sha256= + lowercase hex HMAC-SHA256(secret, UTF-8 timestamp + \".\" + exact raw request bytes). Constant-time comparison before parsing JSON.","schema":{"type":"string","pattern":"^sha256=[a-f0-9]{64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditCompletedEvent"},"example":{"id":"20000000-0000-4000-8000-000000000002","type":"audit.completed","created_at":"2026-10-20T22:00:00Z","data":{"audit_id":"10000000-0000-4000-8000-000000000001","domain":"ai-primed.com","score":null,"grade":null,"previous_score":null,"observed_at":"2026-10-20T22:00:00Z"}}}}},"responses":{"204":{"description":"Receiver durably accepted event, or already accepted this event ID."},"400":{"description":"Malformed verified payload."},"401":{"description":"Invalid signature or stale timestamp."},"500":{"description":"Could not durably accept; sender may retry."}}}},"score.changed":{"post":{"operationId":"receiveScoreChanged","summary":"score.changed — signed delivery, activation pending","description":"Signed delivery is implemented behind an isolated authenticated sender; sender deployment and receiver verification are pending, so configuration is not active yet. Public HTTPS port 443 only, numeric-IP connection pinning, peer and hostname certificate verification, no redirects, five-second total deadline, 64 KiB payload and 16 KiB response-header caps, at most five attempts, exponential backoff capped at one hour. Persist acceptance and deduplicate event IDs before 2xx. Key scope is not webhook authentication; verify HMAC.","security":[],"x-delivery-enabled":false,"x-delivery-implemented":true,"parameters":[{"name":"X-AI-Primed-Id","in":"header","required":true,"description":"Event UUID; must match the signed body id. Deduplicate durably after verification.","schema":{"type":"string","format":"uuid"}},{"name":"X-AI-Primed-Timestamp","in":"header","required":true,"description":"Unix seconds at this delivery attempt. Reject timestamps more than 300 seconds away from your clock.","schema":{"type":"string","pattern":"^[0-9]{1,12}$"}},{"name":"X-AI-Primed-Signature","in":"header","required":true,"description":"sha256= + lowercase hex HMAC-SHA256(secret, UTF-8 timestamp + \".\" + exact raw request bytes). Constant-time comparison before parsing JSON.","schema":{"type":"string","pattern":"^sha256=[a-f0-9]{64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreChangedEvent"}}}},"responses":{"204":{"description":"Receiver durably accepted event, or already accepted this event ID."},"400":{"description":"Malformed verified payload."},"401":{"description":"Invalid signature or stale timestamp."},"500":{"description":"Could not durably accept; sender may retry."}}}}},"components":{"securitySchemes":{"bearerKey":{"type":"http","scheme":"bearer","bearerFormat":"apr_ followed by 64 lowercase hexadecimal characters","description":"Named server-side key created in Settings → API. read scope permits GET; write permits GET and POST. Shown once, hashed at rest. Rotation/revocation immediately invalidates old keys. Never include keys in URLs, browser code or logs."}},"schemas":{"Domain":{"type":"string","minLength":3,"maxLength":253,"pattern":"^(?=.{1,253}$)([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z][a-z0-9-]{1,62}$","description":"ASCII hostname only. Input is trimmed and lowercased before validation; no scheme, port, path, credentials or IP literal. Safe-fetch checks may still reject it."},"AuditRequest":{"type":"object","additionalProperties":false,"required":["domain"],"properties":{"domain":{"$ref":"#/components/schemas/Domain"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id"],"properties":{"code":{"enum":["invalid_request","not_auditable","unauthorized","forbidden","plan_required","not_found","site_limit","site_unavailable","body_too_large","unsupported_media_type","rate_limited","monthly_limit","audit_minute_limit","audit_daily_limit","audit_monthly_limit","concurrency_limit","service_unavailable"]},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}},"Submission":{"type":"object","required":["id","domain","status","result_url"],"properties":{"id":{"type":"string","format":"uuid"},"domain":{"$ref":"#/components/schemas/Domain"},"status":{"const":"queued"},"result_url":{"type":"string","description":"Relative API result path."}}},"Category":{"type":"object","required":["score","weight","label"],"properties":{"score":{"type":"number","minimum":0,"maximum":100},"weight":{"type":"number","minimum":0,"maximum":100},"label":{"type":"string"}},"description":"Weight 0 means not applicable, even if the stored category score is numeric. Weights may be fractional."},"ScoringMode":{"type":"object","required":["siteType","detectedType","overridden"],"properties":{"siteType":{"enum":["online_store","content_site","local_business","saas"]},"detectedType":{"enum":["online_store","content_site","local_business","saas"]},"overridden":{"type":"boolean"},"previousScore":{"type":"number"},"previousType":{"type":"string"},"correctedScore":{"type":"number"}}},"Finding":{"type":"object","required":["id","category","severity","title","description","evidence","fix_type","resolved","position"],"properties":{"id":{"type":"string","format":"uuid"},"category":{"enum":["crawl","structured_data","commerce","readability","policy","entity"]},"severity":{"enum":["critical","high","medium","low"]},"title":{"type":"string"},"description":{"type":"string"},"evidence":{"type":"string"},"fix_type":{"type":"string"},"resolved":{"type":"boolean"},"position":{"type":"integer"}}},"Fix":{"type":"object","required":["id","finding_id","fix_type","title","explanation","filename","language","content","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"finding_id":{"type":["string","null"],"format":"uuid"},"fix_type":{"type":"string"},"title":{"type":"string"},"explanation":{"type":"string"},"filename":{"type":"string"},"language":{"type":"string"},"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"description":"Saved draft only. Filename is not an observed installation path. Fill placeholders with real data; no applied or verified status implied."},"FetchLogEntry":{"type":"object","required":["url","status","ok","note"],"properties":{"url":{"type":"string"},"status":{"type":["integer","null"]},"ok":{"type":"boolean"},"note":{"type":"string"}}},"Audit":{"type":"object","required":["id","domain","status","score","grade","started_at","completed_at","scoring_mode","category_scores"],"properties":{"id":{"type":"string","format":"uuid"},"domain":{"$ref":"#/components/schemas/Domain"},"status":{"enum":["queued","running","completed","failed"]},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"grade":{"enum":["A","B","C","D","F",null]},"started_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"scoring_mode":{"$ref":"#/components/schemas/ScoringMode"},"category_scores":{"type":"object","properties":{"crawl":{"$ref":"#/components/schemas/Category"},"structured_data":{"$ref":"#/components/schemas/Category"},"commerce":{"$ref":"#/components/schemas/Category"},"readability":{"$ref":"#/components/schemas/Category"},"policy":{"$ref":"#/components/schemas/Category"},"entity":{"$ref":"#/components/schemas/Category"}},"additionalProperties":false}},"description":"Score and grade are null, category_scores empty, unless completed and scorable. A completed result can still be unscorable; consult observed raw signals and fetch log."},"AuditExport":{"type":"object","required":["schema","exported_at","audit","findings","fixes","fetch_log","raw_signals"],"properties":{"schema":{"const":"agentready.audit/v1"},"exported_at":{"type":"string","format":"date-time"},"audit":{"$ref":"#/components/schemas/Audit"},"findings":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"fixes":{"type":"array","items":{"$ref":"#/components/schemas/Fix"}},"fetch_log":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FetchLogEntry"}},"raw_signals":{"type":["object","null"],"additionalProperties":true,"description":"Extensible observed technical signals, not a fixed field-by-field contract. No private account fields."}}},"Score":{"type":"object","required":["domain","audit_id","score","grade","status","observed_at"],"properties":{"domain":{"$ref":"#/components/schemas/Domain"},"audit_id":{"type":"string","format":"uuid"},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"grade":{"enum":["A","B","C","D","F",null]},"status":{"enum":["queued","running","completed","failed"]},"observed_at":{"type":["string","null"],"format":"date-time"}}},"WebhookEvent":{"type":"object","required":["id","type","created_at","data"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["audit.completed","score.changed"]},"created_at":{"type":"string","format":"date-time"},"data":{"type":"object","required":["audit_id","domain","score","grade","previous_score","observed_at"],"properties":{"audit_id":{"type":"string","format":"uuid"},"domain":{"$ref":"#/components/schemas/Domain"},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"grade":{"enum":["A","B","C","D","F",null]},"previous_score":{"type":["integer","null"],"minimum":0,"maximum":100},"observed_at":{"type":["string","null"],"format":"date-time"}}}},"description":"Implemented signed event contract; protected sender deployment and activation pending. No private account data or fix content. audit.completed means processing completed, not necessarily scored."},"AuditCompletedEvent":{"allOf":[{"$ref":"#/components/schemas/WebhookEvent"},{"type":"object","properties":{"type":{"const":"audit.completed"},"data":{"type":"object","properties":{"previous_score":{"type":"null"}}}}}]},"ScoreChangedEvent":{"allOf":[{"$ref":"#/components/schemas/WebhookEvent"},{"type":"object","properties":{"type":{"const":"score.changed"},"data":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"previous_score":{"type":"integer","minimum":0,"maximum":100}}}}}],"description":"Requires two different completed scored observations. Blocked, unreachable and transient failures do not create score-change events."}}}}