CurbiCurbi
POLICY CHECK / public accessAPI contract 2026-11-01

Your AI said it. Did it happen?

Write your business rules once: prices, promises you never make, actions an agent may claim. Then check every reply against those rules and against the records you supply.

Try a templateUse the API →

Your policy. Your test bench.

Choose an example business, edit its approved prices, then challenge a reply. Reply checks run on your device. Optional online lint sends only the policy. Templates are examples, not customers.

  1. Pick your rules. Start with a pricing, refund, or support profile, or drop in your policy file.
  2. Add an agent reply. Paste the text or drop in an output file.
  3. Read the verdict. Findings appear automatically and highlight the words that triggered each rule.

This check runs on your device. No API key or signup. See a decision check and its receipt or check your own decision.

01 / YOUR RULES

Drop your policy JSON here.

One UTF-8 JSON file, up to 32 KiB. Review the imported rules before relying on them.

Advanced policy (JSON)
APPROVED PRICES / USD

These are example rules, not Curbi prices. Changes stay in this tab. Edit other rules under Advanced policy.

02 / AGENT OUTPUT

Drop the agent output here.

One UTF-8 .txt, .text or .md file, up to 16,000 bytes and 4,000 characters. Or paste it below.

CHALLENGE IT

Local and free. Choose a profile or import your policy, then add agent output.

Sample record (not verified)

A claim like "I've booked you" passes only if the record has a DONE effect for that operation. Toggle it:

Checking…
Same check with curl

Supplied records, not independent verification. The checker evaluates the policy and records you provide. A DONE flag is not proof of a booking, payment or message. No provider accounts are connected.

What it checks

Prices

Every dollar figure must be an approved price for the item it's attached to. Unattached figures are flagged.

Promises

Phrases your policy forbids, such as guarantees, diagnoses or approval promises. Negated uses ("we don't guarantee") pass.

Actions vs. record

"I booked / refunded / sent" passes only if the record shows that operation DONE, and recorded facts like the booked time aren't contradicted.

Rule-based and deterministic: same input, same verdict, no model calls, no request-body persistence in the checker. It catches what your policy describes. It doesn't decide whether a reply is true in general.

RECEIPT LAB / SYNTHETIC EXAMPLE

A DONE flag
is not a signature.

Compare a supplied assertion with required-signature mode. These buttons send only the fixed example below to Curbi’s API. No booking is performed.

EXAMPLE CLAIM

“I booked your meeting.”

calendar.bookDONECaller-supplied assertion
ACTUAL API RESPONSEChoose a mode

See how a caller assertion differs from an authenticated operation statement.

No request sent.

Production action signing is not connected. Receipt verification authenticates an operation and supplied subject; it does not authenticate booking details or consume a receipt across requests.

TEXT STREAM LAB / NO AUDIO

Check before the words leave.

Type a draft and step through a simulated text stream. This uses the same interceptor source as the reviewed connectors. No model, call or provider is connected.

Run a check. Keep the result.

Check a reply Connect your agent →

A pass means no configured rule fired. It grants no execution authority or provider-completion proof.

Start with your rules.

Choose an e-commerce, SaaS or support policy. Edit it, check a reply locally and optionally remember it on this device.

Choose a free policy profile →

Check a typed decision

Check a predicate, choice or score against your decision policy. Paste the original JSON request and response, or load an example and edit it. The check runs on this device and emits an unsigned receipt. It does not establish provider identity or authorize an action.

See a decision check

These synthetic model responses were replayed with Curbi’s decision checker. The receipts are unsigned. The examples perform no provider action.

Predicate · Is the request eligible?

Hand off. The answer was yes at 84%. The policy requires at least 90%, so the check sends it to a human.

View decision and rules
{
  "request": {
    "model": "gpt-6-luna",
    "input": "Synthetic support ticket",
    "questions": [
      {
        "type": "predicate",
        "name": "eligible",
        "instructions": "Does this request meet the eligibility rules?"
      }
    ]
  },
  "response": {
    "model": "gpt-6-luna",
    "answers": [
      {
        "type": "predicate",
        "name": "eligible",
        "probability": 0.84
      }
    ]
  },
  "rules": {
    "decisions": {
      "eligible": {
        "allowed": [
          "true",
          "false"
        ],
        "act_at": 0.9,
        "min_margin": 0.2,
        "pin": [
          {
            "provider": "openai",
            "model": "gpt-6-luna"
          }
        ],
        "below": "hand_off"
      }
    }
  }
}
View unsigned receipt
{
  "object": "curbi.decision-receipt.v1",
  "v": 1,
  "question_id": "eligible",
  "checker": "curbi-check/decisions 0.1.0",
  "policy_digest": "sha256:849ba1eaeaaf2936bbde7ff8a37ba5c0702c5f074cf9b8289d5b0dd1164a920a",
  "record_digests": [
    "sha256:8867f3450a19034b28bc9b0b887942bc31ed7728061b893b2cc21fc7febe1fcc"
  ],
  "outcome": "hand_off",
  "selected": "true",
  "reasons": [
    "below_threshold"
  ],
  "prev_receipt_digest": null,
  "signed": false,
  "provider_signed": false,
  "does_not_prove": "that the vendor computed these probabilities, that they are calibrated, or that the decision is correct",
  "receipt_digest": "sha256:8133dcdee8a61804837bd48beb5ae4dd40341a14a36bdd26aa0c4a36e7911bb8"
}

