ProductConsole

Cabana Engine docs

Connect your website, prove it is yours, and Engine reads every page, scores it, writes the fixes and puts the approved ones live, in Africa and worldwide.

Quick start

  1. Sign in to the console with your work email and add your website.
  2. Verify it. Engine starts reading it straight away.
  3. Review the score, the issues and the suggested fixes. Approve the ones you like, or switch on automatic approval for safe fixes.
  4. Install the snippet (one line) or use server-side fixes, so approved fixes go live.
  5. Connect Search Console to see the searches you appear for and your positions.

Verify your website

Engine only works on sites you have proven are yours. Use any one of these with the token in your console:

MethodWhat to add
File (recommended)https://yourdomain.com/<token>.txt containing the token. It also turns on instant indexing.
DNS recordA TXT record on your domain (or _cabana.yourdomain.com): cabana-site-verification=<token>
Meta tag<meta name="cabana-site-verification" content="<token>"> on your home page

Every day we check the record is still there and that the site is still the one you registered. If the record goes missing you have seven days to restore it.

How we read your site

Engine reads your pages as CabanaBot: Mozilla/5.0 (compatible; CabanaBot/1.0; +https://cabana.africa/engine/bot). It follows your robots.txt (rules for CabanaBot, then *), reads your sitemaps, and never fills in forms or signs in. See CabanaBot for details.

The snippet

One line before </head> on every page. The key is publishable and only works on your verified site.

<script async src="https://cabana.africa/engine/e.js" data-key="eng_pk_live_…"></script>

It applies the fixes you approved for each page (title, description, canonical, preview cards, structured data, image alt text, language, viewport), then sends one anonymous page view: where the visitor came from, how fast the page was for them, and whether the page content changed. No cookies, no visitor ID and no IP address are kept. Do Not Track and Global Privacy Control switch the report off.

Google runs JavaScript and sees fixes the snippet applies. Some other crawlers and link previews (WhatsApp, for example) do not, so for those use server-side fixes too.

Where to paste it

  • WordPress: a header and footer code plugin → Header.
  • Shopify: Online Store → Themes → Edit code → theme.liquid, before </head>.
  • Wix: Settings → Custom code → Head, all pages.
  • Squarespace: Settings → Advanced → Code injection → Header.
  • Webflow: Project settings → Custom code → Head code.

Server-side fixes

For sites that render on the server (Next.js, Nuxt, Laravel, Django, Rails…), fetch the ready-made tags for a page and print them in its <head>. Cache them for a few minutes.

GET/api/engine/v1/fixes?url=https://yourdomain.com/safaris
curl "https://cabana.africa/api/engine/v1/fixes?url=https://yourdomain.com/safaris" \
  -H "Authorization: Bearer eng_sk_live_…"
# → { "url": "…", "fixes": [ { "kind": "title", "value": { "text": "…" } }, … ], "head_html": "<title>…" }

Approving fixes

Engine writes each fix from your own page: rewritten titles and descriptions never add a price, number or claim that is not already on the page. You choose: approve each one, or let Engine approve the safe kinds automatically (canonical, viewport, preview cards and structured data built from your content). A fix goes live within minutes of approval; undo it at any time.

Instant indexing

When a page changes or a fix goes live, Engine tells Bing, Yandex, Naver, Seznam and other IndexNow search engines at once, using your verification file as the key. Google finds changes through your sitemap and, if connected, Search Console.

Google Search Console

In the console, open your site → Rankings. Copy the service account address shown there and, in Search Console → Settings → Users and permissions, add it as a Restricted user. Engine then reads your searches, clicks, impressions and positions every day. It cannot change anything in Search Console, and you can remove it at any time.

Competitors

Engine finds the sites that actually rank for your keywords in your country and reads their pages the same way it reads yours, so you see their score next to yours, check by check. You can also name competitors yourself. Engine only reads their public pages, as CabanaBot, following their robots.txt.

Speed and traffic

With the snippet installed, each visit reports Core Web Vitals (LCP, CLS, INP), device type and where it came from: search engines, AI assistants, social, email or direct. Without it, Engine uses Google’s public Chrome UX Report when your site has enough traffic.

The Engine Score

Each page is checked against 49 checks in eight areas (technical, on-page, content, structured data, speed, social previews, AI search, and local & Africa) and scored from 0 to 100; the site score weights the pages that matter most. Bands: Excellent 90+, Strong 75–89, Fair 55–74, Weak 35–54, Critical below 35.

Authentication

Base URL https://cabana.africa/api/engine/v1. Send a secret key in Authorization: Bearer eng_sk_… (or X-Api-Key) from your server only.

Endpoints

GET/sites

Your websites with their score, band and last read.

GET/sites/{id}

One site: score, scores by area and a summary of the top issues.

GET/sites/{id}/pages?limit=200

Every page read, worst first, with its score and issues.

POST/sites/{id}/crawl

Read the site again now. Counts towards your plan’s reads.

GET/fixes?url=…

Approved fixes and ready-made head tags for one page. See server-side fixes.

GET/check?url=…

A free, quick check of any public page (no key, limited per minute). The same check as the box on our home page.

Webhooks

EventWhen
engine.crawl.completedA read of your site finished: new score, previous score, pages and top issues
property.verifiedA website was verified
property.updatedIts standing changed in the daily look
pingA test from the console

Each POST carries Cabana-Signature: t=<unix seconds>,v1=<hex>: an HMAC-SHA256 of t + "." + raw body under the endpoint’s signing secret. Reject anything older than five minutes. Failed deliveries are retried after 1, 5 and 30 minutes, then 2, 6 and 24 hours.

import { createHmac, timingSafeEqual } from 'node:crypto';
export function verified(rawBody, header, secret) {
  const p = Object.fromEntries(String(header).split(',').map(x => x.split('=')));
  if (!p.t || Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false;
  const want = createHmac('sha256', secret).update(`${p.t}.${rawBody}`).digest('hex');
  return want.length === String(p.v1).length && timingSafeEqual(Buffer.from(want), Buffer.from(p.v1));
}

Errors and limits

Errors are JSON: { "error": "…", "code": "…" } with 400 (bad request), 401 (invalid_key), 402 (trial_ended), 403 (wrong_key_kind, origin_not_verified), 404, 429 (quota_exceeded). The free trial covers one site, 100 pages per read, 30 reads, 3 competitors and 1,000 API calls a month.