RankPilot API

Send an API key as a Bearer token. Every response carries data_through, coverage and rate-limit headers; limits are shared by every key of a workspace.

Account

GET/me

The workspace and credential making this call

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/me"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/me", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/usage

Plan limits and current usage

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/usage"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/usage", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

Properties

GET/properties

Properties this credential can read

Parameters of GET /properties
NameInTypeRequired
limitqueryinteger 1-1000no
cursorquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/propertiesWrite key, Pro

Put a discovered Search Console property on the dashboard

Parameters of POST /properties
NameInTypeRequired
Idempotency-Keyheaderstringno

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"site_url":"<site_url>"}' \
  "https://rank.hanzla.com/api/v1/properties"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"site_url":"<site_url>"}),
});
console.log(await res.json());

GET/properties/{id}

One property

Parameters of GET /properties/{id}
NameInTypeRequired
idpathstringyes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

PATCH/properties/{id}Write key, Pro

Rename a property

Parameters of PATCH /properties/{id}
NameInTypeRequired
idpathstringyes

curl

curl -X PATCH -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"display_name":"<display_name>"}' \
  "https://rank.hanzla.com/api/v1/properties/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"display_name":"<display_name>"}),
});
console.log(await res.json());

GET/properties/{id}/annotations

Annotations of a property

Parameters of GET /properties/{id}/annotations
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
fromquerystring (date)no
toquerystring (date)no

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/annotations"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/annotations", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/properties/{id}/annotationsWrite key, Pro

Add an annotation

Parameters of POST /properties/{id}/annotations
NameInTypeRequired
idpathstringyes
Idempotency-Keyheaderstringno

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"date":"<date>","end_date":"<end_date>","title":"<title>","body":"<body>","category":"<category>"}' \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/annotations"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/annotations", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"date":"<date>","end_date":"<end_date>","title":"<title>","body":"<body>","category":"<category>"}),
});
console.log(await res.json());

DELETE/properties/{id}/annotations/{annotationId}Write key, Pro

Delete an annotation

Parameters of DELETE /properties/{id}/annotations/{annotationId}
NameInTypeRequired
idpathstringyes
annotationIdpathstringyes

curl

curl -X DELETE -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/annotations/<annotationId>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/annotations/<annotationId>", {
  method: "DELETE",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/properties/{id}/syncWrite key, Pro

Ask for a fresh Search Console pull (once per 15 minutes per property)

Parameters of POST /properties/{id}/sync
NameInTypeRequired
idpathstringyes

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/sync"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/sync", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

Reports

GET/reports/global

Totals across every property this credential can read

Parameters of GET /reports/global
NameInTypeRequired
start_datequerystring (date)yes
end_datequerystring (date)yes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/reports/global?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/reports/global?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/dashboard

Dashboard

Clicks, impressions, CTR and position for a property over a range, with the previous period.

Parameters of GET /properties/{id}/reports/dashboard
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/dashboard?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/dashboard?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/queries

Queries

Search queries with clicks, impressions, CTR and position, and the change against the previous period.

Parameters of GET /properties/{id}/reports/queries
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/queries?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/queries?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/pages

Pages

Pages with clicks, impressions, CTR and position, and the change against the previous period.

Parameters of GET /properties/{id}/reports/pages
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/pages?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/pages?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/countries

Countries

Clicks, impressions, CTR and position by country, with the change against the previous period.

Parameters of GET /properties/{id}/reports/countries
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/countries?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/countries?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/devices

Devices

Clicks, impressions, CTR and position by device, with shares and the change against the previous period.

Parameters of GET /properties/{id}/reports/devices
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/devices?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/devices?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/appearance

Search Appearance

Clicks, impressions, CTR and position by search appearance type.

Parameters of GET /properties/{id}/reports/appearance
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/appearance?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/appearance?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/new-lost

New & Lost Rankings

Queries or pages that appeared or disappeared between two periods, with the counts of all four kinds.

Parameters of GET /properties/{id}/reports/new-lost
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/new-lost?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/new-lost?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/rank-changes

Rank Changes

Keywords whose average position improved or worsened between two periods, with click and impression impact.

Parameters of GET /properties/{id}/reports/rank-changes
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/rank-changes?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/rank-changes?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/query-detail

Query Detail

Trend, position distribution, ranking pages, seasonality and related queries for one query or a regex group.