Choice · Which support queue?

Passes policy. Billing scored 96%, above the 90% threshold. Its 92-point lead also clears the 20-point margin.

View decision and rules
{
  "request": {
    "model": "gpt-6-luna",
    "input": "Synthetic support ticket",
    "questions": [
      {
        "type": "choice",
        "name": "queue",
        "instructions": "Choose the appropriate queue.",
        "choices": [
          {
            "value": "billing"
          },
          {
            "value": "support"
          }
        ]
      }
    ]
  },
  "response": {
    "model": "gpt-6-luna",
    "answers": [
      {
        "type": "choice",
        "name": "queue",
        "choice": "billing",
        "confidence": 0.96,
        "probabilities": [
          {
            "value": "billing",
            "probability": 0.96
          },
          {
            "value": "support",
            "probability": 0.04
          }
        ]
      }
    ]
  },
  "rules": {
    "decisions": {
      "queue": {
        "allowed": [
          "billing",
          "support"
        ],
        "act_at": 0.9,
        "min_margin": 0.2,
        "pin": [
          {
            "provider": "openai",
            "model": "gpt-6-luna"
          }
        ],
        "below": "hand_off"
      }
    }
  }
}
View unsigned receipt
{
  "object": "curbi.decision-receipt.v1",
  "v": 1,
  "question_id": "queue",
  "checker": "curbi-check/decisions 0.1.0",
  "policy_digest": "sha256:b5cfd4d9de18d027a3c9584fe396facb97dbf6ffb6d40d7442e4af3eccc9b977",
  "record_digests": [
    "sha256:af3832cf341c65072cc843e08912d61b8355061140b4876dea0165f342e458f0"
  ],
  "outcome": "act",
  "selected": "billing",
  "reasons": [],
  "prev_receipt_digest": null,
  "signed": false,
  "provider_signed": false,
  "does_not_prove": "that the vendor computed these probabilities, that they are calibrated, or that the decision is correct",
  "receipt_digest": "sha256:5322c54d9539df4aae5a1ebb6cf9619d9353036594fc7e9c82b064dc74d62882"
}

Score · How urgent is the ticket?

Passes policy. Urgent has the highest probability at 94%. It clears both the threshold and the margin.

View decision and rules
{
  "request": {
    "model": "gpt-6-luna",
    "input": "Synthetic support ticket",
    "questions": [
      {
        "type": "score",
        "name": "urgency",
        "instructions": "Score ticket urgency.",
        "levels": [
          {
            "label": "routine"
          },
          {
            "label": "urgent"
          }
        ]
      }
    ]
  },
  "response": {
    "model": "gpt-6-luna",
    "answers": [
      {
        "type": "score",
        "name": "urgency",
        "score": 0.94,
        "confidence": 0.94,
        "probabilities": [
          {
            "value": 0,
            "label": "routine",
            "probability": 0.06
          },
          {
            "value": 1,
            "label": "urgent",
            "probability": 0.94
          }
        ]
      }
    ]
  },
  "rules": {
    "decisions": {
      "urgency": {
        "allowed": [
          "routine",
          "urgent"
        ],
        "act_at": 0.9,
        "min_margin": 0.2,
        "pin": [
          {
            "provider": "openai",
            "model": "gpt-6-luna"
          }
        ],
        "below": "hand_off"
      }
    }
  }
}
View unsigned receipt
{
  "object": "curbi.decision-receipt.v1",
  "v": 1,
  "question_id": "urgency",
  "checker": "curbi-check/decisions 0.1.0",
  "policy_digest": "sha256:f01db2502901e3a4cf08ad94b5ac39241647b170e0faab802a460aede0a7666e",
  "record_digests": [
    "sha256:c8adefd52aa36286489df35f7ad71c3b511f24f36adacd49536677fe20fa95dd"
  ],
  "outcome": "act",
  "selected": "urgent",
  "reasons": [],
  "prev_receipt_digest": null,
  "signed": false,
  "provider_signed": false,
  "does_not_prove": "that the vendor computed these probabilities, that they are calibrated, or that the decision is correct",
  "receipt_digest": "sha256:951644eb3d7b843045d6b6710fa958fe3e49782107a7490f3f0682cd33405cea"
}