Developer documentation

Evaluations and outcomes

An evaluation answers the policy question. An outcome records what the customer says happened afterward.

Allow and deny are neutral

Both are successful policy results. Deny does not automatically reject signup or withhold a benefit. Your backend maps the result to its own product workflow. Technical failures remain explicit HTTP errors and are never turned into deny.

Skipped work and usage

New Live evaluations and Live previews consume allowance or prepaid credits when they complete, whether allow or deny. Test work, outcome reports, technical failures, and completed result replays do not consume paid usage. Skipped reasons are billing_overdue, service_inactive, trial_allowance_exhausted, insufficient_credits, and custom_allowance_exhausted. Evaluation previews require an Idempotency-Key and can return the same skipped branch. Billing administration stays in the dashboard.

Assume granted

The default setting creates an Assumed granted outcome after allow. Use this when an allow normally leads directly to the business action. Report Not granted only when your durable records establish that the action did not happen.

Report outcome

This setting creates Awaiting outcome after allow and gives your backend ten minutes to report what happened. If nothing arrives, the state becomes Outcome unknown. You choose whether missing outcomes keep holding eligibility or release it.

Send an outcome

Use a stable external outcome ID from your own durable event or delivery record. Granted consumes eligibility. Not granted releases that outcome's contribution. Reversed preserves the consumed history.

curl https://veltor.dev/v1/evaluations/EVALUATION_ID/outcome \
  -H "Authorization: Bearer $VELTOR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: outcome_customer_event_123" \
  --data '{"outcome":"granted","external_outcome_id":"customer-event-123"}'

Outcome response

The response names the evaluation, the current outcome state, and any overlapping outcomes found after a late report. Review conflicts in your own workflow.

{"evaluation_id":"evaluation-id","outcome_state":"granted","conflicts":[]}

Response headers

Veltor-Outcome-State contains the current tracked state. Veltor-Outcome-Due-At appears when a report is due. X-Request-ID identifies the HTTP request.