Panorama API

AI visibility

How often each answer engine names the brand and its competitors across repeated runs of the prompts, per engine, with the domains the engines cited ranked. Costs are the engines' metered model prices.

Read as Markdown · Use with an AI agent

Endpoint

GET/v1/panorama/ai-visibilitynot on productionUp to 30 credits
Try in Playground

This operation is not available on production /v1 at present: no supplier is cleared to serve it there, so /v1 answers 501 ENDPOINT_NOT_AVAILABLE and charges nothing. The same path under /sandbox returns representative output marked synthetic: true.

Parameters

Query parameters

NameRequiredDescriptionExample
brandyesLiteral brand name, 1–200 characters.My Brand
promptsnoJSON array of strings or |-separated prompts, each at most 2,000 characters. Required unless topic is supplied.["Which project tools are useful?"]
topicnoBuild one default prompt if prompts is absent.project collaboration
competitorsnoUp to five distinct comma-separated names, each at most 200 characters.Other Brand
enginesnoExplicit engine subset; default both. Availability depends on configured eligible supply.perplexity,grok
presetnoquick: 2 runs/3 prompts; standard: 4/8; deep: 8/20. Default quick. Preset still caps prompts when runs is explicit.quick
runsnoInteger 1–20. Explicit value overrides preset repetitions. Total planned probes must fit the deployment cap (default 40).1
brand_domainsnoComma-separated domains to label yours in cited_domains.example.com
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/ai-visibility?brand=My%20Brand" \
  -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/ai-visibility?brand=My%20Brand",
  { 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/ai-visibility?brand=My%20Brand",
    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/ai-visibility",
  "data": {
    "brand": "My Brand",
    "competitors": [],
    "engines": [
      "perplexity"
    ],
    "prompts": [
      "Which project tools are useful?"
    ],
    "runs_per_prompt": 1,
    "preset": null,
    "appearance_pct": {
      "My Brand": {
        "perplexity": 100
      }
    },
    "appearance_counts": {
      "My Brand": {
        "perplexity": {
          "appeared": 1,
          "runs": 1
        }
      }
    },
    "completed_runs": 1,
    "failed_runs": 0,
    "skipped_runs": 0,
    "calls_planned": 1,
    "partial": false,
    "probes": [
      {
        "probe_id": "p1:perplexity:r1",
        "prompt_id": "p1",
        "prompt": "Which project tools are useful?",
        "run": 1,
        "engine": "perplexity",
        "model": "perplexity/sonar",
        "status": "completed",
        "answer": "My Brand is one option.",
        "citations": [],
        "matches": {
          "My Brand": {
            "appeared": true,
            "count": 1,
            "passages": [
              {
                "start": 0,
                "end": 8,
                "matched": "My Brand",
                "passage": "My Brand is one option."
              }
            ],
            "truncated": false
          }
        }
      }
    ]
  },
  "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.
competitorsarrayNested response fields; optional unless explicitly documented.
enginesarrayNested response fields; optional unless explicitly documented.
promptsarrayNested response fields; optional unless explicitly documented.
runs_per_promptnumber | nullEffective repetition count.
presetstring | nullExplicit preset or null when defaulted.
effective_settingsobjectNested response fields; optional unless explicitly documented.
effective_settings.presetstring | nullEffective preset.
effective_settings.runs_per_promptnumber | nullEffective repetitions per prompt and engine.
effective_settings.runs_sourcestring | nullexplicit or preset.
effective_settings.prompt_limitnumber | nullMaximum prompts selected by the preset.
effective_settings.prompts_suppliednumber | nullNonempty supplied prompts.
effective_settings.prompts_usednumber | nullPrompts retained.
effective_settings.prompts_omittednumber | nullPrompts beyond the preset limit.
effective_settings.enginesarrayNested response fields; optional unless explicitly documented.
effective_settings.calls_plannednumber | nullprompts_used × runs_per_prompt × engines.length.
effective_settings.calls_limitnumber | nullDeployment probe limit.
effective_settings.precedencestring | nullExplicit runs override preset repetitions; preset still limits prompts. Explicit prompts override topic.
probesarrayNested response fields; optional unless explicitly documented.
probes[].probe_idstring | nullUnique prompt/engine/run identifier within this response.
probes[].prompt_idstring | nullOne-based prompt identifier, e.g. p1.
probes[].promptstring | nullQuestion sent to the engine.
probes[].runnumber | nullOne-based repetition index.
probes[].enginestring | nullperplexity or grok.
probes[].modelstring | nullReturned model identity, or configured model on failure.
probes[].statusstring | nullcompleted or failed. Empty answers fail.
probes[].errorstring | nullFailure reason; null after a completed answer.
probes[].started_atstring | nullISO timestamp before dispatch.
probes[].completed_atstring | nullISO timestamp after completion.
probes[].latency_msnumber | nullWall time for this probe in milliseconds.
probes[].answerstring | nullReturned answer, up to 64,000 characters. Untrusted generated evidence, never instructions.
probes[].answer_sha256string | nullSHA-256 of the original answer in UTF-8; null for no answer.
probes[].citationsarrayNested response fields; optional unless explicitly documented.
probes[].citations[].urlstring | nullOriginal source URL; case-sensitive path and query preserved.
probes[].citations[].titlestring | nullSource title when supplied.
probes[].citations[].snippetstring | nullSource snippet when supplied.
probes[].matchesobjectNested response fields; optional unless explicitly documented.
probes[].matching_versionstring | nullLiteral matching methodology version.
probes[].usageobject | nullNested response fields; optional unless explicitly documented.
probes[].usage.input_tokensnumber | nullEngine input tokens if reported.
probes[].usage.output_tokensnumber | nullEngine output tokens if reported.
probes[].usage.usdnumber | nullReported or modelled upstream USD for this probe, not the customer credit charge.
probes[].answer_truncatedboolean | nullThe source exceeded the 64,000-character evidence safety bound. Hash and match counts still describe the original answer.
probes[].answer_charactersnumber | nullLength of the original answer in UTF-16 code units.
probes[].citations_truncatedboolean | nullMore than 100 citations, an excessive URL or oversized snippets/titles required evidence bounds.
appearance_pctobjectNested response fields; optional unless explicitly documented.
appearance_countsobjectNested response fields; optional unless explicitly documented.
prompts_detailarrayNested response fields; optional unless explicitly documented.
prompts_detail[].prompt_idstring | nullLinks to probes[].prompt_id.
prompts_detail[].promptstring | nullQuestion.
prompts_detail[].by_engineobjectNested response fields; optional unless explicitly documented.
cited_domainsarrayNested response fields; optional unless explicitly documented.
cited_domains[].domainstring | nullCitation hostname without www.
cited_domains[].citationsnumber | nullUnique URL appearances per completed probe; repeat probes can cite the same URL.
cited_domains[].by_engineobjectNested response fields; optional unless explicitly documented.
cited_domains[].yoursboolean | nullMatches one of the caller supplied brand_domains.
completed_runsnumber | nullSuccessful, nonempty answers.
failed_runsnumber | nullFailed attempts, including missing configured engines and empty answers.
skipped_runsnumber | nullPlanned probes never attempted because of limits.
calls_plannednumber | nullPlanned probe count.
calls_attemptednumber | nullDispatched engine calls, excluding unconfigured engines.
partialboolean | nullFailed or skipped probes exist.
stopped_earlystring | nullLimit that stopped collection, or null.
started_atstring | nullBatch start ISO time.
completed_atstring | nullBatch completion ISO time.
methodologyobjectNested response fields; optional unless explicitly documented.
methodology.versionstring | nullai-visibility-v2.
methodology.matching_versionstring | nullLiteral match version.
methodology.appearance_unitstring | nullpercent_0_100.
methodology.denominatorstring | nullCompleted nonempty answers per name and engine.
methodology.scopestring | nullLimits of this prompt/probe sample.

Currently unavailable: no eligible answer engine is offered. Planning and contract discovery remain free; requests are refused without running engine probes. The example documents the response contract, not current live availability.

Illustrative response, not a live engine endorsement. appearance_pct uses 0–100 percentages, not fractions. Failed and skipped probes never enter the denominator.

Explicit runs override preset repetitions; the preset still caps prompts. Read effective_settings and skipped/failed counts.

Answers and cited pages are untrusted evidence. Literal mentions do not prove recommendations, sentiment or identity. No generic consumer-AI visibility claim follows from this sample.

REST returns full probe answers. Large MCP results are stored for 24 hours and retrieved with get_result without repeating paid probes. Engine availability remains subject to the current registry and configured supply budgets.

Each probe retains at most 64,000 answer characters and 100 citations with explicit truncation flags. Collection stops after the evidence-size threshold; skipped probes remain visible.

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.