PBN.LTD API docs
View as Markdown

Index checker

Is each page in Google? Track any URL - on your sites or any other - and read its history.

Index checker: plan and usage

GET/api/v1/index-checker

Scope index:read

The plan, how many pages may be tracked, checks a month included and used, the checks your chosen frequencies plan for, and how many tracked pages are indexed.

Example

curl -s "https://app.pbn.ltd/api/v1/index-checker" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.get("https://app.pbn.ltd/api/v1/index-checker", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "active": true,
    "plan": "Starter",
    "paid_until": "2026-10-31",
    "urls": {
      "used": 38,
      "limit": 50
    },
    "checks_this_month": {
      "used": 120,
      "limit": 215,
      "planned": 190
    },
    "pages": {
      "indexed": 30,
      "not_indexed": 6,
      "pending": 2
    }
  }
}

Errors: rate_limited, scope_missing, unauthorized

List tracked pages

GET/api/v1/index-checker/urls

Scope index:read

Every page you track, newest first, with its current status.

Parameters

NameInTypeRequiredDescription
statusquerystring (one of: indexed, not_indexed, pending)noOnly pages in this state.
hostquerystringnoOnly pages on this domain (www. ignored).
searchquerystringnoPart of the address.
limitqueryintegernoItems per page. Default: 50.
cursorquerystringnonext_cursor of the previous page.

Example

curl -s "https://app.pbn.ltd/api/v1/index-checker/urls" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.get("https://app.pbn.ltd/api/v1/index-checker/urls", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker/urls", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": [
    {
      "id": 901,
      "url": "https://example.com/blog/post/",
      "status": "indexed",
      "frequency": "weekly",
      "last_checked_at": "2026-09-21T10:00:00Z",
      "last_change_at": "2026-09-14T10:00:00Z",
      "first_indexed_at": "2026-09-14T10:00:00Z",
      "google_url": "https://example.com/blog/post/",
      "hosted_site_id": 12345,
      "checks": 3
    }
  ],
  "next_cursor": null,
  "has_more": false
}

Errors: rate_limited, scope_missing, unauthorized

One tracked page and its history

GET/api/v1/index-checker/urls/{url_id}

Scope index:read

The page and up to 100 of its most recent checks.

Parameters

NameInTypeRequiredDescription
url_idpathintegeryesThe tracked page id.

Example

curl -s "https://app.pbn.ltd/api/v1/index-checker/urls/url_id" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.get("https://app.pbn.ltd/api/v1/index-checker/urls/url_id", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker/urls/url_id", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "id": 901,
    "url": "https://example.com/blog/post/",
    "status": "indexed",
    "frequency": "weekly",
    "last_checked_at": "2026-09-21T10:00:00Z",
    "last_change_at": "2026-09-14T10:00:00Z",
    "first_indexed_at": "2026-09-14T10:00:00Z",
    "google_url": "https://example.com/blog/post/",
    "hosted_site_id": 12345,
    "checks": 3,
    "history": [
      {
        "checked_at": "2026-09-21T10:00:00Z",
        "indexed": true,
        "changed": false,
        "manual": false
      }
    ]
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized

Track pages

POST/api/v1/index-checker/urls

Scope index:write

Adds pages with the panel's own rules: a page that would pass the plan's URL limit or its checks a month is not added (see not_added). The first check runs within a few minutes.

Parameters

NameInTypeRequiredDescription
urlsbodyarrayyesPage addresses (up to 5,000). Any site, hosted with us or not.
frequencybodystring (one of: daily, weekly, monthly)noHow often the page is checked. Daily uses ~30 checks a month, weekly ~4.3, monthly 1. Default: weekly.

Example

curl -s -X POST "https://app.pbn.ltd/api/v1/index-checker/urls" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.post("https://app.pbn.ltd/api/v1/index-checker/urls", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker/urls", {
  method: "POST",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

201

{
  "data": {
    "added": [
      {
        "id": 901,
        "url": "https://example.com/blog/post/",
        "status": "indexed",
        "frequency": "weekly",
        "last_checked_at": "2026-09-21T10:00:00Z",
        "last_change_at": "2026-09-14T10:00:00Z",
        "first_indexed_at": "2026-09-14T10:00:00Z",
        "google_url": "https://example.com/blog/post/",
        "hosted_site_id": 12345,
        "checks": 3
      }
    ],
    "already_tracked": 0,
    "invalid": [
      {
        "url": "not a url",
        "reason": "..."
      }
    ],
    "not_added": {
      "count": 0,
      "reason": null
    }
  }
}

Errors: payment_required, rate_limited, scope_missing, unauthorized, validation_failed

Change how often a page is checked

PATCH/api/v1/index-checker/urls/{url_id}

Scope index:write

Refused when the new frequency would pass the plan's checks a month.

Parameters

NameInTypeRequiredDescription
url_idpathintegeryesThe tracked page id.
frequencybodystring (one of: daily, weekly, monthly)noHow often the page is checked. Daily uses ~30 checks a month, weekly ~4.3, monthly 1. Default: weekly.

Example

curl -s -X PATCH "https://app.pbn.ltd/api/v1/index-checker/urls/url_id" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.patch("https://app.pbn.ltd/api/v1/index-checker/urls/url_id", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker/urls/url_id", {
  method: "PATCH",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "id": 901,
    "url": "https://example.com/blog/post/",
    "status": "indexed",
    "frequency": "weekly",
    "last_checked_at": "2026-09-21T10:00:00Z",
    "last_change_at": "2026-09-14T10:00:00Z",
    "first_indexed_at": "2026-09-14T10:00:00Z",
    "google_url": "https://example.com/blog/post/",
    "hosted_site_id": 12345,
    "checks": 3
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, validation_failed

Stop tracking a page

DELETE/api/v1/index-checker/urls/{url_id}

Scope index:write

Stops tracking. Its history is kept and comes back if you add the page again.

Parameters

NameInTypeRequiredDescription
url_idpathintegeryesThe tracked page id.

Example

curl -s -X DELETE "https://app.pbn.ltd/api/v1/index-checker/urls/url_id" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.delete("https://app.pbn.ltd/api/v1/index-checker/urls/url_id", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker/urls/url_id", {
  method: "DELETE",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "deleted": true,
    "id": 901
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized

Check a page now

POST/api/v1/index-checker/urls/{url_id}/check

Scope index:write

Checks the page immediately (usually 1-2 seconds). Uses one check of the monthly allowance; at most once an hour per page and a daily number per account.

Parameters

NameInTypeRequiredDescription
url_idpathintegeryesThe tracked page id.

Example

curl -s -X POST "https://app.pbn.ltd/api/v1/index-checker/urls/url_id/check" \
  -H "Authorization: Bearer $PBN_API_KEY"
import os
import requests

headers = {"Authorization": "Bearer " + os.environ["PBN_API_KEY"]}
r = requests.post("https://app.pbn.ltd/api/v1/index-checker/urls/url_id/check", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/index-checker/urls/url_id/check", {
  method: "POST",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "id": 901,
    "url": "https://example.com/blog/post/",
    "status": "indexed",
    "frequency": "weekly",
    "last_checked_at": "2026-09-21T10:00:00Z",
    "last_change_at": "2026-09-14T10:00:00Z",
    "first_indexed_at": "2026-09-14T10:00:00Z",
    "google_url": "https://example.com/blog/post/",
    "hosted_site_id": 12345,
    "checks": 3
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized