Migrating from OpenRouter

The developer surface is deliberately OpenRouter-shaped. Three changes, in ascending order of ambition:

1. Change the base URL (that's it)

// before
const client = new OpenAI({ baseURL: "https://openrouter.ai/api/v1", apiKey: OR_KEY });
// after — same code, EU-sovereign supply, signed attestation per request
const client = new OpenAI({ baseURL: "https://neuralring.eu/api/v1", apiKey: NEURALRING_KEY });

`models` fallback arrays, `provider.order/only/ignore/sort`, performance gates with percentiles, and `:floor`/`:nitro` variants work as you expect. Model slugs differ where supply differs — browse the catalog or GET /api/v1/models.

2. Add what OpenRouter can't give you: a jurisdiction pin

await client.chat.completions.create({
  model: "mistralai/mistral-small-2501",
  messages,
  // @ts-expect-error NeuralRing routing extension
  sovereignty: { jurisdiction: ["DE"], min_tier: 1, min_assurance: "verified" },
});

The pin is applied before every preference and can never be loosened by price/speed sorting or variants. `:sovereign` restricts to Tier-0 certified endpoints only.

3. Use the attestation (the reason you switched)

# every response carries x-neuralring-request-id
curl https://neuralring.eu/api/v1/attestations/<requestId>   # signed, hash-chained record
# verify in-browser: /verify/<requestId> · export a range from the dashboard for your auditor

The attestation states the serving endpoint's tier and assurance honestly — a `self_attested` endpoint reads `self_attested`. That honesty is the audit story you hand to compliance.

Full surface: openapi.json · errors: error codes · record-keeping: AI-Act artifacts.