Panorama API

Brand reputation across sources

A brand's reputation across Trustpilot, both app stores, its Google Business listing, TripAdvisor when a place is given and the news echo, blended into a published-weight composite score with company and product axes, per-source ratings and samples, and, on request, themed praise and complaints.

Read as Markdown · Use with an AI agent

Endpoint

GET/v1/panorama/reputationlive · provenUp to 30 credits
Try in Playground

Parameters

Query parameters

NameRequiredDescriptionExample
brandyesBrand or company nameMonzo
trustpilot_domainnoThe brand's Trustpilot page domain (skips the Trustpilot search)monzo.com
sourcesnoSources to include (tripadvisor when place is set)trustpilot,app_store,google_play,google_business,news
countrynoStorefront country for the app storesgb
depthnoReviews per source in the sample, 1 to 5020
app_store_idnoApp Store id (skips the app search)1052238659
google_play_idnoPlay package (skips the app search)co.uk.getmondo
placenoA TripAdvisor page URL to add as a source
includenothemes: a model pass that names recurring praise and complaints with verbatim quotesthemes
dry_runnoRead a zero-credit estimate without fetching sources, running AI, or reserving credits. Cache status is a snapshot, not a guarantee at execution.1

Examples

Make the request

curl
curl "https://www.monocrawl.com/v1/panorama/reputation?brand=Monzo" \
  -H "x-api-key: mn_your_key_here"
TypeScript
typescript
const key = process.env.MONOCRAWL_API_KEY;
if (!key) throw new Error('Set MONOCRAWL_API_KEY on your server.');
const res = await fetch(
  "https://www.monocrawl.com/v1/panorama/reputation?brand=Monzo",
  { headers: { "x-api-key": key } },
);
const body = await res.json();

if (!body.success) {
  // one error shape for every endpoint — see /docs/errors
  throw new Error(`${body.error.type}: ${body.error.message}`);
}

console.log(body.data, "credits left:", body.credits_remaining);
Python
python
import os
import requests

res = requests.get(
    "https://www.monocrawl.com/v1/panorama/reputation?brand=Monzo",
    headers={"x-api-key": os.environ["MONOCRAWL_API_KEY"]},
    timeout=60,
)
body = res.json()

if not body["success"]:
    # one error shape for every endpoint — see /docs/errors
    raise RuntimeError(f"{body['error']['type']}: {body['error']['message']}")

print(body["data"], "credits left:", body["credits_remaining"])

Response

Response fields and example

This example is illustrative, not a captured live response. Variable-cost operations may settle a charge different from the list price below. A successful response puts the platform payload in data and reports the exact credits used, remaining balance, request id and cache status beside it.

200 · application/json
{
  "success": true,
  "platform": "panorama",
  "endpoint": "/v1/panorama/reputation",
  "data": {
    "brand": "My Brand",
    "identity_resolution": {
      "app_store": {
        "status": "explicit",
        "selected_id": "123456789",
        "kind": "app",
        "ownership_verified": false,
        "basis": "caller_supplied_identifier",
        "variant_status": null,
        "candidates_examined": 0,
        "compatible_candidates": 0,
        "candidates": []
      }
    },
    "sources": {
      "app_store": {
        "axis": "product",
        "app_id": "123456789",
        "name": "My Brand",
        "rating": 4,
        "sample_mean": null,
        "sample_size": 0
      }
    },
    "composite_score": 4,
    "axes": {
      "company": null,
      "product": 4
    },
    "reviews": [],
    "count": 0,
    "news": null,
    "themes": null
  },
  "credits_used": 30,
  "credits_remaining": 99,
  "request_id": "req_…",
  "cached": false
}

The example uses fictional values and shows a documented subset of data. The fields below are optional across supported sources; nullable fields can also be absent. Preserve unknown values and accept additional fields.

Download the data JSON Schema. Validate response.data, not the whole envelope. A valid shape does not establish that every field or source record was returned.

Field inside dataTypeMeaning
brandstring | nullRequested brand.
identity_resolutionobjectNested response fields; optional unless explicitly documented.
composite_scorenumber | nullConfigured weighted mean of available source ratings; not a verified brand-wide reputation score.
axesobjectNested response fields; optional unless explicitly documented.
axes.companynumber | nullWeighted mean of company-scope inputs present.
axes.productnumber | nullWeighted mean of product/app-scope inputs present.
weightsobjectNested response fields; optional unless explicitly documented.
sourcesobjectNested response fields; optional unless explicitly documented.
newsobject | nullNested response fields; optional unless explicitly documented.
reviewsarrayNested response fields; optional unless explicitly documented.
reviews[].sourcestring | nullOriginal source.
reviews[].axisstring | nullproduct or company; product-reviews records carry this field.
reviews[].product_idstring | nullAmazon ASIN for product evidence.
reviews[].company_domainstring | nullCompany domain for Trustpilot evidence.
reviews[].variant_scopestring | nullsource_may_pool_variants for Amazon records.
reviews[].idstring | nullOriginal review identifier, or null.
reviews[].ratingnumber | nullSource rating on its documented scale.
reviews[].titlestring | nullOriginal review title.
reviews[].textstring | nullReturned review text, bounded by the workflow text cap.
reviews[].posted_atstring | nullReturned review date, or null.
reviews[].urlstring | nullOriginal review link, or null.
reviews[].verifiedboolean | nullSource-supplied verification label, not Monocrawl verification.
countnumber | nullRetained review sample size.
themesobject | nullNested response fields; optional unless explicitly documented.
legsarrayNested response fields; optional unless explicitly documented.
_warningsarrayNested response fields; optional unless explicitly documented.

identity_resolution reports bounded lexical discovery over at most100 already-returned candidates. At most10 candidate summaries are displayed; compatible_candidates can be larger. Matching uses the supplied name, brand, model and variant terms; it does not infer aliases or verify ownership.

Explicit identifiers take precedence. Distinct compatible identities remain ambiguous, even when one title is an exact lexical match. No first-result fallback is used. When no source can be confidently matched and read, the response is an error with identity_resolution in error details.

Provider refusal, deadline or funding limits remain source_unavailable. That is not evidence that the requested entity does not exist. No additional AI or supplier identity calls are made.

Identity decisions cover Trustpilot, App Store, Google Play and Google Business discovery. Explicit app IDs and Trustpilot domains bypass query selection. TripAdvisor uses the supplied place URL; news remains keyword discovery and has no entity-verification promise. Inspect source-specific scopes and company/product axes before interpreting the combined rating.

Failures use the typed error envelope. A confirmed uncharged or refunded failure reports zero; a pending reconciliation can report an unknown charge. Read credits_used and error.details.billing_status, and keep request_id for recovery. Response contract · Error reference

First call in under a minute

1,000 monthly free credits and a ready-made key the moment you sign up. No card.