BrandGEO API v1 + Official Laravel Client: Pull AI Visibility Data Into Your Stack — BrandGEO     A Markdown version of this page is available at https://brandgeo.co/blog/brandgeo-api-v1-laravel-client.md, optimized for AI and LLM tools. 

 [ Tutorials ](https://brandgeo.co/blog/category/tutorials) [ Product Updates ](https://brandgeo.co/blog/category/product-updates) ·  August 3, 2026  ·     4 min read  

 Your AI Visibility Data, Now an API: BrandGEO API v1 and the Official Laravel Client 
======================================================================================

 A read-only REST API with a frozen v1 contract, plus a typed Laravel SDK. Pull your scores, audits, and monitoring data into any dashboard, report, or pipeline you already run.

   Visibility data is only useful where decisions happen. For some teams that's the BrandGEO dashboard. For others it's a BI tool, a client report generated on a schedule, or an internal admin panel that already tracks every other marketing number. API v1 opens the platform for that second group: every brand, audit, monitor, snapshot, and trend in your account, available over REST with a bearer key. This post covers the business case, the full endpoint tour, and the official Laravel client that wraps it all in typed PHP. 

Every metric your team acts on eventually leaves the tool that produced it. Search rankings end up in weekly decks. Ad spend lands in a BI warehouse. Revenue lives in three dashboards at once. Data that stays locked inside its own product gets checked when someone remembers, which in practice means less and less often.

We didn't want AI visibility to be that metric. So BrandGEO now ships a public API: **API v1**, a read-only REST interface over everything your account already contains, plus an official Laravel client that turns it into typed PHP.

What this unlocks
-----------------

A few concrete uses, all pulled from why we built it:

- **BI and reporting.** Pipe visibility scores and share-of-voice numbers into the warehouse next to traffic and revenue, and let your existing reporting stack chart the trend.
- **Client dashboards.** Agencies can render BrandGEO data inside their own branded portals. Our [Nova dashboard package](/blog/brandgeo-laravel-nova-dashboard) does exactly this, and it's built entirely on the public API described here, with no private endpoints.
- **Internal alerting.** Poll weekly snapshots and raise a Slack message from your own tooling when a score moves.
- **Automated deliverables.** Generate a monthly summary per brand from audits and trend data, on your schedule and in your format.

Two design decisions matter for anyone building on top of this:

**It's read-only.** The API reports; it doesn't mutate. You can't create audits or edit monitors through it, which keeps the security surface small. A leaked key can read your visibility data, not burn your audit quota.

**The v1 contract is frozen.** Fields may be added over time, but nothing in v1 gets renamed or removed. Breaking changes would ship as `/api/v2`. Code written against v1 today keeps working.

Keys, limits, and access
------------------------

Authentication is a bearer token. Each user generates one API key at **Settings → API** in the BrandGEO app. The key is shown once and stored hashed (sha256), and regenerating immediately revokes the previous one.

The key inherits your account's plan and paywall state. Rate limits are 120 requests per minute on paid and free accounts, and 30 per minute on trials. A `429` response includes `Retry-After` and `X-RateLimit-*` headers, so well-behaved clients can back off automatically.

The endpoint tour
-----------------

Base URL: `https://brandgeo.co/api/v1`. Single resources come wrapped as `{"data": {...}}`, lists add `links` and `meta`.

```
GET https://brandgeo.co/api/v1/account
Authorization: Bearer 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

```

```json
{
  "data": {
    "id": 1, "name": "...", "email": "...",
    "subscription": {"status": "active", "plan": "Business", "has_full_access": true},
    "quota": {"brands": 3, "audits_per_month": 10, "trend_history_days": 90},
    "usage": {"brands": 2, "audits_this_month": 4, "audits_remaining": 6}
  }
}

```

The full surface is 13 endpoints:

EndpointWhat you get`GET /account`Subscription, quota, and usage`GET /brands` · `GET /brands/{uuid}`Brands with latest-audit and monitor summaries`GET /audits`Filterable by `brand` and `status``GET /audits/{uuid}`Full audit with per-engine reports and recommendations`GET /audits/{uuid}/reports`Lightweight per-engine status, ideal for polling`GET /monitors` · `GET /monitors/{uuid}`Monitors with latest snapshot`GET /monitors/{uuid}/competitors`Tracked competitors`GET /monitors/{uuid}/prompt-templates`Standard and custom tracked queries`GET /monitors/{uuid}/runs`Individual AI answers with mentions, sentiment, citations`GET /monitors/{uuid}/snapshots`Weekly visibility snapshots, overall or per engine`GET /monitors/{uuid}/trend`Daily score series, clamped to your plan's historyLists use page-based pagination (`?page=`, `?per_page=`, max 100) except the two high-volume feeds, runs and snapshots, which use cursors. Errors follow plain HTTP semantics: `401` for a bad key, `402` when a lapsed subscription blocks detail data, `422` for invalid query params, and `404` for a resource that's missing *or* belongs to someone else. That last one is deliberate: the API never confirms that another account's UUID exists.

The Laravel client
------------------

You can call all of that with any HTTP library. If your stack is Laravel, the official SDK saves you the boilerplate:

```bash
composer require a2zwebltd/brandgeo-laravel-client

```

Add the key to `.env` and you're connected:

```dotenv
BRANDGEO_API_KEY=1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

```

```php
use A2ZWeb\BrandGeoClient\Facades\BrandGeo;

$account = BrandGeo::account()->get();
$account->subscription->status;   // SubscriptionStatus::Active
$account->usage->auditsRemaining;

```

Everything comes back as readonly DTOs with string-backed enums and `CarbonImmutable` dates, so your IDE knows the shape of every response and a typo becomes a static-analysis error instead of a production surprise:

```php
use A2ZWeb\BrandGeoClient\Enums\AuditStatus;

$audit = BrandGeo::audits()->list(status: AuditStatus::Done)->items[0];
$audit = BrandGeo::audits()->get($audit->uuid);

foreach ($audit->reports as $report) {
    if ($report->isLocked()) {
        continue; // trial paywall stub
    }
    $report->provider;         // Provider::Openai, Anthropic, Gemini, Xai, DeepSeek
    $report->normalizedScore;  // 0–100
    $report->grade;            // A–F
}

```

Pagination is handled for you, including a `lazy()` bridge to Laravel collections for large result sets:

```php
BrandGeo::monitors()->runs($uuid)
    ->lazy()
    ->take(500)
    ->filter(fn ($run) => $run->brandMentioned)
    ->each(fn ($run) => /* ... */);

$trend = BrandGeo::monitors()->trend($uuid, days: 90);
$trend->daysApplied; // clamped to your plan's history window

```

Each HTTP error maps to its own exception (`AuthenticationException`, `SubscriptionRequiredException`, `RateLimitException` with `retryAfter`, and so on), so error handling reads like intent instead of status-code checks. The client routes through Laravel's HTTP factory, which means `Http::fake()` works in your tests without any custom mocking.

One more method exists specifically for agencies managing keys for multiple client accounts:

```php
foreach ($customers as $customer) {
    $client = BrandGeo::withApiKey($customer->brandgeo_api_key);
    $client->brands()->list();
}

```

`withApiKey()` returns an immutable clone, so the app-wide singleton never changes underneath you.

Getting started
---------------

The API is available now on every account. Generate a key at Settings → API, make your first `GET /account` call, and you have live data in under a minute. The full contract, including every field of every resource and a downloadable OpenAPI spec, lives at [brandgeo.co/developers](https://brandgeo.co/developers), and the client source is on [GitHub](https://github.com/a2zwebltd/brandgeo-laravel-client).

If you build something on it, tell us; requests from API users decide which endpoints ship next.

### Keywords

 [ #API ](https://brandgeo.co/blog/tag/api) [ #Laravel ](https://brandgeo.co/blog/tag/laravel) [ #Integrations ](https://brandgeo.co/blog/tag/integrations) [ #Automation ](https://brandgeo.co/blog/tag/automation) 

 [ View all tags → ](https://brandgeo.co/blog/tags) 

### See how AI describes your brand

 BrandGEO runs structured prompts across ChatGPT, Claude, Gemini, Grok, and DeepSeek — and scores your brand across six dimensions. Two minutes, no credit card.

 [ Run a free audit  ](https://brandgeo.co/register) [ See plans ](https://brandgeo.co/pricing) 

  On this page

Topics

- [ AI Visibility 25 ](https://brandgeo.co/blog/category/ai-visibility)
- [ Brand Strategy 11 ](https://brandgeo.co/blog/category/brand-strategy)
- [ SEO 20 ](https://brandgeo.co/blog/category/seo)
- [ Tutorials 20 ](https://brandgeo.co/blog/category/tutorials)
- [ Industry Insights 10 ](https://brandgeo.co/blog/category/industry-insights)
- [ Market Research 7 ](https://brandgeo.co/blog/category/market-research)
- [ Strategy &amp; ROI 9 ](https://brandgeo.co/blog/category/strategy-roi)
- [ For Agencies 2 ](https://brandgeo.co/blog/category/for-agencies)
- [ Product Updates 2 ](https://brandgeo.co/blog/category/product-updates)

  Keep reading

Related posts
-------------

 [ Browse all posts  ](https://brandgeo.co/blog) 

  [ ![BrandGEO](/brandgeo-transparent-on-black-926x268.png) 

 ](https://brandgeo.co/blog/brandgeo-laravel-nova-dashboard) Tutorials Aug 3, 2026 

###  [Put BrandGEO Inside Your Laravel Nova Admin](https://brandgeo.co/blog/brandgeo-laravel-nova-dashboard) 

Most teams that run Laravel Nova live in it. It's where they check orders, users, content, and every number that matters day to day. AI visibility data shouldn't require leaving that room. Our new package, a2zwebltd/brandgeo-laravel-nova, adds a BrandGEO section to your Nova menu: monitoring KPIs, visibility trends, share of voice, competitor tables, citation sources, and full audit drill-downs, all fetched live from the BrandGEO API with your key. Here's what it looks like and how to install it in about five minutes.

   [ ![BrandGEO](/brandgeo-transparent-on-black-926x268.png) 

 ](https://brandgeo.co/blog/win-reddit-searches-without-posting) SEO Jul 1, 2026 

###  [How to Win the "Reddit" Searches AI Runs — Without Ever Posting on Reddit](https://brandgeo.co/blog/win-reddit-searches-without-posting) 

There are two ways to influence the reddit-flavored searches that AI models run before they recommend a brand. The first is to earn genuine presence on Reddit itself — slow, community-driven, measured in quarters. The second is far less discussed: build your own pages that rank for the "\[query\] reddit" searches, so your content lands in the model's source set alongside the threads. This post is about the second lever — how to do it well, where the ethical line sits, and how AI brand monitoring tells you which queries to target and whether you're winning them.

   [ ![BrandGEO](/brandgeo-transparent-on-black-926x268.png) 

 ](https://brandgeo.co/blog/auditing-your-own-site-for-ai-robots-llms-jsonld) SEO Jun 6, 2026 

###  [Auditing Your Own Site for AI: robots.txt, llms.txt, JSON-LD, and the Four Gates of Citation](https://brandgeo.co/blog/auditing-your-own-site-for-ai-robots-llms-jsonld) 

Most AI-visibility advice points outward — earn citations, get on Wikipedia, court the review platforms. All worthwhile. But there's a cheaper, faster lever sitting right under you: your own website. If a model can't retrieve your pages, can't rank them, can't extract clean claims from them, or can't attribute those claims back to you, no amount of off-site work fully compensates. This is a practitioner's walkthrough of the on-site AI audit — the files and signals that matter, organized around the four gates an answer has to pass through to cite you.