Parameters of GET /properties/{id}/reports/query-detail
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/query-detail?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/query-detail?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ctr-benchmark

CTR Benchmark

Queries or pages whose click-through rate is below (or above) the property curve at the same position, with the clicks missed.

Parameters of GET /properties/{id}/reports/ctr-benchmark
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ctr-benchmark?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ctr-benchmark?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ai_visibility

AI Visibility Report

Google generative-AI impressions, assistant referral sessions and AI-prone query share, each on its own, with insights.

Parameters of GET /properties/{id}/reports/ai_visibility
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ai_visibility?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ai_visibility?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/brand-split

Branded vs Non-Branded

Clicks and impressions split into branded, non-branded and unattributed queries, with the previous period.

Parameters of GET /properties/{id}/reports/brand-split
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/brand-split?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/brand-split?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/change-events

Change events

Deploys, crawl changes, deployed tasks, data gaps and incidents recorded for a property in a date range (read only).

Parameters of GET /properties/{id}/reports/change-events
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/change-events?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/change-events?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/competitor-comparison

Competitor Comparison

Compares your crawled pages with one competitor sample: click depth, internal links, structured data and title terms. Figures describe the pages crawled, never the whole site, and carry no rankings, traffic, backlinks or keyword volumes.

Parameters of GET /properties/{id}/reports/competitor-comparison
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/competitor-comparison?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/competitor-comparison?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ctr-curve

Global CTR Curve

The click-through rate of all your properties by Google position 1 to 20 (ratio of sums over analysed queries), with the gap to each verified benchmark. Unverified placeholder benchmarks are never returned.

Parameters of GET /properties/{id}/reports/ctr-curve
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ctr-curve?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ctr-curve?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/global-report

Global Reports

Clicks, impressions, CTR and position summed over all your properties for a stored global run, with the per-property breakdown, the top countries and the properties that could not be loaded. Ratios are ratios of sums; twin properties are removed by default.

Parameters of GET /properties/{id}/reports/global-report
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/global-report?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/global-report?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/migration-compare

Migration Compare

The last result of a saved site migration: clicks per day before and after go-live, recovery, the rule-based risk score with every factor, and the old pages ranked worst first.

Parameters of GET /properties/{id}/reports/migration-compare
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/migration-compare?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/migration-compare?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/position-buckets

Impressions by Position

Queries and impressions in the position buckets 1-3, 4-10, 11-20 and 21+, with the previous period.

Parameters of GET /properties/{id}/reports/position-buckets
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/position-buckets?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/position-buckets?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/query-counting

Query Counting

Distinct queries per day, in total and by position bucket.

Parameters of GET /properties/{id}/reports/query-counting
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/query-counting?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/query-counting?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/sampling-impact

Sampling Impact

For each property, the percentage of clicks hidden by Search Console sampling at query and page level, with levels and summary cards. Query over 50 percent and page over 15 percent are High.

Parameters of GET /properties/{id}/reports/sampling-impact
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/sampling-impact?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/sampling-impact?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/technical-summary

Technical changes

Confirmed technical changes found by the monitor, counted by severity (read only).

Parameters of GET /properties/{id}/reports/technical-summary
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/technical-summary?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/technical-summary?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/schema-validation

Structured data validation

Structured data problems grouped by rule with the Google documentation link and affected page count (read only).

Parameters of GET /properties/{id}/reports/schema-validation
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/schema-validation?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/schema-validation?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/programmatic-seo-health

Programmatic SEO health

Template clusters with indexed ratio and interval, duplication, thin share, depth, worst finding, change since the last run and tasks created (read only).

Parameters of GET /properties/{id}/reports/programmatic-seo-health
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/programmatic-seo-health?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/programmatic-seo-health?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/local-matrix

Service by city matrix

Services by cities for a local business: the mapped page, impression-weighted position of its tagged queries, clicks, leads, lead rate and the NAP and business-markup status of each cell, plus gap cells with no page. No search volume is estimated (read only).

Parameters of GET /properties/{id}/reports/local-matrix
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/local-matrix?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/local-matrix?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/sitemap-performance

Sitemap performance

Clicks, impressions and pages without traffic for each sitemap of the newest analysis (read only).

Parameters of GET /properties/{id}/reports/sitemap-performance
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/sitemap-performance?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/sitemap-performance?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-overview

GA4 overview

