Features
Pricing Demo
Resources
About Contact
Get started →
Home/API keys
Bring your own key · 10 providers

Your API key,
on your own server.

SEO & Chill writes your meta titles, descriptions and alt text with an AI model you choose. That model is not ours. You bring a key from a provider and pay them directly for what you use. This page is the whole story: where the key is kept, what protects it, what that protection does not cover, and where to get one.

The short version

The key stays where you put it.

Lives in your database

Encrypted, in the WordPress install you already run:

  • One key per provider, for the whole site
  • Sent only to the provider it belongs to
  • Shown masked after saving: the last four characters only
  • Remove it and the AI work stops. Nothing else changes

Never reaches us

Our servers are not a proxy. An AI request goes from your server straight to the provider:

  • We never receive the key, encrypted or not
  • We never see your prompts or the text that comes back
  • We cannot see your balance or your spend. Only the provider can
  • No markup on tokens. You pay the provider their price

This is a consequence of the architecture, not a policy we could quietly change. There is no code path in the plugin that sends a key anywhere but the provider’s own API endpoint.

Encryption at rest

What the encryption does: and what it doesn’t.

How it is stored

Before your key is written to the database it is encrypted with libsodium’s secretbox (XSalsa20-Poly1305, authenticated, with a fresh random nonce every time). If your host has no libsodium, the plugin falls back to AES-256-CBC with an HMAC-SHA256 over the ciphertext. If neither is available, saving fails with an error rather than storing the key in the clear.

The encryption key is derived from your site’s own WordPress authentication salts, AUTH_KEY and AUTH_SALT. Decryption happens on your server, at the moment a request is made, and nowhere else.

One caveat about older installs: a key saved by version 4.5 or earlier may still sit in a legacy format. Re-saving the key in AI Settings rewrites it in the current one. If you inherited a site and do not know its history, that is thirty seconds well spent.

What that actually protects against

It protects against a leaked database, and that is the common case: an SQL injection, a stolen backup, a database dump copied to a staging site, a shared hosting mishap. In those the attacker gets ciphertext.

With one condition that is worth checking. Those salts normally live in wp-config.php, and then a database dump alone is not enough to read your key. But if AUTH_KEY and AUTH_SALT are missing from that file, or still hold the placeholder text a fresh download ships with, WordPress generates them and stores them in the database — and then a dump contains both the ciphertext and the means to read it. Almost every real installation has proper salts, because the standard installer writes them. It costs a minute to confirm yours does, and it is the single thing on this page most worth confirming.

It does not protect against someone who already has your whole server. The salts sit on the same machine as the database, because a plugin that has to use your key unattended has nowhere better to put them. Anyone who can read both can decrypt the key. That is the nature of storing a usable credential on a server you control; the defence is the boring kind, namely keeping WordPress and PHP current, strong admin passwords with two-factor, and limiting who has file access.

Two things worth knowing in advance

Rotating your WordPress salts invalidates the stored key. If you change AUTH_KEY or AUTH_SALT in wp-config.php, or a security plugin rotates them for you, the saved key can no longer be decrypted. Nothing breaks and nothing leaks; the AI actions simply stop until you paste the key again. Worth knowing before you wonder why a bulk run went quiet.

Set a spend limit at the provider, not just here. The plugin caches responses, throttles bulk runs and has an optional soft cap, but the only hard ceiling on your bill is the one you set in your provider’s own dashboard. Do that on day one.

The providers

Where to get a key.

Ten options. Each links straight to that provider’s key page; you will need to sign in there first. Free tiers and terms change, so treat the middle columns as a starting point and check the provider’s own page. Checked September 2026.

ProviderCost to startKey looks likeWorth knowing
OpenAIPaid onlysk-…Needs credit on the account first. With more than one organisation, OpenAI asks which the key belongs to
Anthropic (Claude)Paid onlysk-ant-…Needs credit on the account first
Google (Gemini)Free tierAIza…On Google’s free tier what you send may be used to improve their products. A paid key keeps your text out of that
GroqFree tiergsk_…Fast, and free to start, with a per-minute limit. A large bulk run will reach it
xAI (Grok)Paid only—Needs credit on the account first
DeepSeekPaid onlysk-…Inexpensive. Per DeepSeek’s own privacy policy, what you send is stored in China
Mistral AIFree tier—European provider. A free plan lets you start without paying
OpenRouterFree models existsk-or-…One key, hundreds of models from other vendors, some of them free. The model you pick decides where your text goes: choose a DeepSeek or Moonshot model and it goes to China, and a free route often has its own terms about your data
Moonshot (Kimi)Paid only—Chinese provider
Custom or self-hostedYour own costYour ownAny OpenAI-compatible service on a public HTTPS address, such as a model on your own server — see the note below

