PBN.LTD API docs
View as Markdown

Reputation monitoring

Star rating, review count and the latest reviews on Google, Trustpilot and Tripadvisor for the businesses you watch (poor unanswered reviews first), plus brand page one.

Reputation monitoring: plan and usage

GET/api/v1/reputation

Scope reputation:read

Your plan, how many businesses and brand terms it covers and how many you watch.

Example

curl -s "https://app.pbn.ltd/api/v1/reputation" \
  -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/reputation", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "active": true,
    "plan": "Reputation 3",
    "unlimited": false,
    "paid_until": "2026-10-25",
    "businesses": 2,
    "businesses_included": 3,
    "profiles": 5,
    "brand_terms": 2,
    "brand_terms_included": 10,
    "brand_page_one": true,
    "poor_unanswered": 1,
    "price_from": "12.00",
    "plans_url": "https://app.pbn.ltd/reputation/plans/"
  }
}

Errors: rate_limited, scope_missing, unauthorized, unavailable

Countries a business can be in

GET/api/v1/reputation/countries

Scope reputation:read

The countries you can choose when adding a business (pass location_code as country).

Example

curl -s "https://app.pbn.ltd/api/v1/reputation/countries" \
  -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/reputation/countries", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/countries", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": [
    {
      "location_code": 2826,
      "name": "United Kingdom",
      "country": "GB"
    }
  ]
}

Errors: rate_limited, scope_missing, unauthorized, unavailable

List your watched businesses

GET/api/v1/reputation/businesses

Scope reputation:read

Every business you watch with its confirmed review profiles and their latest reading (null = not read yet, never zero). covered is false for a business your plan no longer pays to read.

Example

curl -s "https://app.pbn.ltd/api/v1/reputation/businesses" \
  -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/reputation/businesses", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": [
    {
      "id": 41,
      "name": "Test Cafe",
      "website": "testcafe.com",
      "country": "United Kingdom",
      "location_code": 2826,
      "covered": true,
      "poor_unanswered": 1,
      "waiting_for_confirmation": false,
      "profiles": [
        {
          "platform": "google",
          "platform_name": "Google",
          "state": "ok",
          "name": "Test Cafe",
          "address": "1 High Street, London",
          "url": "https://maps.google.com/?cid=123",
          "rating": 4.6,
          "reviews_count": 212,
          "previous_rating": 4.5,
          "poor_unanswered": 1,
          "last_read_at": "2026-09-26T06:00:00Z",
          "error": ""
        }
      ],
      "created_at": "2026-09-20T10:00:00Z"
    }
  ]
}

Errors: rate_limited, scope_missing, unauthorized, unavailable

One watched business

GET/api/v1/reputation/businesses/{business_id}

Scope reputation:read

One business: per platform its confirmed profile (or the candidates found, waiting for you to confirm which is yours), the latest reviews (poor unanswered first), the rating history, and each brand term with its latest page one and what dropped off it.

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.

Example

curl -s "https://app.pbn.ltd/api/v1/reputation/businesses/business_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/reputation/businesses/business_id", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id", {
  method: "GET",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "id": 41,
    "name": "Test Cafe",
    "website": "testcafe.com",
    "country": "United Kingdom",
    "location_code": 2826,
    "covered": true,
    "poor_unanswered": 1,
    "waiting_for_confirmation": false,
    "profiles": [
      {
        "platform": "google",
        "platform_name": "Google",
        "state": "ok",
        "name": "Test Cafe",
        "address": "1 High Street, London",
        "url": "https://maps.google.com/?cid=123",
        "rating": 4.6,
        "reviews_count": 212,
        "previous_rating": 4.5,
        "poor_unanswered": 1,
        "last_read_at": "2026-09-26T06:00:00Z",
        "error": ""
      }
    ],
    "created_at": "2026-09-20T10:00:00Z",
    "searching": false,
    "reading": false,
    "platforms": [
      {
        "platform": "google",
        "platform_name": "Google",
        "profile": {
          "platform": "google",
          "platform_name": "Google",
          "state": "ok",
          "name": "Test Cafe",
          "address": "1 High Street, London",
          "url": "https://maps.google.com/?cid=123",
          "rating": 4.6,
          "reviews_count": 212,
          "previous_rating": 4.5,
          "poor_unanswered": 1,
          "last_read_at": "2026-09-26T06:00:00Z",
          "error": ""
        },
        "candidates": [],
        "reviews": [
          {
            "rating": 2.0,
            "title": "",
            "text": "Cold coffee.",
            "author": "A. Visitor",
            "url": "https://maps.google.com/...",
            "published_at": "2026-09-24T10:00:00Z",
            "replied": false,
            "poor": true
          }
        ],
        "history": [
          {
            "read_at": "2026-09-19T06:00:00Z",
            "rating": 4.5,
            "reviews_count": 205,
            "poor_unanswered": 0
          }
        ]
      }
    ],
    "brand_terms": [
      {
        "id": 7,
        "term": "Test Cafe",
        "last_checked_at": "2026-09-26T06:00:00Z",
        "page_one": [
          {
            "position": 1,
            "url": "https://testcafe.com/",
            "domain": "testcafe.com",
            "title": "Test Cafe",
            "yours": true,
            "new": false
          }
        ],
        "lost": []
      }
    ]
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable

