Site Audit
Read current website health, pages, categories, and findings for a project or location. Audit execution is scheduled by Signal; the public API does not start audits manually.
Your selection updates every endpoint path, path parameter, and example on this page.
GETGet Site Audit overview
project/projects/{project_id}/site_auditReturns the current score state, page and finding totals, blocking details, and latest audit status.
Get Site Audit overview
/projects/{project_id}/site_auditPath parameters
project_idproject UUID | project external IDProject identifier.
Response envelope
project_id:uuidsite_audit:SiteAuditOverviewproject_iduuidResolved project identifier.
site_auditSiteAuditOverviewCurrent Site Audit state and totals.
SiteAuditOverview
score_resultobjectCurrent, refreshing, or unavailable score state.
blocking_detailsobject | nullPublic crawler-blocking diagnostics.
pagesobjectInventory and latest audit-status counts.
findingsobjectOpen finding counts by severity and category.
latest_stepobject | nullLatest scheduled Site Audit step and timing.
last_page_audited_atdatetime | nullLatest page audit completion time.
ScoreResult
statecurrent | refreshing | unavailableAvailability state for the score.
currentbooleanWhether the score represents the latest completed audit.
refreshingbooleanWhether a newer scheduled audit is processing.
reasonstring | nullReason a current score is unavailable, for example unreadable when the site returned no readable pages.
blocking_auditobject | nullAudit currently preventing a current score.
scoreScore | nullLatest available scope or page score.
Score
overall_scorenumberOverall score from 0 to 100. Broken pages score 0, and a critical finding caps the score at 40.
technical_scorenumberTechnical pillar score. 0 when the pillar was not measured.
content_scorenumberContent pillar score. 0 when the pillar was not measured.
category_scoresobjectScores keyed by normalized category. A category is null when it could not be measured, for example security without response headers, performance without speed data, content categories on non-HTML pages, or a category only broken pages reached.
score_capobject | nullPresent when a critical finding capped the score: max, codes[], reasons[].
pages_scoredinteger | nullPages included in the score.
pages_failedinteger | nullScored pages that were broken and scored 0.
provisionalbooleanTrue when too few pages were audited for the score to be stable.
confidencenumberShare of selected pages that were audited.
coveragenumberAudited page coverage when available.
issue_countsobjectFinding counts represented by the score.
deltasobjectChanges from the previous score.
score_versionstringScoring version, currently "8". Scores from different versions are not directly comparable.
check_versionstringSite Audit check-set version.
scored_atdatetimeTime the score was calculated.
BlockingAudit
statusstringBlocking audit status.
pagespeed_statusstring | nullPageSpeed collection status.
error_codestring | nullStable audit failure code, for example site_unreadable when no page could be read.
completed_atdatetime | nullAudit completion time.
created_atdatetimeAudit creation time.
BlockingDetails
codestring | nullFinding code, for example audit_request_challenged when only the direct request was blocked and the audit still completed.
providerstringDetected blocking provider.
titlestringPublic blocking summary.
descriptionstringPublic explanation of the block.
recommendationstringRecommended remediation.
http_statusinteger | nullObserved HTTP status.
diagnosticobject | nullSanitized provider diagnostic.
allowlist_ipsstring[]Signal crawler IPs to allow.
affected_urlURL | nullSanitized blocked URL.
last_seen_atdatetime | nullMost recent blocking observation.
OverviewPages
totalintegerAll known pages.
activeintegerPages in the active inventory.
removedintegerPages removed from the active inventory.
by_discovery_sourceobjectActive page counts keyed by discovery source.
latest_audit_statusesobjectLatest page-run counts keyed by status.
FindingSummary
totalintegerTotal visible findings.
openintegerOpen visible findings.
by_statusobjectCounts keyed by finding status.
open_by_severityobjectOpen counts keyed by severity.
open_by_categoryobjectOpen counts keyed by normalized category.
open_issuesintegerDistinct open issues (one per check code).
open_issues_by_severityobjectDistinct open issues keyed by severity.
LatestStep
statusstringScheduled Site Audit step status.
started_atdatetime | nullStep start time.
completed_atdatetime | nullStep completion time.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"site_audit": {
"score_result": {
"state": "current",
"current": true,
"refreshing": false,
"reason": null,
"blocking_audit": null,
"score": {
"overall_score": 86.4,
"technical_score": 90.2,
"content_score": 83.3,
"category_scores": {
"performance": 78.0,
"crawlability": 94.0,
"security": 96.0,
"structured_data": 82.0,
"content_quality": 81.0,
"content_structure": 88.0,
"meta_onpage": 91.0,
"aeo_readiness": 76.0
},
"score_cap": null,
"confidence": 0.96,
"coverage": 1.0,
"pages_scored": 42,
"pages_failed": 0,
"provisional": false,
"issue_counts": {"critical": 0, "high": 2, "medium": 5},
"deltas": {"overall_score": 2.1},
"score_version": "8",
"check_version": "site-audit-checks-4",
"scored_at": "2026-08-09T09:30:00Z"
}
},
"blocking_details": null,
"pages": {
"total": 42,
"active": 42,
"removed": 0,
"by_discovery_source": {"sitemap": 42},
"latest_audit_statuses": {"succeeded": 42}
},
"findings": {
"total": 18,
"open": 7,
"by_status": {"open": 7, "resolved": 11},
"open_by_severity": {"high": 2, "medium": 5},
"open_issues": 4,
"open_issues_by_severity": {"high": 1, "medium": 3},
"open_by_category": {"meta_onpage": 3, "crawlability": 4}
},
"latest_step": {
"status": "succeeded",
"started_at": "2026-08-09T09:25:00Z",
"completed_at": "2026-08-09T09:31:00Z"
},
"last_page_audited_at": "2026-08-09T09:30:45Z"
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422visibility_unavailableProject-level visibility is unavailable for this project.
429rate_limit_exceededToo many requests were made.
GETGet Site Audit categories
project/projects/{project_id}/site_audit/categoriesReturns current category scores and the metrics shown in the Site Audit technical and content views.
Get Site Audit categories
/projects/{project_id}/site_audit/categoriesPath parameters
project_idproject UUID | project external IDProject identifier.
Response body
project_id:uuidstate:stringcurrent:booleanrefreshing:booleancategories:object | nullcategory_metrics:objectblocking_audit:object | nullscore_version:string | nullcheck_version:string | nullproject_iduuidResolved project identifier.
statestringCurrent score state.
currentbooleanWhether scores represent the latest completed audit.
refreshingbooleanWhether a newer scheduled audit is processing.
categoriesobject | nullScore keyed by Site Audit category. A category is null when it could not be measured.
category_metricsobjectMetrics and sections keyed by category.
blocking_auditobject | nullAudit currently refreshing or blocking scoring.
score_versionstring | nullScoring version, currently "8". Scores from different versions are not directly comparable.
check_versionstring | nullSite Audit check-set version.
CategoryMetrics
generated_atdatetime | nullMetric generation time.
total_pagesintegerPages represented by these metrics.
categoriesobject<string, CategoryMetric>Metrics keyed by normalized Site Audit category.
CategoryMetric
scorenumber | nullCategory score.
issue_countintegerFindings in this category.
affected_pagesintegerDistinct affected pages.
severity_countsobjectFinding counts keyed by severity.
metricsMetric[]Category-specific headline metrics.
sectionsobject[]Category-specific detail sections.
Metric
keystringStable metric key.
labelstringDisplay label.
valuenumber | string | nullMetric value.
suffixstring | nullOptional display suffix.
tonestring | nullOptional display tone.
BlockingAudit
statusstringBlocking audit status.
pagespeed_statusstring | nullPageSpeed collection status.
error_codestring | nullStable audit failure code, for example site_unreadable when no page could be read.
completed_atdatetime | nullAudit completion time.
created_atdatetimeAudit creation time.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/categories' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"state": "current",
"current": true,
"refreshing": false,
"categories": {"crawlability": 94.0, "content_quality": 81.0},
"category_metrics": {
"generated_at": "2026-08-09T09:30:00Z",
"total_pages": 42,
"categories": {
"crawlability": {
"score": 94.0,
"issue_count": 4,
"affected_pages": 3,
"severity_counts": {"medium": 4},
"metrics": [],
"sections": []
}
}
},
"score_version": "8",
"check_version": "site-audit-checks-4",
"blocking_audit": null
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422visibility_unavailableProject-level visibility is unavailable for this project.
429rate_limit_exceededToo many requests were made.
GETList Site Audit pages
project/projects/{project_id}/site_audit/pagesLists the current page inventory with score, latest run, and finding summaries.
List Site Audit pages
/projects/{project_id}/site_audit/pagesPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
pageinteger1-based page number.
per_pageintegerRecords per page. Maximum: 50.
qstringURL or path search. Maximum: 200 characters.
statusactive | removedInventory status filter.
discovery_sourceseed | sitemap | crawl | provider | manual | redirectDiscovery source filter.
audit_statuspending | running | succeeded | failedLatest page audit status.
sortlast_audited_at | url | score | issuesSort field.
directionasc | descSort direction.
Response envelope
project_id:uuidpages:Page[]pagination:Paginationproject_iduuidResolved project identifier.
pagesPage[]Matching audited pages.
paginationPaginationOffset pagination metadata.
Page
iduuidAudited page identifier.
urlURLSanitized page URL.
normalized_urlURLCanonical URL used to identify the page.
hoststringPage hostname.
pathstringPage path.
statusactive | removedInventory status.
discovery_sourceseed | sitemap | crawl | provider | manual | redirectHow Signal discovered the page.
first_discovered_atdatetimeTime Signal first discovered the page.
last_discovered_atdatetimeMost recent discovery time.
last_audited_atdatetime | nullMost recent completed audit time.
latest_runobject | nullLatest page audit status and public fetch details.
score_resultobjectCurrent page score state and score.
open_findingsobjectOpen finding total and severity counts.
LatestRun
statuspending | running | succeeded | failedPage audit status.
http_statusinteger | nullObserved HTTP status.
final_urlURL | nullSanitized final URL after redirects.
fetch_msinteger | nullOrigin fetch duration in milliseconds.
error_codestring | nullStable failure code.
error_messagestring | nullSafe public failure message.
completed_atdatetime | nullCompletion time.
ScoreResult
statecurrent | refreshing | unavailableAvailability state for the score.
currentbooleanWhether the score represents the latest completed audit.
refreshingbooleanWhether a newer scheduled audit is processing.
reasonstring | nullReason a current score is unavailable, for example unreadable when the site returned no readable pages.
blocking_auditobject | nullAudit currently preventing a current score.
scoreScore | nullLatest available scope or page score.
PageScore
overall_scorenumberPage score from 0 to 100.
category_scoresobjectPage scores keyed by normalized category. A category is null when it could not be measured, for example security without response headers, performance without speed data, or content categories on non-HTML pages.
issue_countsobjectPage finding counts represented by the score.
OpenFindings
totalintegerTotal open customer-visible findings.
by_severityobjectOpen counts keyed by severity.
Pagination
pageintegerCurrent 1-based page.
per_pageintegerRecords returned per page.
totalintegerTotal matching records.
total_pagesintegerTotal available pages.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/pages?page=1&per_page=20' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"pages": [{
"id": "eb67fc48-e109-42cc-bbeb-1b2b8042bd14",
"url": "https://example.com/",
"normalized_url": "https://example.com/",
"host": "example.com",
"path": "/",
"status": "active",
"discovery_source": "sitemap",
"first_discovered_at": "2026-07-01T10:00:00Z",
"last_discovered_at": "2026-08-09T09:20:00Z",
"last_audited_at": "2026-08-09T09:30:00Z",
"latest_run": {
"status": "succeeded",
"http_status": 200,
"final_url": "https://example.com/",
"fetch_ms": 218,
"error_code": null,
"error_message": null,
"completed_at": "2026-08-09T09:30:00Z"
},
"score_result": {
"state": "current",
"current": true,
"refreshing": false,
"reason": null,
"blocking_audit": null,
"score": {
"overall_score": 92.0,
"category_scores": {"crawlability": 96.0, "meta_onpage": 88.0},
"issue_counts": {"medium": 1}
}
},
"open_findings": {"total": 1, "by_severity": {"medium": 1}}
}],
"pagination": {"page": 1, "per_page": 20, "total": 42, "total_pages": 3}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_filterA filter value is not supported.
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422validation_failed | visibility_unavailableThe input is invalid or project-level visibility is unavailable.
429rate_limit_exceededToo many requests were made.
GETGet Site Audit page
project/projects/{project_id}/site_audit/pages/{page_id}Returns one page with its current score, latest audit, and open finding counts.
Get Site Audit page
/projects/{project_id}/site_audit/pages/{page_id}Path parameters
project_idproject UUID | project external IDProject identifier.
page_iduuidSite Audit page identifier.
Response envelope
project_id:uuidpage:Pageproject_iduuidResolved project identifier.
pagePageRequested audited page.
Page
iduuidAudited page identifier.
urlURLSanitized page URL.
normalized_urlURLCanonical URL used to identify the page.
hoststringPage hostname.
pathstringPage path.
statusactive | removedInventory status.
discovery_sourceseed | sitemap | crawl | provider | manual | redirectHow Signal discovered the page.
first_discovered_atdatetimeTime Signal first discovered the page.
last_discovered_atdatetimeMost recent discovery time.
last_audited_atdatetime | nullMost recent completed audit time.
latest_runobject | nullLatest page audit status and public fetch details.
score_resultobjectCurrent page score state and score.
open_findingsobjectOpen finding total and severity counts.
LatestRun
statuspending | running | succeeded | failedPage audit status.
http_statusinteger | nullObserved HTTP status.
final_urlURL | nullSanitized final URL after redirects.
fetch_msinteger | nullOrigin fetch duration in milliseconds.
error_codestring | nullStable failure code.
error_messagestring | nullSafe public failure message.
completed_atdatetime | nullCompletion time.
ScoreResult
statecurrent | refreshing | unavailableAvailability state for the score.
currentbooleanWhether the score represents the latest completed audit.
refreshingbooleanWhether a newer scheduled audit is processing.
reasonstring | nullReason a current score is unavailable, for example unreadable when the site returned no readable pages.
blocking_auditobject | nullAudit currently preventing a current score.
scoreScore | nullLatest available scope or page score.
PageScore
overall_scorenumberPage score from 0 to 100.
category_scoresobjectPage scores keyed by normalized category. A category is null when it could not be measured, for example security without response headers, performance without speed data, or content categories on non-HTML pages.
issue_countsobjectPage finding counts represented by the score.
OpenFindings
totalintegerTotal open customer-visible findings.
by_severityobjectOpen counts keyed by severity.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/pages/{page_id}' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"page": {
"id": "eb67fc48-e109-42cc-bbeb-1b2b8042bd14",
"url": "https://example.com/",
"normalized_url": "https://example.com/",
"host": "example.com",
"path": "/",
"status": "active",
"discovery_source": "sitemap",
"first_discovered_at": "2026-07-01T10:00:00Z",
"last_discovered_at": "2026-08-09T09:20:00Z",
"last_audited_at": "2026-08-09T09:30:00Z",
"latest_run": {
"status": "succeeded",
"http_status": 200,
"final_url": "https://example.com/",
"fetch_ms": 218,
"error_code": null,
"error_message": null,
"completed_at": "2026-08-09T09:30:00Z"
},
"score_result": {
"state": "current",
"current": true,
"refreshing": false,
"reason": null,
"blocking_audit": null,
"score": {
"overall_score": 92.0,
"category_scores": {"crawlability": 96.0, "meta_onpage": 88.0},
"issue_counts": {"medium": 1}
}
},
"open_findings": {"total": 1, "by_severity": {"medium": 1}}
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422visibility_unavailableProject-level visibility is unavailable for this project.
429rate_limit_exceededToo many requests were made.
GETList Site Audit findings
project/projects/{project_id}/site_audit/findingsLists individual findings or groups open findings by check when grouped=true.
List Site Audit findings
/projects/{project_id}/site_audit/findingsPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
pageinteger1-based page number.
per_pageintegerRecords per page. Maximum: 50.
groupedbooleanReturn open findings grouped by check. Grouped responses are not paginated.
limitintegerGrouped result limit from 1 to 20.
qstringFinding text search. Maximum: 200 characters.
statusopen | resolved | ignored | allStatus filter for individual findings.
severitycritical | high | medium | low | infoSeverity filter.
categorySiteAuditCategoryperformance, crawlability, security, structured_data, content_quality, content_structure, meta_onpage, or aeo_readiness. HTTP status and content-type findings are under crawlability.
areatechnical | contentFinding area filter.
page_iduuidReturn findings for one audited page.
Individual response envelope
project_id:uuidgrouped:falsefindings:Finding[]summary:objectpagination:Paginationproject_iduuidResolved project identifier.
groupedfalseIndicates an individual finding response.
findingsFinding[]Paginated matching findings.
summaryobjectScope-wide finding totals and status counts.
paginationPaginationOffset pagination metadata.
Grouped response envelope
project_id:uuidgrouped:truetruncated:booleangroups:FindingGroup[]project_iduuidResolved project identifier.
groupedtrueIndicates a grouped response.
truncatedbooleanWhether the grouped result was bounded before all matches were represented.
groupsFindingGroup[]Up to 20 groups: current issues before stale ones, then by impact_points, then severity.
Finding
iduuidFinding identifier.
codestringSite Audit check code. New codes may be added; retired codes stop being reported and their open findings resolve.
categorystringNormalized technical or content category.
severitycritical | high | medium | low | infoCurrent severity. A critical finding caps the overall score at 40; info findings do not affect the score.
statusopen | resolved | ignoredCurrent finding status.
target_kindstringType of resource affected by the finding.
targetstring | nullAffected page or target.
titlestringFinding title.
descriptionstring | nullObserved condition.
recommendationstring | nullRecommended remediation.
remediationRemediation | nullCopy-ready fix when one is available.
occurrencesintegerNumber of times the finding has been observed.
first_seen_atdatetimeTime the finding was first observed.
last_seen_atdatetimeMost recent observation time.
resolved_atdatetime | nullTime the finding resolved.
Remediation
fieldstringPage field to change.
beforestring | nullCurrent value.
afterstringProposed value.
snippetstringCopy-ready HTML or JSON-LD.
rationalestring | nullReason for the proposed change.
FindingGroup
codestringShared Site Audit check code.
titlestringGroup title. Generic when the affected pages have different details.
descriptionstring | nullShared description, or null when the affected pages differ.
why_it_mattersstring | nullShort explanation of why the issue matters.
recommendationstring | nullRepresentative recommendation.
severitycritical | high | medium | low | infoHighest severity in the group.
impact_pointsnumber | nullEstimated score points gained by fixing the issue.
templatebooleanWhether the issue appears on most audited pages, which usually means a shared template.
stalebooleanWhether the issue was not re-checked in the latest audit.
categorySiteAuditCategoryNormalized category.
pillartechnical | contentTop-level Site Audit area.
occurrencesintegerOccurrences represented by the bounded result set.
affected_pagesintegerDistinct affected pages represented by the result set. Site-wide findings are not counted as pages.
findings_countintegerMatching findings represented by the result set.
findings_truncatedbooleanWhether the findings array is incomplete.
findingsFinding[]Up to 50 matching findings.
FindingSummary
totalintegerTotal visible findings.
openintegerOpen visible findings.
by_statusobjectCounts keyed by finding status.
open_by_severityobjectOpen counts keyed by severity.
open_by_categoryobjectOpen counts keyed by normalized category.
open_issuesintegerDistinct open issues (one per check code).
open_issues_by_severityobjectDistinct open issues keyed by severity.
Pagination
pageintegerCurrent 1-based page.
per_pageintegerRecords returned per page.
totalintegerTotal matching records.
total_pagesintegerTotal available pages.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/findings?grouped=true&severity=high' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"grouped": true,
"truncated": false,
"groups": [{
"code": "missing_title",
"title": "Missing title",
"description": "The page does not define a title.",
"why_it_matters": "The title is often the first thing search and AI tools show for a page.",
"recommendation": "Add a concise, descriptive title.",
"severity": "high",
"impact_points": 2.4,
"template": false,
"stale": false,
"category": "meta_onpage",
"pillar": "content",
"occurrences": 1,
"affected_pages": 1,
"findings_count": 1,
"findings_truncated": false,
"findings": [{
"id": "3c77a8fa-d0ea-49f6-a49e-a6ae23e33ef3",
"code": "missing_title",
"category": "meta_onpage",
"severity": "high",
"status": "open",
"target_kind": "page",
"target": "https://example.com/about",
"title": "Missing title",
"description": "The page does not define a title.",
"recommendation": "Add a concise, descriptive title.",
"occurrences": 1,
"first_seen_at": "2026-08-01T10:00:00Z",
"last_seen_at": "2026-08-09T09:30:00Z",
"resolved_at": null
}]
}]
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_filterA filter value is not supported.
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422validation_failed | visibility_unavailableThe input is invalid or project-level visibility is unavailable.
429rate_limit_exceededToo many requests were made.
GETGet Site Audit finding
project/projects/{project_id}/site_audit/findings/{finding_id}Returns one finding and up to 100 recent observations.
Get Site Audit finding
/projects/{project_id}/site_audit/findings/{finding_id}Path parameters
project_idproject UUID | project external IDProject identifier.
finding_iduuidSite Audit finding identifier.
Response envelope
project_id:uuidfinding:FindingDetailobservations:Observation[]project_iduuidResolved project identifier.
findingFindingDetailRequested finding.
observationsObservation[]Up to 100 observations, newest first.
FindingDetail
iduuidFinding identifier.
codestringSite Audit check code. New codes may be added; retired codes stop being reported and their open findings resolve.
categorystringNormalized technical or content category.
severitycritical | high | medium | low | infoCurrent severity. A critical finding caps the overall score at 40; info findings do not affect the score.
statusopen | resolved | ignoredCurrent finding status.
target_kindstringType of resource affected by the finding.
targetstring | nullAffected page or target.
titlestringFinding title.
descriptionstring | nullObserved condition.
recommendationstring | nullRecommended remediation.
remediationRemediation | nullCopy-ready fix when one is available.
occurrencesintegerNumber of times the finding has been observed.
first_seen_atdatetimeTime the finding was first observed.
last_seen_atdatetimeMost recent observation time.
resolved_atdatetime | nullTime the finding resolved.
evidenceobjectSanitized evidence supporting the finding.
Remediation
fieldstringPage field to change.
beforestring | nullCurrent value.
afterstringProposed value.
snippetstringCopy-ready HTML or JSON-LD.
rationalestring | nullReason for the proposed change.
Observation
outcomedetected | resolvedFinding state during this observation.
severitycritical | high | medium | low | infoObserved severity.
evidenceobjectSanitized evidence captured during this observation.
observed_atdatetimeObservation time.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/findings/{finding_id}' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"finding": {
"id": "3c77a8fa-d0ea-49f6-a49e-a6ae23e33ef3",
"code": "missing_title",
"category": "meta_onpage",
"severity": "high",
"status": "open",
"target_kind": "page",
"target": "https://example.com/about",
"title": "Missing title",
"description": "The page does not define a title.",
"recommendation": "Add a concise, descriptive title.",
"remediation": {
"field": "title",
"before": null,
"after": "About Acme",
"snippet": "<title>About Acme</title>",
"rationale": "Describes the page."
},
"evidence": {},
"occurrences": 2,
"first_seen_at": "2026-08-01T10:00:00Z",
"last_seen_at": "2026-08-09T09:30:00Z",
"resolved_at": null
},
"observations": []
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422visibility_unavailableProject-level visibility is unavailable for this project.
429rate_limit_exceededToo many requests were made.
GETGet Site Audit settings
project/projects/{project_id}/site_audit/settingsReturns sitemap and crawl-discovery settings.
Get Site Audit settings
/projects/{project_id}/site_audit/settingsPath parameters
project_idproject UUID | project external IDProject identifier.
Response envelope
project_id:uuidsettings:SiteAuditSettingsproject_iduuidResolved project identifier.
settingsSiteAuditSettingsCurrent discovery settings.
SiteAuditSettings
sitemap_urlsURL[]Up to 20 sitemap URLs on the audited website host.
crawl_include_patternsstring[]Path patterns included during crawl discovery.
crawl_exclude_patternsstring[]Path patterns excluded during crawl discovery.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/settings' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}"{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"settings": {
"sitemap_urls": ["https://example.com/sitemap.xml"],
"crawl_include_patterns": ["/docs/*"],
"crawl_exclude_patterns": ["/private/*"]
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailableThe key lacks access or Site Audit is disabled.
404not_foundThe scope or requested Site Audit resource was not found.
422visibility_unavailableProject-level visibility is unavailable for this project.
429rate_limit_exceededToo many requests were made.
PATCHUpdate Site Audit settings
project/projects/{project_id}/site_audit/settingsUpdates sitemap and crawl patterns without starting an audit or inventory synchronization.
Update Site Audit settings
/projects/{project_id}/site_audit/settingsPath parameters
project_idproject UUID | project external IDProject identifier.
JSON body
sitemap_urlsURL[]Up to 20 sitemap URLs on the audited website host.
crawl_include_patternsstring[]Path patterns included during crawl discovery.
crawl_exclude_patternsstring[]Path patterns excluded during crawl discovery.
Response envelope
project_id:uuidsettings:SiteAuditSettingsproject_iduuidResolved project identifier.
settingsSiteAuditSettingsUpdated discovery settings.
SiteAuditSettings
sitemap_urlsURL[]Up to 20 sitemap URLs on the audited website host.
crawl_include_patternsstring[]Path patterns included during crawl discovery.
crawl_exclude_patternsstring[]Path patterns excluded during crawl discovery.
Request and response
curl --request PATCH \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/site_audit/settings' \
--header "Authorization: Bearer ${SIGNAL_API_KEY}" \
--header 'Content-Type: application/json' \
--data '{"sitemap_urls":["https://example.com/sitemap.xml"],"crawl_exclude_patterns":["/private/*"]}'{
"project_id": "7c51e5f2-0bad-4e09-82de-fc876c81f531",
"settings": {
"sitemap_urls": ["https://example.com/sitemap.xml"],
"crawl_include_patterns": ["/docs/*"],
"crawl_exclude_patterns": ["/private/*"]
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
401invalid_api_keyThe API key is absent or invalid.
403forbidden | site_audit_unavailable | superadmin_managedThe key lacks access, Site Audit is disabled, or writes are centrally managed.
404not_foundThe scope or requested Site Audit resource was not found.
422validation_failed | visibility_unavailableThe input is invalid or project-level visibility is unavailable.
429rate_limit_exceededToo many requests were made.