Skip to content

Projects List

GET
/api/v1/projects
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.

limit
integer
default: 50 >= 1 <= 100

Page size.

offset
integer
0

Pagination offset.

include
string
Allowed values: site_audit ga4_insights gsc_insights rank_tracker ai_visibility
Example
site_audit,ga4_insights,gsc_insights,rank_tracker,ai_visibility

Comma-separated optional data sets to attach to each project. Multiple values are allowed in one request.

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.

Media typeapplication/json
object
data
Array<object>
object
project_id

Unique project ID.

integer
project_name

Project name shown in Sitechecker.

string
url

Project domain returned under this key (value = project domain).

string
domain_scope

Domain scope used by the project, returned as an object with protocols, scope_type and path.

object
protocols
Array<string>
scope_type
string
path
string
site_audit_enabled

Whether Site Audit is enabled for the project.

boolean
last_crawl_date

Latest crawl date.

string format: date-time
nullable
last_crawl_status

Latest crawl status. API also returns ‘pending’ (enabled, not yet crawled) or null (audit disabled).

string
nullable
site_audit

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
website_score

Latest website score.

integer
nullable
crawled_pages

Crawled pages count.

integer
nullable
criticals

Critical issues found by the latest crawl.

integer
nullable
warnings

Warnings found by the latest crawl.

integer
nullable
opportunities

Opportunities found by the latest crawl.

integer
nullable
notices

Notices found by the latest crawl.

integer
nullable
ga4_insights

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
status

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.

string
Allowed values: ok no_data not_connected
period

Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.

object
date_from
string format: date
date_to
string format: date
comparison_period

Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.

object
date_from
string format: date
date_to
string format: date
all_traffic

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
sessions
integer
nullable
sessions_change
number format: float
nullable
bounce_rate

Session-weighted bounce rate, percent (0-100).

number format: float
nullable
bounce_rate_change
number format: float
nullable
average_session_duration

Session-weighted average session duration, in seconds.

number format: float
nullable
average_session_duration_change
number format: float
nullable
key_events
integer
nullable
key_events_change
number format: float
nullable
session_key_event_rate

Share of sessions with a key event, percent (0-100).

number format: float
nullable
session_key_event_rate_change
number format: float
nullable
organic_search

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
sessions
integer
nullable
sessions_change
number format: float
nullable
bounce_rate

Session-weighted bounce rate, percent (0-100).

number format: float
nullable
bounce_rate_change
number format: float
nullable
average_session_duration

Session-weighted average session duration, in seconds.

number format: float
nullable
average_session_duration_change
number format: float
nullable
key_events
integer
nullable
key_events_change
number format: float
nullable
session_key_event_rate

Share of sessions with a key event, percent (0-100).

number format: float
nullable
session_key_event_rate_change
number format: float
nullable
gsc_insights

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
status

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.

string
Allowed values: ok no_data not_connected
period

Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.

object
date_from
string format: date
date_to
string format: date
comparison_period

Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.

object
date_from
string format: date
date_to
string format: date
clicks
integer
nullable
clicks_change
number format: float
nullable
impressions
integer
nullable
impressions_change
number format: float
nullable
ctr

Clicks / impressions, percent (0-100).

number format: float
nullable
ctr_change
number format: float
nullable
average_position

Impression-weighted average position.

number format: float
nullable
average_position_change
number format: float
nullable
ranked_pages

Distinct pages with impressions in the period.

integer
nullable
ranked_pages_change
number format: float
nullable
ranked_keywords

Distinct search queries with impressions in the period.

integer
nullable
ranked_keywords_change
number format: float
nullable
rank_tracker

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
status

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.

string
Allowed values: ok no_data not_connected
as_of_date

Day the snapshot was taken.

string format: date
nullable
visibility

Visibility score of the tracked keyword set, percent (0-100).

number format: float
nullable
top_1

Keywords ranked in position 1.

integer
nullable
top_3

Keywords ranked in positions 2-3.

integer
nullable
top_10

Keywords ranked in positions 4-10.

integer
nullable
top_100

Keywords ranked in positions 11-100.

integer
nullable
ai_visibility

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
status

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.

string
Allowed values: ok no_data not_connected
as_of_date

Last day of the stored 30-day prompt aggregate.

string format: date
nullable
brand_visibility

Share of prompt runs mentioning the brand, percent (0-100).

number format: float
nullable
citation_share

Share of citations pointing to the project, percent (0-100).

number format: float
nullable
ai_traffic

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
status

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.

string
Allowed values: ok no_data not_connected
period

Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.

object
date_from
string format: date
date_to
string format: date
comparison_period

Date range a metric block was computed for, inclusive. Null when the project has no stored aggregate yet.

object
date_from
string format: date
date_to
string format: date
ai_chat_sessions
integer
nullable
ai_chat_sessions_change
number format: float
nullable
key_events
integer
nullable
key_events_change
number format: float
nullable
session_key_event_rate

Key events per session, percent.

number format: float
nullable
session_key_event_rate_change
number format: float
nullable
bounce_rate

Session-weighted bounce rate, percent (0-100).

number format: float
nullable
bounce_rate_change
number format: float
nullable
average_session_duration

Session-weighted average session duration, in seconds.

number format: float
nullable
average_session_duration_change
number format: float
nullable
meta
object
total

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.

integer
limit

Page size that was applied.

integer
offset

Pagination offset that was applied.

integer
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

Media typeapplication/json

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
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid or missing API key."
}
}

No active API entitlement for the account

Media typeapplication/json

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
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "MISSING_PUBLIC_API_ACCESS",
"message": "API access is not available: the account has no active API entitlement."
}
}

Invalid query parameters

Media typeapplication/json

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
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "VALIDATION_ERROR",
"message": "project_id is required."
}
}

Rate limit exceeded — retry after the interval in the Retry-After header

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again later."
}
}

Internal server error

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error."
}
}