Watch a business

POST/api/v1/reputation/businesses

Scope reputation:write

Adds a business and searches Google, Trustpilot and Tripadvisor for its profiles. The results arrive as candidates within a minute or two: confirm which one is yours with POST /reputation/businesses/{business_id}/profiles. Refused if your plan has no room.

Parameters

NameInTypeRequiredDescription
namebodystringyesThe business name as customers know it.
countrybodyintegeryesThe country it is in: a location_code from GET /reputation/countries (2826 = United Kingdom, 2840 = United States).
websitebodystringnoIts own website, optional (e.g. testcafe.com).

Example

curl -s -X POST "https://app.pbn.ltd/api/v1/reputation/businesses" \
  -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/reputation/businesses", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses", {
  method: "POST",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

201

{
  "data": {
    "id": 41,
    "name": "Test Cafe",
    "website": "testcafe.com",
    "country": "United Kingdom",
    "location_code": 2826,
    "covered": true,
    "poor_unanswered": 1,
    "waiting_for_confirmation": false,
    "profiles": [
      {
        "platform": "google",
        "platform_name": "Google",
        "state": "ok",
        "name": "Test Cafe",
        "address": "1 High Street, London",
        "url": "https://maps.google.com/?cid=123",
        "rating": 4.6,
        "reviews_count": 212,
        "previous_rating": 4.5,
        "poor_unanswered": 1,
        "last_read_at": "2026-09-26T06:00:00Z",
        "error": ""
      }
    ],
    "created_at": "2026-09-20T10:00:00Z",
    "searching": false,
    "reading": false,
    "platforms": [
      {
        "platform": "google",
        "platform_name": "Google",
        "profile": {
          "platform": "google",
          "platform_name": "Google",
          "state": "ok",
          "name": "Test Cafe",
          "address": "1 High Street, London",
          "url": "https://maps.google.com/?cid=123",
          "rating": 4.6,
          "reviews_count": 212,
          "previous_rating": 4.5,
          "poor_unanswered": 1,
          "last_read_at": "2026-09-26T06:00:00Z",
          "error": ""
        },
        "candidates": [],
        "reviews": [
          {
            "rating": 2.0,
            "title": "",
            "text": "Cold coffee.",
            "author": "A. Visitor",
            "url": "https://maps.google.com/...",
            "published_at": "2026-09-24T10:00:00Z",
            "replied": false,
            "poor": true
          }
        ],
        "history": [
          {
            "read_at": "2026-09-19T06:00:00Z",
            "rating": 4.5,
            "reviews_count": 205,
            "poor_unanswered": 0
          }
        ]
      }
    ],
    "brand_terms": [
      {
        "id": 7,
        "term": "Test Cafe",
        "last_checked_at": "2026-09-26T06:00:00Z",
        "page_one": [
          {
            "position": 1,
            "url": "https://testcafe.com/",
            "domain": "testcafe.com",
            "title": "Test Cafe",
            "yours": true,
            "new": false
          }
        ],
        "lost": []
      }
    ]
  }
}

Errors: payment_required, rate_limited, scope_missing, unauthorized, unavailable, validation_failed

Stop watching a business

DELETE/api/v1/reputation/businesses/{business_id}

Scope reputation:write · destructive

Removes the business with its profiles, reviews, history and brand terms.

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.

Example

curl -s -X DELETE "https://app.pbn.ltd/api/v1/reputation/businesses/business_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/reputation/businesses/business_id", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id", {
  method: "DELETE",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "deleted": true
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable

Confirm which profile is yours

POST/api/v1/reputation/businesses/{business_id}/profiles

Scope reputation:write

Only a profile you confirm is ever read. Its first reading starts at once.

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.
platformbodystring (one of: google, trustpilot, tripadvisor)yesThe platform.
candidatebodystringyesThe id of the candidate that is yours (from GET /reputation/businesses/{business_id}), or "none" when none of them is.

Example

curl -s -X POST "https://app.pbn.ltd/api/v1/reputation/businesses/business_id/profiles" \
  -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/reputation/businesses/business_id/profiles", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id/profiles", {
  method: "POST",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "id": 41,
    "name": "Test Cafe",
    "website": "testcafe.com",
    "country": "United Kingdom",
    "location_code": 2826,
    "covered": true,
    "poor_unanswered": 1,
    "waiting_for_confirmation": false,
    "profiles": [
      {
        "platform": "google",
        "platform_name": "Google",
        "state": "ok",
        "name": "Test Cafe",
        "address": "1 High Street, London",
        "url": "https://maps.google.com/?cid=123",
        "rating": 4.6,
        "reviews_count": 212,
        "previous_rating": 4.5,
        "poor_unanswered": 1,
        "last_read_at": "2026-09-26T06:00:00Z",
        "error": ""
      }
    ],
    "created_at": "2026-09-20T10:00:00Z",
    "searching": false,
    "reading": false,
    "platforms": [
      {
        "platform": "google",
        "platform_name": "Google",
        "profile": {
          "platform": "google",
          "platform_name": "Google",
          "state": "ok",
          "name": "Test Cafe",
          "address": "1 High Street, London",
          "url": "https://maps.google.com/?cid=123",
          "rating": 4.6,
          "reviews_count": 212,
          "previous_rating": 4.5,
          "poor_unanswered": 1,
          "last_read_at": "2026-09-26T06:00:00Z",
          "error": ""
        },
        "candidates": [],
        "reviews": [
          {
            "rating": 2.0,
            "title": "",
            "text": "Cold coffee.",
            "author": "A. Visitor",
            "url": "https://maps.google.com/...",
            "published_at": "2026-09-24T10:00:00Z",
            "replied": false,
            "poor": true
          }
        ],
        "history": [
          {
            "read_at": "2026-09-19T06:00:00Z",
            "rating": 4.5,
            "reviews_count": 205,
            "poor_unanswered": 0
          }
        ]
      }
    ],
    "brand_terms": [
      {
        "id": 7,
        "term": "Test Cafe",
        "last_checked_at": "2026-09-26T06:00:00Z",
        "page_one": [
          {
            "position": 1,
            "url": "https://testcafe.com/",
            "domain": "testcafe.com",
            "title": "Test Cafe",
            "yours": true,
            "new": false
          }
        ],
        "lost": []
      }
    ]
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable, validation_failed

Stop watching one profile

DELETE/api/v1/reputation/businesses/{business_id}/profiles/{platform}

Scope reputation:write

Forgets the confirmed profile on one platform (search again to pick another).

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.
platformpathstring (one of: google, trustpilot, tripadvisor)yesThe platform.

Example

curl -s -X DELETE "https://app.pbn.ltd/api/v1/reputation/businesses/business_id/profiles/platform" \
  -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/reputation/businesses/business_id/profiles/platform", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id/profiles/platform", {
  method: "DELETE",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "deleted": true
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable

Read a business now

POST/api/v1/reputation/businesses/{business_id}/refresh

Scope reputation:write

Asks for a fresh reading of every confirmed profile and brand term of this business within the next few minutes. The same bound as the "Read now" button: once per business in the interval the page states (24 hours today). Weekly readings carry on regardless.

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.

Example

curl -s -X POST "https://app.pbn.ltd/api/v1/reputation/businesses/business_id/refresh" \
  -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/reputation/businesses/business_id/refresh", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id/refresh", {
  method: "POST",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

202

{
  "data": {
    "queued": true,
    "id": 41
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable, validation_failed

Watch a brand term

POST/api/v1/reputation/businesses/{business_id}/terms

Scope reputation:write

Adds a brand term whose Google page one is read every week (within your plan's brand terms, up to 10 per business).

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.
termbodystringyesThe search term, e.g. the brand name.

Example

curl -s -X POST "https://app.pbn.ltd/api/v1/reputation/businesses/business_id/terms" \
  -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/reputation/businesses/business_id/terms", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id/terms", {
  method: "POST",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

201

{
  "data": {
    "id": 7,
    "term": "Test Cafe reviews"
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable, validation_failed

Stop watching a brand term

DELETE/api/v1/reputation/businesses/{business_id}/terms/{term_id}

Scope reputation:write

Removes a brand term and its page-one history.

Parameters

NameInTypeRequiredDescription
business_idpathintegeryesThe watched business id.
term_idpathintegeryesThe brand term id.

Example

curl -s -X DELETE "https://app.pbn.ltd/api/v1/reputation/businesses/business_id/terms/term_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/reputation/businesses/business_id/terms/term_id", headers=headers, timeout=120)
print(r.status_code, r.json())
const res = await fetch("https://app.pbn.ltd/api/v1/reputation/businesses/business_id/terms/term_id", {
  method: "DELETE",
  headers: {Authorization: `Bearer ${process.env.PBN_API_KEY}`}
});
console.log(res.status, await res.json());

Response

200

{
  "data": {
    "deleted": true
  }
}

Errors: not_found, rate_limited, scope_missing, unauthorized, unavailable