Integrations

The agent fixes any website, not just WordPress

Six ways to let the Umpire Agent apply approved fixes. Every path is logged and reversible, and nothing changes until you approve it.

1

WordPress

Plugin, one click

Install the SEO Umpire plugin, paste the site key from your project, and the agent reads pages and writes titles, descriptions, schema, FAQ blocks, alt text and llms.txt directly, with an activity log and revert inside WordPress.

2

Shopify

Admin API, custom app

Create a custom app in your Shopify admin and paste its Admin API token into your project. The agent writes SEO titles, descriptions, alt text, FAQ blocks and schema into products, collections, pages and articles, and manages robots rules through a theme snippet, every change reversible. Shopify guide.

3

Wix

API key, Stores and Blog

Generate an API key in the Wix Dashboard and paste it with your site id. The agent writes SEO titles, descriptions and structured data into Wix Stores products and blog posts, plus FAQ and content blocks into product descriptions. Editor pages get copy-paste snippets. Wix guide.

4

Webflow

Site token, publish included

Generate a site API token with pages, custom code and sites scopes. The agent writes page SEO titles and descriptions, injects schema and FAQ JSON-LD as page custom code and publishes the site, with revert. Webflow guide.

5

cPanel sites (HTML, PHP)

API token, one click

For sites hosted on cPanel, create an API token (cPanel > Manage API Tokens, Files permission), add it to your project with the host and document root. The agent edits the HTML or PHP file behind each page over HTTPS, writing a backup first, and can write llms.txt and robots.txt. Works for static sites, Laravel public folders and hand-built PHP pages.

6

Next.js, Express, Laravel, any stack

Headless SEO API

Your app asks our API for the approved fixes of a URL at render time and outputs them server-side (real HTML, visible to Google and AI crawlers). Ten lines of code, cached for 5 minutes, zero deploys per fix.

Headless SEO API

GET https://seoumpire.com/api/site/seo?url=<page url> with header X-SEOU-Key. Returns title, description, canonical, schema[], faq[], prepend_html, append_html, images[], internal_links[], llms_txt and robots_append. Only fixes you approved and applied are returned.

Next.js (App Router)
// app/[...slug]/page.tsx (Next.js App Router)
import type { Metadata } from "next";

const KEY = process.env.SEOU_SITE_KEY!;           // from your SEO Umpire project
const BASE = "https://seoumpire.com/api/site/seo";

async function seo(url: string) {
  const r = await fetch(`${BASE}?url=${encodeURIComponent(url)}`, {
    headers: { "X-SEOU-Key": KEY },
    next: { revalidate: 300 },                       // 5 minute cache
  });
  return r.ok ? r.json() : null;
}

export async function generateMetadata({ params }): Promise<Metadata> {
  const url = `https://yourdomain.com/${params.slug.join("/")}`;
  const s = await seo(url);
  return {
    title: s?.title ?? "Default title",
    description: s?.description ?? "Default description",
    alternates: { canonical: s?.canonical ?? url },
  };
}

export default async function Page({ params }) {
  const url = `https://yourdomain.com/${params.slug.join("/")}`;
  const s = await seo(url);
  return (
    <>
      {s?.schema?.map((obj, i) => (
        <script key={i} type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(obj) }} />
      ))}
      {s?.prepend_html && <div dangerouslySetInnerHTML={{ __html: s.prepend_html }} />}
      {/* your page */}
      {s?.append_html && <div dangerouslySetInnerHTML={{ __html: s.append_html }} />}
    </>
  );
}
PHP / Laravel / any PHP theme
<?php // header.php (Laravel Blade, WordPress theme, plain PHP)
function seou($url) {
  $ch = curl_init("https://seoumpire.com/api/site/seo?url=" . urlencode($url));
  curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5,
    CURLOPT_HTTPHEADER => ["X-SEOU-Key: " . getenv("SEOU_SITE_KEY")]]);
  $out = json_decode(curl_exec($ch), true); curl_close($ch);
  return $out ?: [];
}
$seo = seou((isset($_SERVER["HTTPS"]) ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"] . strtok($_SERVER["REQUEST_URI"], "?"));
?>
<title><?= htmlspecialchars($seo["title"] ?? "Default title") ?></title>
<meta name="description" content="<?= htmlspecialchars($seo["description"] ?? "") ?>">
<?php foreach ($seo["schema"] ?? [] as $obj): ?>
<script type="application/ld+json"><?= json_encode($obj) ?></script>
<?php endforeach; ?>
Express / Node
// Express / Node: resolve once per request, cache 5 minutes
const cache = new Map();
app.use(async (req, res, next) => {
  const url = "https://yourdomain.com" + req.path;
  const hit = cache.get(url);
  if (hit && hit.t > Date.now() - 300000) { res.locals.seo = hit.v; return next(); }
  const r = await fetch("https://seoumpire.com/api/site/seo?url=" + encodeURIComponent(url), { headers: { "X-SEOU-Key": process.env.SEOU_SITE_KEY } });
  const v = r.ok ? await r.json() : {};
  cache.set(url, { t: Date.now(), v }); res.locals.seo = v; next();
});
// then in your template: <title><%= seo.title %></title> ...
Connect your site in the dashboard

Projects > your site > Connection. WordPress, Shopify, Wix, Webflow, cPanel or headless: pick one and connect.

Open projects