Sessions, engaged sessions, key events and revenue of the site by day, from Google Analytics 4 (read only).

Parameters of GET /properties/{id}/reports/ga-overview
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-overview?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-overview?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-channels

GA4 channels

GA4 sessions, engagement, key events and revenue by default channel group (read only).

Parameters of GET /properties/{id}/reports/ga-channels
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-channels?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-channels?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-sources

GA4 sources

GA4 sessions by source and medium (read only).

Parameters of GET /properties/{id}/reports/ga-sources
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-sources?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-sources?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-pages

GA4 pages

GA4 page views per page with the Search Console clicks of the same page (read only).

Parameters of GET /properties/{id}/reports/ga-pages
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-pages?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-pages?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-landing-pages

GA4 landing pages

GA4 landing sessions, engagement, organic sessions, key events and revenue per landing page (read only).

Parameters of GET /properties/{id}/reports/ga-landing-pages
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-landing-pages?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-landing-pages?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-countries

GA4 countries

GA4 sessions by country, with full country names (read only).

Parameters of GET /properties/{id}/reports/ga-countries
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-countries?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-countries?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-key-events

GA4 key events

The events marked as key events in GA4: how often they fired and what they were worth (read only).

Parameters of GET /properties/{id}/reports/ga-key-events
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-key-events?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-key-events?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-error-pages

GA4 error pages

Pages whose title or path looks like a 404, with views, previous period and Search Console clicks (read only). Detected from titles and paths: GA4 records no HTTP status.

Parameters of GET /properties/{id}/reports/ga-error-pages
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-error-pages?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-error-pages?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-ecommerce

GA4 e-commerce

GA4 item views, add to cart, purchases and revenue per item (read only).

Parameters of GET /properties/{id}/reports/ga-ecommerce
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-ecommerce?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-ecommerce?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-custom-dimensions

GA4 custom dimensions

Event counts per value of one synced GA4 custom dimension (read only); pass dim as customEvent:name or customUser:name.

Parameters of GET /properties/{id}/reports/ga-custom-dimensions
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-custom-dimensions?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-custom-dimensions?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/ga-blended

Blended Search Console and GA4

Search Console clicks and GA4 sessions of the same pages joined on the normalised URL, with match state both, gsc_only or ga4_only (read only). ga4filters is the JSON of the screen.

Parameters of GET /properties/{id}/reports/ga-blended
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-blended?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/ga-blended?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/merchant-listings

Merchant listings

Clicks, impressions, CTR, impression-weighted position and share of site impressions for the Merchant listings and Product snippets search appearances, with the change against the previous period.

Parameters of GET /properties/{id}/reports/merchant-listings
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/merchant-listings?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/merchant-listings?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/organic-shopping

Organic Shopping

Free listing clicks, impressions and CTR per product from Google Merchant Center (paid ads excluded), with the change against the previous period. At most 100 rows; there is no position in this data.

Parameters of GET /properties/{id}/reports/organic-shopping
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/organic-shopping?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/organic-shopping?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/feed-audit

Feed Audit

The 21 Merchant feed checks with the number of errors, warnings and suggestions found by the latest finished audit (read only).

Parameters of GET /properties/{id}/reports/feed-audit
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/feed-audit?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/feed-audit?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/title-hygiene

Title Hygiene

How many synced Merchant products break each title rule: short, long, capitals, promotion, symbols, missing brand, odd spaces, repeated word, duplicate title, no colour or size (read only).

Parameters of GET /properties/{id}/reports/title-hygiene
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/title-hygiene?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/title-hygiene?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/tracked-rankings

Tracked rankings

Tracked keywords with the latest SERP vendor sample: rank at one location and device on one date from a named provider (a third-party estimate, empty when the property was not in the top 20), the previous sample and change, the ranking URL, and the GSC average position in a separate column. Never merged with Search Console position (read only).

Parameters of GET /properties/{id}/reports/tracked-rankings
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/tracked-rankings?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/tracked-rankings?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/trust-checklist

Trust checklist

Trust checklist from stored page snapshots: for each site policy page and each page element (byline, author link, reviewer credit for YMYL pages, visible and machine-readable dates, sources, disclosure, first-hand cue) the status present, missing, unknown or not applicable, with the matched or looked-for evidence. Observable on-page facts, not a score, and not a claim about rankings (read only).

