Try models in the browser playground or integrate via API.
100 free scans/month. Sign up in 30 seconds.
The EU AI Act requires prompt injection defenses by August 2, 2026. Companies are scrambling — Lakera was acquired for $300M, Pangea for $260M, both in September 2025. Open source models exist, but setting them up takes an afternoon of downloading weights, configuring tokenizers, and writing glue code.
We host the models so you can evaluate in seconds, not hours.
Read more about the EU AI ActDrop this before your LLM call. Works with any provider.
import requests
def scan_input(user_input: str) -> bool:
response = requests.post(
"https://api.pinpout.dev/v1/scan",
headers={"X-API-Key": "pp_live_your_key_here"},
json={"text": user_input},
)
result = response.json()
return result["is_safe"]
# Use before calling your LLM
if scan_input(user_message):
# Safe — pass to OpenAI, Anthropic, etc.
pass
else:
raise ValueError("Prompt injection detected")Or try it in the playground in the Dashboard.
Three steps to protect your app. Then one endpoint to call.
Create an account. Get your key instantly — no approval process, no sales call.
Use the playground to test prompts in the browser, or call /v1/scan from your code. One endpoint, that's it.
Every prompt injection attempt gets caught before it reaches your model.
Strips encoding tricks and obfuscation so nothing sneaks past
DeBERTa-v3 classifier — fast, accurate, no LLM API calls.
More models coming soon.
Base URL: https://api.pinpout.dev
/v1/scanScan text for prompt injection attacks. Call this before passing user input to your LLM.
{
"text": "string", // required — the text to scan
"options": {
"return_normalized": bool // optional — include normalized text in response
}
}{
"is_safe": true, // false if injection detected
"confidence": 0.97, // model confidence (0–1)
"scan_id": "a1b2c3d4-..." // UUID for this scan
}401 INVALID_API_KEYMissing or bad X-API-Key403 QUOTA_EXCEEDED10K monthly limit reached429 RATE_LIMITED100 req/min limit, includes Retry-After header/v1/keysGet your current API key info. Returns null if no key exists yet.
{
"key": {
"prefix": "pp_live_XXXX...",
"created_at": "2026-02-01T00:00:00Z",
"last_used_at": "2026-02-23T10:00:00Z"
} | null
}/v1/keysCreate your API key. One key per account. Returns the full secret — save it, it won't be shown again.
{
"key": { "prefix": "pp_live_XXXX...", "created_at": "..." },
"secret": "pp_live_full_key_here" // shown once
}409 KEY_EXISTSA key already exists — rotate or delete it first/v1/keys/rotateRotate your API key. Old key is immediately invalidated. Returns the new full secret.
{
"key": { "prefix": "pp_live_XXXX...", "created_at": "..." },
"secret": "pp_live_new_key_here"
}404 NOT_FOUNDNo key exists to rotate/v1/keysDelete your API key. The key is immediately revoked.
{ "deleted": true }/v1/usageGet your usage for the current month. Resets at UTC midnight on the 1st.
{
"scans_total": 847,
"quota": {
"limit": 10000,
"used": 847,
"remaining": 9153
}
}All errors use the same shape:
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Try again in 30 seconds."
}
}