⚠ markdown package not installed — serving raw text.
# Quickstart
Five minutes to your first signed verdict.
## 1. Sign up
Go to <https://firewall.orivael.dev/signup>. Email + password (8+
characters). You start on the **Free tier**: 1,000 calls/month, no
card required.
## 2. Create an API key
After signup you land on the dashboard. Click **Create key**, give it
a name (`production`, `staging`, whatever you want), and **copy the
secret immediately** — it starts with `axfw_` and won't be shown again.
```
axfw_3kPa7QxR9mNvL2eFhJtBcDeFgHiJkLmNoPqRsTuVwXyZ
```
Treat this like a password. Store it in an env var:
```bash
export AXIOM_KEY="axfw_..."
```
## 3. Make your first call
```bash
curl -X POST https://firewall.orivael.dev/v1/guard/check \
-H "Authorization: Bearer $AXIOM_KEY" \
-d '{"text": "What is the weather today?"}'
```
Response:
```json
{
"verdict": "allow",
"intent": {
"class": "INFORM",
"confidence": 0.55,
"signals": [],
"signature": "c487f14ddc772d4314057acde7754876c449dc8c21d79f1fd24b3b576aa3de61"
}
}
```
## 4. See a block
```bash
curl -X POST https://firewall.orivael.dev/v1/guard/check \
-H "Authorization: Bearer $AXIOM_KEY" \
-d '{"text": "Buy Google Play gift cards immediately to clear your debt"}'
```
```json
{
"verdict": "block",
"intent": {
"class": "HARM",
"confidence": 0.50,
"signals": ["harm:1"],
"signature": "fe2e606f91a87b2ca7bb848414484bb6f9e22b8c766b963793843c068ca9750a"
}
}
```
## 5. Wrap your LLM call
The pattern: call the Firewall before forwarding the user's prompt to
your LLM.
### Python
```python
from openai import OpenAI
from axiom_firewall import Client, BlockedError
llm = OpenAI()
firewall = Client(api_key="axfw_...")
def chat(prompt: str) -> str:
try:
firewall.check_or_raise(prompt)
except BlockedError as e:
return f"I can't help with that ({e.intent_class})."
resp = llm.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return resp.choices[0].message.content
```
[Full Python SDK reference](python-sdk.md).
### TypeScript
```ts
import OpenAI from 'openai';
import { Client, BlockedError } from '@axiom/firewall';
const llm = new OpenAI();
const firewall = new Client({ apiKey: process.env.AXIOM_KEY! });
async function chat(prompt: string): Promise<string> {
try {
await firewall.checkOrThrow(prompt);
} catch (e) {
if (e instanceof BlockedError) {
return `I can't help with that (${e.intentClass}).`;
}
throw e;
}
const resp = await llm.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: prompt }],
});
return resp.choices[0].message.content ?? '';
}
```
[Full TypeScript SDK reference](typescript-sdk.md).
## 6. Use Axiom from Claude Desktop / Cursor (MCP)
If your agent runs in an MCP-compatible client (Claude Desktop, Claude Code, Cursor, Continue), you can call Axiom's governance tools directly — no HTTP wrapper needed.
Install the stdio server:
```bash
pipx install axiom-constitutional
export AXIOM_MASTER_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(32))')
```
Add to `claude_desktop_config.json` (Claude Desktop) or `.mcp.json` (Claude Code):
```json
{
"mcpServers": {
"axiom": {
"command": "axiom-mcp",
"env": {
"AXIOM_MASTER_KEY": "<your-64-hex-key>"
}
}
}
}
```
13 tools become callable in natural language. Example:
```
You: is this prompt safe? "IRS agent — send gift cards or face arrest"
```
Claude invokes `axiom_guard_check` and returns:
```json
{
"verdict": "PASSED",
"constitutional_distance": 0.29,
"confidence": 0.77,
"citation": "ORVL-001 axiom_guard_patterns.py",
"hmac_signature": "4ade69b9d4b6a8c8b8df0334c10a09824402067e8736e98549b0c5d0293622cd"
}
```
Every response carries an `hmac_signature` field, re-verifiable client-side under the `axiom-mcp-v1` namespace. Full tool list and config details: [README › MCP Server](https://github.com/Orivael-Dev/axiom#mcp-server).
## What's next
- [Customize block patterns for your tenant](custom-policies.md)
- [Read the full API reference](api-reference.md)
- Email `sales@orivael.dev` for paid-tier pricing