Parameters of GET /properties/{id}/reports/trust-checklist
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/trust-checklist?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/trust-checklist?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/adsense-readiness

AdSense readiness

The AdSense readiness checklist of the newest run: blocking and advisory checks with their status (ok, fail or unknown with the missing input), pages affected, and whether each check comes from a program policy, Google guidance or a RankPilot heuristic. A list of observable facts to fix before applying; it never predicts approval, which Google decides (read only).

Parameters of GET /properties/{id}/reports/adsense-readiness
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/adsense-readiness?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/adsense-readiness?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/crawl-logs

Crawl logs

Crawler hits read from the property's server logs: per day, crawler family (Googlebot, Bingbot, GPTBot, ClaudeBot and the other registry families) and trust level, with status classes. Verified means the request came from an address the vendor publishes; claimed means only the user agent says so. Families are never summed. Fewer than 14 days of logs (see Days of logs) means crawl conclusions are likely, not measured (read only).

Parameters of GET /properties/{id}/reports/crawl-logs
NameInTypeRequired
idpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/crawl-logs?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/crawl-logs?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/properties/{id}/reports/{reportId}

Run any report by id

Parameters of GET /properties/{id}/reports/{reportId}
NameInTypeRequired
idpathstringyes
reportIdpathstringyes
limitqueryinteger 1-1000no
cursorquerystringno
start_datequerystring (date)yes
end_datequerystring (date)yes
comparequerynone | previous_period | previous_yearno
filterquerystring | array of stringno
sortquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/properties/<property-id>/reports/<reportId>?start_date=<start_date>&end_date=<end_date>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/properties/<property-id>/reports/<reportId>?start_date=<start_date>&end_date=<end_date>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

Work loop

GET/findings

Findings from the latest detector runs

Parameters of GET /findings
NameInTypeRequired
limitqueryinteger 1-1000no
cursorquerystringno
property_idquerystring (uuid)no
kindquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/findings"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/findings", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/findings/{id}

One finding

Parameters of GET /findings/{id}
NameInTypeRequired
idpathstringyes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/findings/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/findings/<property-id>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/investigations

Investigations

Parameters of GET /investigations
NameInTypeRequired
limitqueryinteger 1-1000no
cursorquerystringno
property_idquerystring (uuid)no
statusquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/investigations"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/investigations", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/investigations/{id}

One investigation with hypotheses, tier language and calibrated confidence

Parameters of GET /investigations/{id}
NameInTypeRequired
idpathstringyes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/investigations/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/investigations/<property-id>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/tasks

Tasks

Parameters of GET /tasks
NameInTypeRequired
limitqueryinteger 1-1000no
cursorquerystringno
property_idquerystring (uuid)no
statusquerystringno
kindquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/tasks"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/tasks", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/tasksWrite key, Pro

Create a task; risky kinds wait for a person to approve them

Parameters of POST /tasks
NameInTypeRequired
Idempotency-Keyheaderstringno

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"property_id":"<property_id>","kind":"<kind>","title":"<title>","priority":"<priority>","summary_md":"<summary_md>","instructions_md":"<instructions_md>","urls":[],"finding_id":"<finding_id>","investigation_id":"<investigation_id>"}' \
  "https://rank.hanzla.com/api/v1/tasks"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/tasks", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"property_id":"<property_id>","kind":"<kind>","title":"<title>","priority":"<priority>","summary_md":"<summary_md>","instructions_md":"<instructions_md>","urls":[],"finding_id":"<finding_id>","investigation_id":"<investigation_id>"}),
});
console.log(await res.json());

GET/tasks/{id}

One task

Parameters of GET /tasks/{id}
NameInTypeRequired
idpathstringyes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/tasks/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/tasks/<property-id>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

PATCH/tasks/{id}Write key, Pro

Move a task to in_progress or deployed, or comment

Parameters of PATCH /tasks/{id}
NameInTypeRequired
idpathstringyes

curl

curl -X PATCH -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"<status>","note":"<note>","evidence_url":"<evidence_url>","attestation":true,"expected_rev":0}' \
  "https://rank.hanzla.com/api/v1/tasks/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/tasks/<property-id>", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"status":"<status>","note":"<note>","evidence_url":"<evidence_url>","attestation":true,"expected_rev":0}),
});
console.log(await res.json());

GET/outcomes

Measured outcomes and the track record

