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.
GETGet Site Audit overview
/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.
blocking_auditobject | nullAudit currently preventing a current score.
scoreScore | nullLatest available scope or page score.
Score
overall_scorenumberOverall score from 0 to 100.
technical_scorenumberTechnical pillar score when available.
content_scorenumberContent pillar score when available.
category_scoresobjectScores keyed by normalized category.
confidencenumberScore confidence when available.
coveragenumberAudited page coverage when available.
issue_countsobjectFinding counts represented by the score.
deltasobjectChanges from the previous score.
score_versionstringScoring implementation version.
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.
completed_atdatetime | nullAudit completion time.
created_atdatetimeAudit creation time.
BlockingDetails
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.
user_agentstringSignal crawler user agent.
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.
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
},
"confidence": 0.96,
"coverage": 1.0,
"issue_counts": {"critical": 0, "high": 2, "medium": 5},
"deltas": {"overall_score": 2.1},
"score_version": "v1",
"check_version": "v1",
"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_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
/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.
category_metricsobjectMetrics and sections keyed by category.
blocking_auditobject | nullAudit currently refreshing or blocking scoring.
score_versionstring | nullScoring implementation version.
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.
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": "v1",
"check_version": "v1",
"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
/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 | manualDiscovery 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 | manualHow 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.
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.
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
/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 | manualHow 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.
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.
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
/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.
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, ordered by severity.
Finding
iduuidFinding identifier.
codestringStable Site Audit check code.
categorystringNormalized technical or content category.
severitycritical | high | medium | low | infoCurrent severity.
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.
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.
FindingGroup
codestringShared Site Audit check code.
titlestringRepresentative title.
descriptionstring | nullRepresentative description.
recommendationstring | nullRepresentative recommendation.
severitycritical | high | medium | low | infoHighest severity in the group.
categorySiteAuditCategoryNormalized category.
pillartechnical | contentTop-level Site Audit area.
occurrencesintegerOccurrences represented by the bounded result set.
affected_pagesintegerDistinct affected pages represented by the result set.
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.
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",
"severity": "high",
"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
/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.
codestringStable Site Audit check code.
categorystringNormalized technical or content category.
severitycritical | high | medium | low | infoCurrent severity.
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.
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.
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.",
"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
/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
/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.