Page Lookout API
The Page Lookout API lets your own systems - a CI job, a script, a back office - start scans of your organization's sites and read what they found, with an API key instead of a person's sign-in. Webhooks work the other way round: Page Lookout sends a signed request to your own HTTPS endpoint whenever a scan finishes.
- Getting started - create a key, find your ids, start a scan and read its
findings with three
curlcalls; pagination. - Errors and limits - the error body, every
details.reasonan API key can receive, rate limits, and replacing a key. - Webhooks - the events, their headers, verifying the signature (Node.js and Python), retries and switching off, rotating the signing secret.
- Versioning - what a version number promises, and how a breaking change is announced.
- Changelog - every published version of the API contract.
- API reference - every operation below, its parameters and its responses, and the
two webhook events, generated from the service's own schemas. The machine-readable OpenAPI 3.1
document is published next to it as
openapi.json, and the API serves the same document atGET /openapi.jsonon your API base URL - no key needed.
What an API key can do
An organization admin creates keys on the Integrations screen of the dashboard. A key belongs
to one organization and holds one or more scopes; each operation needs one of the scopes listed
for it. Scopes are independent: scans:write does not include scans:read.
| Operation | Request | Scope |
|---|---|---|
| listDomains | GET /organizations/{organizationId}/domains | scans:read |
| readDomain | GET /organizations/{organizationId}/domains/{domainId} | scans:read |
| readDomainConsentInventory | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory | scans:read |
| listDomainConsentInventoryTrackers | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory/trackers | scans:read |
| listDomainConsentInventoryCookies | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory/cookies | scans:read |
| listDomainConsentInventoryStorageKeys | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory/storage-keys | scans:read |
| exportDomainConsentInventoryTrackers | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory/trackers.csv | scans:read |
| exportDomainConsentInventoryCookies | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory/cookies.csv | scans:read |
| exportDomainConsentInventoryStorageKeys | GET /organizations/{organizationId}/domains/{domainId}/consent-inventory/storage-keys.csv | scans:read |
| listOrganizationConsentInventoryTrackers | GET /organizations/{organizationId}/consent-inventory/trackers | scans:read |
| listOrganizationConsentInventoryCookies | GET /organizations/{organizationId}/consent-inventory/cookies | scans:read |
| exportOrganizationConsentInventoryTrackers | GET /organizations/{organizationId}/consent-inventory/trackers.csv | scans:read |
| exportOrganizationConsentInventoryCookies | GET /organizations/{organizationId}/consent-inventory/cookies.csv | scans:read |
| listOrganizationConsentInventoryTrackerSites | GET /organizations/{organizationId}/consent-inventory/trackers/sites | scans:read |
| listOrganizationConsentInventoryCookieSites | GET /organizations/{organizationId}/consent-inventory/cookies/sites | scans:read |
| exportOrganizationConsentInventoryTrackerSites | GET /organizations/{organizationId}/consent-inventory/trackers/sites.csv | scans:read |
| exportOrganizationConsentInventoryCookieSites | GET /organizations/{organizationId}/consent-inventory/cookies/sites.csv | scans:read |
| listScanRunConsentSignals | GET /organizations/{organizationId}/scans/{scanRunId}/consent-signals | scans:read |
| exportScanRunConsentSignals | GET /organizations/{organizationId}/scans/{scanRunId}/consent-signals.csv | scans:read |
| readConsentApprovals | GET /organizations/{organizationId}/consent-approvals | scans:read |
| listApprovedTrackers | GET /organizations/{organizationId}/consent-approvals/trackers | scans:read |
| readDomainConsentApprovalsEffective | GET /organizations/{organizationId}/domains/{domainId}/consent-approvals/effective | scans:read |
| listOrganizationConsentClassifications | GET /organizations/{organizationId}/consent-classifications | scans:read |
| readOrganizationConsentClassification | GET /organizations/{organizationId}/consent-classifications/{entryId} | scans:read |
| readDomainConsentClassificationsEffective | GET /organizations/{organizationId}/domains/{domainId}/consent-classifications/effective | scans:read |
| createScanRun | POST /organizations/{organizationId}/domains/{domainId}/scans | scans:write |
| listDomainScanRuns | GET /organizations/{organizationId}/domains/{domainId}/scans | scans:read |
| listScanRuns | GET /organizations/{organizationId}/scans | scans:read |
| readScanRun | GET /organizations/{organizationId}/scans/{scanRunId} | scans:read |
| listScanTasks | GET /organizations/{organizationId}/scans/{scanRunId}/tasks | scans:read |
| readScanRunComparison | GET /organizations/{organizationId}/scans/{scanRunId}/comparison | scans:read |
| listScanRunFindings | GET /organizations/{organizationId}/scans/{scanRunId}/findings | findings:read |
| listScanRunClosedFindings | GET /organizations/{organizationId}/scans/{scanRunId}/comparison/closed-findings | findings:read |
| listDomainFindings | GET /organizations/{organizationId}/domains/{domainId}/findings | findings:read |
| listDomainIssues | GET /organizations/{organizationId}/domains/{domainId}/issues | findings:read |
| listDomainIssuePages | GET /organizations/{organizationId}/domains/{domainId}/issues/{ruleId}/pages | findings:read |
| listOrganizationFindings | GET /organizations/{organizationId}/findings | findings:read |
| listOrganizationFindingRules | GET /organizations/{organizationId}/findings/rules | findings:read |
| readDashboardSummary | GET /organizations/{organizationId}/dashboard/summary | scans:read |
| readDashboardPortfolio | GET /organizations/{organizationId}/dashboard/portfolio | scans:read |
| readScanRunReportSnapshot | GET /organizations/{organizationId}/scans/{scanRunId}/report-snapshot | reports:read |
| listReportDocuments | GET /organizations/{organizationId}/report-documents | reports:read |
| readScanRunReportDocument | GET /organizations/{organizationId}/scans/{scanRunId}/report-document | reports:read |
| downloadScanRunReport | GET /organizations/{organizationId}/scans/{scanRunId}/report/download | reports:read |
| downloadArtifact | GET /organizations/{organizationId}/artifacts/{artifactId}/content | reports:read |
The paths call a site a domain: {domainId} is a site id. A key can call nothing else - not
the key management operations, not team, site, tag or webhook settings - and a request for another
organization's id answers 404, exactly as an id that names nothing. The two site operations return each site's tags (id, name and colour, by name); a key
reads them and cannot change them. downloadArtifact serves
report PDFs only. readScanRunReportSnapshot always returns a report.snapshot/1 document,
whatever the dashboard holds for that run; a newer snapshot format is announced in the
changelog before it reaches keys.
A key sees every site of its organization. If your organization limits what each member sees to their access groups, that limit applies to people signed in to the dashboard and not to API keys: a key reads every site and starts a scan of any of them, whoever created it. Only organization admins create keys, so give each key the scopes it needs and no more.
Conventions
- Base URL. Every path above is relative to your API base URL, shown on the Integrations
screen. The guides write it as
$PAGE_LOOKOUT_API_URL. - JSON. Requests and responses are JSON (
application/json), in UTF-8. Timestamps are ISO 8601 in UTC, ids are UUIDs. - Unknown fields. A response may gain fields in a minor version. Ignore the fields you do not know - see Versioning.
- Correlation ids. Every response carries an
x-correlation-idheader, and every error body the same value ascorrelationId. Send your own (1-128 characters ofA-Z a-z 0-9 . _ : -) to find a request in both systems; quote it when you contact support.