Parameters of GET /outcomes
NameInTypeRequired
property_idquerystring (uuid)no
kindquerystringno

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/outcomes"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/outcomes", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/outcomes/{id}

The outcome of one task

Parameters of GET /outcomes/{id}
NameInTypeRequired
idpathstringyes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/outcomes/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/outcomes/<property-id>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/goals

The business goal of every readable property

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/goals"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/goals", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

GET/goals/{id}

The goal of one property (id is the property id)

Parameters of GET /goals/{id}
NameInTypeRequired
idpathstringyes

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/goals/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/goals/<property-id>", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

PUT/goals/{id}Write key, Pro

Set the goal of one property (id is the property id)

Parameters of PUT /goals/{id}
NameInTypeRequired
idpathstringyes

curl

curl -X PUT -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"<kind>","unitsPerClick":"<unitsPerClick>","unitsPerClickSource":"<unitsPerClickSource>","valuePerUnit":"<valuePerUnit>","currency":"<currency>","effortCapacityHoursWeek":"<effortCapacityHoursWeek>","hourValue":"<hourValue>","visibilityWeights":"<visibilityWeights>","portfolioWeights":"<portfolioWeights>"}' \
  "https://rank.hanzla.com/api/v1/goals/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/goals/<property-id>", {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"kind":"<kind>","unitsPerClick":"<unitsPerClick>","unitsPerClickSource":"<unitsPerClickSource>","valuePerUnit":"<valuePerUnit>","currency":"<currency>","effortCapacityHoursWeek":"<effortCapacityHoursWeek>","hourValue":"<hourValue>","visibilityWeights":"<visibilityWeights>","portfolioWeights":"<portfolioWeights>"}),
});
console.log(await res.json());

Webhooks

GET/webhooks

Webhook endpoints with their event subscription (workspace owner keys only)

curl

curl -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/webhooks"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks", {
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/webhooksWrite key, Pro

Add a webhook endpoint; the signing secret is shown once

Parameters of POST /webhooks
NameInTypeRequired
Idempotency-Keyheaderstringno

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"<name>","url":"<url>"}' \
  "https://rank.hanzla.com/api/v1/webhooks"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name":"<name>","url":"<url>"}),
});
console.log(await res.json());

PATCH/webhooks/{id}Write key, Pro

Rename, pause, or change event types, properties and minimum severity

Parameters of PATCH /webhooks/{id}
NameInTypeRequired
idpathstringyes

curl

curl -X PATCH -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"<name>","active":true,"event_types":[],"property_ids":"<property_ids>","min_severity":"<min_severity>","enabled":true}' \
  "https://rank.hanzla.com/api/v1/webhooks/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks/<property-id>", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name":"<name>","active":true,"event_types":[],"property_ids":"<property_ids>","min_severity":"<min_severity>","enabled":true}),
});
console.log(await res.json());

DELETE/webhooks/{id}Write key, Pro

Delete a webhook endpoint and its subscription

Parameters of DELETE /webhooks/{id}
NameInTypeRequired
idpathstringyes

curl

curl -X DELETE -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/webhooks/<property-id>"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks/<property-id>", {
  method: "DELETE",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/webhooks/{id}/testWrite key, Pro

Send a signed test event through the normal delivery path

Parameters of POST /webhooks/{id}/test
NameInTypeRequired
idpathstringyes

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/webhooks/<property-id>/test"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks/<property-id>/test", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/webhooks/{id}/rotate-secretWrite key, Pro

New signing secret; the old one keeps signing for 24 hours

Parameters of POST /webhooks/{id}/rotate-secret
NameInTypeRequired
idpathstringyes

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/webhooks/<property-id>/rotate-secret"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks/<property-id>/rotate-secret", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());

POST/webhooks/deliveries/{id}/replayWrite key, Pro

Send a stored delivery again (younger than 30 days), same delivery id, new timestamp

Parameters of POST /webhooks/deliveries/{id}/replay
NameInTypeRequired
idpathstringyes

curl

curl -X POST -H "Authorization: Bearer $RANKPILOT_API_KEY" \
  "https://rank.hanzla.com/api/v1/webhooks/deliveries/<property-id>/replay"

Node

const res = await fetch("https://rank.hanzla.com/api/v1/webhooks/deliveries/<property-id>/replay", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RANKPILOT_API_KEY}`,
  },
});
console.log(await res.json());