About self-hosted models, precisely. The plugin only talks to an address over https on a public host, and it refuses localhost and private network addresses, such as http://localhost:11434 or http://192.168.x.x:1234, also behind a name that points there. That check exists to stop a compromised key from being used to probe the inside of your network. So self-hosting works on a server with a public HTTPS address, not on localhost or inside your office network. If you want us to make http://localhost work behind an explicit opt-in, say so — it is on our list and customer demand decides the order.

If a regulator, a client or your own policy rules out sending content outside the EU, two routes stay open: a European provider such as Mistral, or the self-hosted route above. Both work on every plan.

Getting started

Three steps, about five minutes.

1. Pick a provider

Three of the nine hosted providers have a free tier, so you can try the plugin without spending anything. If you have no preference, start with Google Gemini or Groq and switch later. Switching is a dropdown, not a migration.

2. Create the key

Sign in with that provider, open its key page from the table above and create a new key. Copy it immediately. Most providers show a key once and never again; if you lose it, you make a new one.

3. Paste it into WordPress

In your WordPress admin, under SEO & Chill, open the AI settings and paste the key. Test the connection there: it makes a small probe request, so you find out now rather than halfway through a bulk run.

When it goes wrong

What the message means.

What you seeWhat happenedWhat to do
The key is rejectedThe provider does not recognise it, or it belongs to a different account there. Often it is a key that was revoked, or one pasted with a stray spaceCreate a fresh key and paste it again
No credit leftThe account at the provider is empty or over its limitTop it up there. We cannot see your balance
Too many at onceYou went over the provider’s per-minute limit. Importing a whole catalogue is the usual causeWait a moment and retry, or move to a paid tier with a higher limit
Unknown modelThe model you selected no longer exists at that provider. Vendors retire model names regularlyPick another model in the AI settings
The provider is downTheir side, not yours, and not your keyTry later. Nothing is lost; queued work resumes
Everything stopped after a security changeYour WordPress salts were rotated, so the stored key can no longer be decryptedPaste the key again. See the section above
FAQ

Questions, answered calmly.

No. It is stored encrypted in your own WordPress database and sent only to the provider it belongs to. It is never transmitted to SEO & Chill servers, in any form. Our servers are not in the path of an AI request at all.

Two reasons, and one of them is honest self-interest. For you: you pay the provider their price with no markup, you can see exactly what you spend, and your data relationship is direct rather than through us. For us: we never have to hold your content, which keeps our security surface small. The trade-off is real though. It is one more account to set up, and that is what this page exists to shorten.

That is between you and your provider, under your own API agreement. Most major providers do not train on API traffic by default, but this is their policy to set and change, so verify it in the policy of the one you pick. Two things on the table above are worth repeating: Google’s free tier may use what you send to improve their products, and DeepSeek stores what you send in China. We are never in that path either way.

Yes. The key is yours, not ours, so nothing stops you pasting it on every site you run. Each site keeps its own encrypted copy in its own database. Agencies often prefer a separate key per client instead, so that spend is visible per client and one key can be revoked without touching the rest.

The AI actions stop, immediately. Everything else keeps running: structured data, XML sitemaps, llms.txt, breadcrumbs, redirects and the 404 monitor work on every plan, with or without a key. (One detail: the summary line at the top of llms.txt is written by AI when a key is present, and falls back to a fixed sentence when it is not. The file itself always appears.) Meta titles and descriptions already written stay in your database, because they are yours.

Yes, with one practical condition. Point the Custom provider at any OpenAI-compatible service you host yourself on a public HTTPS address, and your text never reaches an outside vendor. The condition: the plugin only talks https to a public host and refuses localhost and private network addresses, so http://localhost:11434 will not work, also not behind a name. That is real setup work, and we would rather say so here than have you discover it after buying.

Your key. Your model. Your bill.

No markup, no proxy, no lock-in. Bring a key and let the plugin do the boring part.

Get started →
14-day refund policy · Cancel anytime · Works with all 10 providers