Projects List
const url = 'https://sitechecker.pro/api/v1/projects?limit=50&offset=0&include=site_audit';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://sitechecker.pro/api/v1/projects?limit=50&offset=0&include=site_audit' \ --header 'Authorization: Bearer <token>'Returns the Sitechecker projects available to the API key and their project IDs. Use include to attach cross-module metrics to every project: site_audit, ga4_insights, gsc_insights, rank_tracker, ai_visibility. Each requested module is returned as its own nested object with a status field, so a project without that integration is reported explicitly instead of returning zeros. Every block returns the aggregate Sitechecker keeps for the Project List columns in the interface, so an API row and the interface show the same numbers. That aggregate covers 30 days against the 30 days before them and is rebuilt whenever the project syncs, so each block reports the exact windows its data covers in period and comparison_period (as_of_date for the snapshot blocks) rather than assuming they end today; a project that has not synced for a while returns the window it last built. *_change values are the relative change between those two periods, in percent. Nothing is aggregated at request time, so the response cost does not grow with the number of includes and pagination behaves the same with or without them.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Page size.
Pagination offset.
Example
site_audit,ga4_insights,gsc_insights,rank_tracker,ai_visibilityComma-separated optional data sets to attach to each project. Multiple values are allowed in one request.
Responses
Section titled “Responses”Paginated projects. The rendered example shows a row with every include requested; without include a row is the identity fields only, and each block appears exactly when its include key is passed.
object
object
Unique project ID.
Project name shown in Sitechecker.
Project domain returned under this key (value = project domain).
Domain scope used by the project, returned as an object with protocols, scope_type and path.
object
Whether Site Audit is enabled for the project.
Latest crawl date.
Latest crawl status. API also returns ‘pending’ (enabled, not yet crawled) or null (audit disabled).
Returned only with include=site_audit. Latest crawl metrics of the project, from the same stored audit snapshot as site-audit/audit_summary. Values are null when the project has never been crawled.
object
Latest website score.
Crawled pages count.
Critical issues found by the latest crawl.
Warnings found by the latest crawl.
Opportunities found by the latest crawl.
Notices found by the latest crawl.
Returned only with include=ga4_insights. GA4 metrics for the project, split by traffic scope — the same figures the Project List columns show. GA4 storage separates organic from total traffic only, so those are the two scopes exposed here. key_events counts the key events configured for the project, while session_key_event_rate is the share of sessions with any key event, following the ga4-insights definition. Both periods are the windows of the stored aggregate; see the endpoint description for how they are refreshed.
object
Whether the block holds data: ‘ok’ — data for the period; ‘no_data’ — the source is set up but stored nothing for the period; ‘not_connected’ — the project has no such integration. Every metric is null unless the status is ok, so a null is never confused with a real zero.
Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.
object
Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.
object
GA4 metrics for one traffic scope. Each metric is followed by its *_change: the relative change against comparison_period in percent (not percentage points), null when the comparison period had no baseline to compare against.
object
Session-weighted bounce rate, percent (0-100).
Session-weighted average session duration, in seconds.
Share of sessions with a key event, percent (0-100).
GA4 metrics for one traffic scope. Each metric is followed by its *_change: the relative change against comparison_period in percent (not percentage points), null when the comparison period had no baseline to compare against.
object
Session-weighted bounce rate, percent (0-100).
Session-weighted average session duration, in seconds.
Share of sessions with a key event, percent (0-100).
Returned only with include=gsc_insights. Google Search Console performance for the project — the same figures the Project List columns show. Average position is impression-weighted and CTR is recomputed from the clicks and impressions next to it, so the three always agree. Each metric is followed by its *_change: the relative change against comparison_period in percent. For average_position a negative change means the position improved.
object
Whether the block holds data: ‘ok’ — data for the period; ‘no_data’ — the source is set up but stored nothing for the period; ‘not_connected’ — the project has no such integration. Every metric is null unless the status is ok, so a null is never confused with a real zero.
Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.
object
Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.
object
Clicks / impressions, percent (0-100).
Impression-weighted average position.
Distinct pages with impressions in the period.
Distinct search queries with impressions in the period.
Returned only with include=rank_tracker. Latest ranking snapshot of the tracked keywords — the Rank Tracker columns of the Project List. This block is a snapshot, not a period aggregate: it carries as_of_date instead of period/comparison_period and exposes no change metrics. Rank Tracker has no external integration, so the only non-ok status is ‘no_data’ (no snapshot in the last 30 days, e.g. a project without tracked keywords). Position buckets do not overlap.
object
Whether the block holds data: ‘ok’ — data for the period; ‘no_data’ — the source is set up but stored nothing for the period; ‘not_connected’ — the project has no such integration. Every metric is null unless the status is ok, so a null is never confused with a real zero.
Day the snapshot was taken.
Visibility score of the tracked keyword set, percent (0-100).
Keywords ranked in position 1.
Keywords ranked in positions 2-3.
Keywords ranked in positions 4-10.
Keywords ranked in positions 11-100.
Returned only with include=ai_visibility. AI Visibility state of the project. brand_visibility and citation_share are the Project List figures: a rolling 30-day aggregate over the tracked prompts ending on as_of_date, which is why they carry no change metrics. status is ‘not_connected’ when the project has no active AI prompts. AI traffic is reported separately under ai_traffic, with its own status and periods, because it comes from GA4 rather than from prompt runs.
object
Whether the block holds data: ‘ok’ — data for the period; ‘no_data’ — the source is set up but stored nothing for the period; ‘not_connected’ — the project has no such integration. Every metric is null unless the status is ok, so a null is never confused with a real zero.
Last day of the stored 30-day prompt aggregate.
Share of prompt runs mentioning the brand, percent (0-100).
Share of citations pointing to the project, percent (0-100).
AI chat traffic of the project, aggregated across every AI source from the stored AI-chat GA4 data. Requires a connected GA4 property. Note: bounce_rate is a percentage here, while ai-visibility/ai_traffic_summary returns the same metric as a 0-1 fraction.
object
Whether the block holds data: ‘ok’ — data for the period; ‘no_data’ — the source is set up but stored nothing for the period; ‘not_connected’ — the project has no such integration. Every metric is null unless the status is ok, so a null is never confused with a real zero.
Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.
object
Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.
object
Key events per session, percent.
Session-weighted bounce rate, percent (0-100).
Session-weighted average session duration, in seconds.
object
Reusable OpenAPI response schemas for the Public REST API: the error/meta envelope and one item schema per resource. Property names come from the Field registry so the documented contract and the runtime response shapes stay in lock-step.
Page size that was applied.
Pagination offset that was applied.
Example
{ "data": [ { "project_id": 12345, "project_name": "example.com", "url": "https://example.com", "domain_scope": { "protocols": [ "https" ], "scope_type": "subdomains", "path": "/" }, "site_audit_enabled": true, "last_crawl_date": "2026-05-12T08:30:00Z", "last_crawl_status": "finished", "site_audit": { "website_score": 87, "crawled_pages": 1204, "criticals": 3, "warnings": 12, "opportunities": 5, "notices": 9 }, "ga4_insights": { "status": "ok", "period": { "date_from": "2026-07-12", "date_to": "2026-08-10" }, "comparison_period": { "date_from": "2026-07-12", "date_to": "2026-08-10" }, "all_traffic": { "sessions": 18420, "sessions_change": 12.4, "bounce_rate": 41.35, "bounce_rate_change": -2.1, "average_session_duration": 96.42, "average_session_duration_change": 3.8, "key_events": 421, "key_events_change": 9.7, "session_key_event_rate": 2.29, "session_key_event_rate_change": 0.4 }, "organic_search": { "sessions": 18420, "sessions_change": 12.4, "bounce_rate": 41.35, "bounce_rate_change": -2.1, "average_session_duration": 96.42, "average_session_duration_change": 3.8, "key_events": 421, "key_events_change": 9.7, "session_key_event_rate": 2.29, "session_key_event_rate_change": 0.4 } }, "gsc_insights": { "status": "ok", "period": { "date_from": "2026-07-12", "date_to": "2026-08-10" }, "comparison_period": { "date_from": "2026-07-12", "date_to": "2026-08-10" }, "clicks": 5310, "clicks_change": 8.2, "impressions": 184320, "impressions_change": -3.4, "ctr": 2.88, "ctr_change": 12.1, "average_position": 14.62, "average_position_change": -4.5, "ranked_pages": 318, "ranked_pages_change": 1.9, "ranked_keywords": 4127, "ranked_keywords_change": 5.6 }, "rank_tracker": { "status": "ok", "as_of_date": "2026-08-11", "visibility": 34.71, "top_1": 12, "top_3": 24, "top_10": 58, "top_100": 143 }, "ai_visibility": { "status": "ok", "as_of_date": "2026-08-12", "brand_visibility": 18.6, "citation_share": 4.35, "ai_traffic": { "status": "ok", "period": { "date_from": "2026-07-12", "date_to": "2026-08-10" }, "comparison_period": { "date_from": "2026-07-12", "date_to": "2026-08-10" }, "ai_chat_sessions": 312, "ai_chat_sessions_change": 48.6, "key_events": 27, "key_events_change": 12.5, "session_key_event_rate": 8.65, "session_key_event_rate_change": -1.2, "bounce_rate": 33.4, "bounce_rate_change": -5.1, "average_session_duration": 128.7, "average_session_duration_change": 6.3 } } } ], "meta": { "total": 137, "limit": 50, "offset": 0 }}Missing or invalid API key
Returned as INVALID_API_KEY when the key is missing or unknown, and as REVOKED_API_KEY when the key exists but was revoked — the latter needs a new key.
object
object
Example
{ "error": { "code": "INVALID_API_KEY", "message": "Invalid or missing API key." }}No active API entitlement for the account
Returned as MISSING_PUBLIC_API_ACCESS when the account has no active API entitlement, and as ACCESS_DENIED when the requested project belongs to another account.
object
object
Example
{ "error": { "code": "MISSING_PUBLIC_API_ACCESS", "message": "API access is not available: the account has no active API entitlement." }}Invalid query parameters
Rejected query parameters. error.code is VALIDATION_ERROR for parameter validation (including a query parameter the endpoint does not accept), or INVALID_DATE_RANGE / INVALID_FILTER / INVALID_EVENT_TYPE / UNSUPPORTED_FILTER / UNSUPPORTED_DIMENSION / UNSUPPORTED_METRIC / UNSUPPORTED_SCOPE / SEGMENT_FILTER_UNSUPPORTED for module-specific rules.
object
object
Example
{ "error": { "code": "VALIDATION_ERROR", "message": "project_id is required." }}Rate limit exceeded — retry after the interval in the Retry-After header
object
object
Example
{ "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Rate limit exceeded. Try again later." }}Internal server error
object
object
Example
{ "error": { "code": "INTERNAL_ERROR", "message": "Internal server error." }}