Ora
All guides All guides

Getting started

Your first decision in the Playground Call the API from your code Save, share and reuse queries

Financial decisions

Decide on a stock with just its symbol Read probabilities and choose thresholds

Automation

Send a Slack alert when a rule fires Send decisions to your own system Run a watchlist every day after the close

Production

Handle errors, rate limits and retries

Use cases

Tag financial news for trading signalsGuardrails for LLM appsSupport ticket triage and routingFilter retrieved passages before your LLM answersVerify claims and citations against a source

Guides / Automation

Automation · about 15 min

Send decisions to your own system

Deliver a signed JSON payload to your order system, risk system or automation tool (Zapier, Make, n8n) whenever a rule fires.

You'll need
  • An https endpoint that accepts a JSON POST and is reachable from the internet.
  • Admin role here (to add a connection).
  1. Add a webhook connection

    Settings → Connections → Webhook, name it my-oms, paste your URL, optionally add headers (for example Authorization), then Add connection. Copy the signing secret shown once and store it with your service.

  2. Describe the body you want

    The body is your JSON, with placeholders. A value that is only a placeholder keeps its type, so "{{drop5}}" arrives as a number.

    {
      "model": "ora1",
      "state": {
        "symbol": "TSLA"
      },
      "questions": {
        "up_week": {
          "type": "yes_no",
          "instructions": "Will the stock be higher in a week?"
        },
        "drop5": {
          "type": "yes_no",
          "instructions": "Will it drop at least 5% at some point in the next month?"
        }
      },
      "actions": [
        {
          "id": "to_oms",
          "when": "drop5 >= 0.6",
          "do": "webhook",
          "connection": "my-oms",
          "body": {
            "symbol": "{{symbol}}",
            "signal": "reduce",
            "p_drawdown": "{{drop5}}",
            "p_up_week": "{{up_week}}",
            "as_of": "{{as_of}}"
          }
        }
      ],
      "dry_run": true
    }
    Open this in the Playground
  3. Preview with a dry run

    Run with Dry run ticked: the response shows the exact body that would be sent.

  4. Verify the signature on your side

    Every delivery has X-Jev-Signature: t=<unix>,v1=<hex>, an HMAC-SHA256 of "<t>.<raw body>" with the signing secret, and X-Jev-Delivery (unique per delivery, use it to ignore duplicates).

    import hmac, hashlib, time
    
    def verify(secret: str, header: str, raw_body: bytes, tolerance=300) -> bool:
        parts = dict(p.split("=", 1) for p in header.split(","))
        t = int(parts["t"])
        if abs(time.time() - t) > tolerance:
            return False
        want = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
        return hmac.compare_digest(want, parts["v1"])
  5. Reply quickly

    Return any 2xx within 5 seconds and do the work afterwards. 429 and 5xx are retried after 30 s, 2 min and 10 min; other 4xx are final. Each attempt is listed under Actions.

  6. Go live

    Untick Dry run (or send "dry_run": false from code). For Microsoft Teams or Discord incoming webhooks, shape the body as they expect: {"text": "…"} or {"content": "…"}.

What's next

Create an account Open the Playground Everything here also lives in the console, next to your keys and usage.