Management API

Search Console

Read Google Search Console data for your project.

When someone on the team connects Google Search Console on the project’s Search page, PMKIN imports clicks, impressions, click-through rate and position about once a day. These endpoints read that data, matched to your documents. They’re read-only: connecting needs the web app.

Windows and totals#

Numbers cover two 28-day windows: current, the most recent 28 days of imported data, and previous, the 28 days before. windows gives each one’s startDate and endDate. Totals have these fields:

clicksinteger
impressionsinteger
ctrnumber
positionnumber | null
Not ready yet?
Until Search Console is connected, set up and imported once, these endpoints answer 409 with a message that says which step is missing. GET /summary shows whether it’s connected.

Endpoints#

Get the search summary#

GET/search/summary

Site totals for the last 28 days of final data (current) and the 28 days before (previous), plus daily clicks and impressions for the last days days.

Query parameters
daysinteger
Errors
Conflict409
curl "https://api.pmkin.io/search/summary?days=28" \
-H "Authorization: Bearer $PMKIN_MANAGEMENT_TOKEN"
Response: 200 OK
{
"current": {
"clicks": 412,
"ctr": 0.0381,
"impressions": 10814,
"position": 8.4
},
"lastImportAt": "2026-10-10T04:12:09.000Z",
"previous": {
"clicks": 355,
"ctr": 0.0362,
"impressions": 9807,
"position": 9.1
},
"series": [
{
"clicks": 14,
"date": "2026-10-07",
"impressions": 391
},
{
"clicks": 17,
"date": "2026-10-08",
"impressions": 402
}
],
"siteUrl": "sc-domain:example.com",
"status": "active",
"windows": {
"current": {
"endDate": "2026-10-08",
"startDate": "2026-09-11"
},
"previous": {
"endDate": "2026-09-10",
"startDate": "2026-08-14"
}
}
}

List search queries#

GET/search/queries

Search queries for the current 28-day window with their numbers in the previous one (previous, null when the query is new) and, when a page that ranks belongs to a document, that document. total counts every matching query.

Query parameters
documentIdstring
qstring
sortstring
limitinteger
offsetinteger
Errors
Conflict409
BadRequest422
curl "https://api.pmkin.io/search/queries?limit=20&sort=impressions" \
-H "Authorization: Bearer $PMKIN_MANAGEMENT_TOKEN"
Response: 200 OK
{
"queries": [
{
"clicks": 412,
"ctr": 0.0381,
"impressions": 10814,
"position": 8.4,
"document": {
"id": "6704a1f0c2b3d4e5f6a7b8c9",
"slug": "headless-cms-pricing",
"title": "Headless CMS pricing"
},
"page": "https://example.com/blog/headless-cms-pricing",
"previous": {
"clicks": 355,
"ctr": 0.0362,
"impressions": 9807,
"position": 9.1
},
"query": "headless cms pricing"
}
],
"total": 1284,
"windows": {
"current": {
"endDate": "2026-10-08",
"startDate": "2026-09-11"
},
"previous": {
"endDate": "2026-09-10",
"startDate": "2026-08-14"
}
}
}

List search pages#

GET/search/pages

Pages for the current 28-day window with their numbers in the previous one and, when the page belongs to a document, that document.

Query parameters
sortstring
limitinteger
offsetinteger
Errors
Conflict409
BadRequest422
curl "https://api.pmkin.io/search/pages" \
-H "Authorization: Bearer $PMKIN_MANAGEMENT_TOKEN"
Response: 200 OK
{
"pages": [
{
"clicks": 412,
"ctr": 0.0381,
"impressions": 10814,
"position": 8.4,
"document": {
"id": "6704a1f0c2b3d4e5f6a7b8c9",
"slug": "headless-cms-pricing",
"title": "Headless CMS pricing"
},
"page": "https://example.com/blog/headless-cms-pricing",
"previous": {
"clicks": 355,
"ctr": 0.0362,
"impressions": 9807,
"position": 9.1
}
}
],
"total": 87,
"windows": {
"current": {
"endDate": "2026-10-08",
"startDate": "2026-09-11"
},
"previous": {
"endDate": "2026-09-10",
"startDate": "2026-08-14"
}
}
}

Get a document’s search performance#

GET/documents/:id/search

One document’s numbers: totals for both windows, daily clicks and impressions for the last 90 days, and its top 10 queries.

Path parameters
idstringrequired
Errors
NotFound404
Conflict409
curl "https://api.pmkin.io/documents/6704a1f0c2b3d4e5f6a7b8c9/search" \
-H "Authorization: Bearer $PMKIN_MANAGEMENT_TOKEN"
Response: 200 OK
{
"current": {
"clicks": 412,
"ctr": 0.0381,
"impressions": 10814,
"position": 8.4
},
"documentId": "6704a1f0c2b3d4e5f6a7b8c9",
"previous": {
"clicks": 355,
"ctr": 0.0362,
"impressions": 9807,
"position": 9.1
},
"series": [
{
"clicks": 14,
"date": "2026-10-07",
"impressions": 391
},
{
"clicks": 17,
"date": "2026-10-08",
"impressions": 402
}
],
"topQueries": [
{
"clicks": 412,
"ctr": 0.0381,
"impressions": 10814,
"position": 8.4,
"document": {
"id": "6704a1f0c2b3d4e5f6a7b8c9",
"slug": "headless-cms-pricing",
"title": "Headless CMS pricing"
},
"page": "https://example.com/blog/headless-cms-pricing",
"previous": {
"clicks": 355,
"ctr": 0.0362,
"impressions": 9807,
"position": 9.1
},
"query": "headless cms pricing"
}
],
"windows": {
"current": {
"endDate": "2026-10-08",
"startDate": "2026-09-11"
},
"previous": {
"endDate": "2026-09-10",
"startDate": "2026-08-14"
}
}
}