Let AI Run SAS Code, Not Just Write It

Any model can generate SAS. Without a way to execute it, nobody knows whether it works. Jenner's open Run API gives an agent the other half of the loop: run the program, read the real output and the real errors, fix it, run it again — no SAS license, no local install.

Anonymous access works with no API key at all.

Generating Code Is the Easy Half

An assistant that writes SAS and stops there hands you something that looks right. Whether the macro resolves, whether the merge picks up the variables you expected, whether PROC MEANS returns 19 rows or 0 — none of that is knowable until the program runs.

Historically, running it meant a SAS license and an install, which is exactly what an agent does not have. The Run API removes that constraint: a single HTTP call executes the code and returns structured results the model can actually reason about.

The Loop

Generate, check, run, iterate — all of it machine-readable.

1

Generate

The model writes SAS — a DATA step, a PROC, a macro. Nothing special required: Jenner accepts standard SAS syntax, so the code an assistant already knows how to write is the code that runs.

2

Check

POST the script to /v1/validate for a parse-only pass. Diagnostics come back without executing anything, so an agent can catch a syntax error before spending a run on it.

3

Run

POST to /v1/run with the script and any CSV or Parquet inputs. Jenner executes it in a sandboxed container and returns the listing output, the NOTE/WARNING/ERROR log, an exit code, and every dataset and file the program produced.

4

Iterate

The log and diagnostics are structured feedback, not a screenshot. The agent reads the actual error, fixes the actual line, and runs again — closing the loop without a human in the middle.

What It Looks Like

Real requests against the public API. No key, no setup.

Run a script, get the listing back

Request
curl -X POST https://api.jenneranalytics.com/v1/quick \
  --data-binary @analysis.sas
Response
                          The MEANS Procedure

 Variable        N           Mean        Std Dev
 -----------------------------------------------
 bmi            19     17.8420103      1.4625169
 -----------------------------------------------

Catch a mistake before spending a run on it

This snippet is missing a semicolon. A parse-only call names the problem, so the agent can fix it and move on.

Broken SAS
data demo;
  set sashelp.class      /* <- missing semicolon */
  bmi = weight / (height**2) * 703;
run;
POST /v1/validate
{
  "valid": false,
  "diagnostics": [
    { "severity": "error",
      "message": "Unexpected token: Eq, expected Semi" }
  ]
}

Read results the model can reason about

A full run returns the listing, the log, an exit code, and every dataset the program produced — with row counts, so the agent can verify it got data instead of assuming.

POST /v1/run
{
  "run_id": "r_c8679761197f4f9d8a3bc021...",
  "status": "ok",
  "exit_code": 0,
  "output":   "...formatted listing tables...",
  "log":      "NOTE: PROC MEANS statement used.",
  "datasets": [ { "name": "demo", "row_count": 19 } ],
  "files":    [],
  "diagnostics": [],
  "duration_ms": 412,
  "jenner_version": "..."
}

Endpoints

Base URL https://api.jenneranalytics.com/v1

EndpointPurpose
POST/v1/runExecute a script with optional data inputs. Returns output, log, exit code, datasets, files, and diagnostics as JSON.
POST/v1/run/streamSame as /v1/run, streamed as Server-Sent Events so the log arrives while the program is still running.
POST/v1/quickOne-liner convenience. Raw script in, plain-text listing back — the fastest way to answer “does this SAS work?”
POST/v1/validateParse-only syntax check. Returns diagnostics without executing. Macros are not expanded, so treat macro-heavy failures as advisory.
GET/v1/run/{run_id}Fetch a completed run, its files, or a dataset preview or download. Results live for one hour and require the run's access token.

Access

Start with no key. Add one when you need the headroom.

TierAuthenticationRate limitTimeout
AnonymousNo key required1,000 req/hr per IP30 seconds
FreeEmail signup1,500 req/hr60 seconds
ProAPI key10,000 req/hr5 minutes
EnterpriseAPI keyCustomCustom

Works With What You Already Use

Your AI tools

  • Anthropic's Claude Code
  • Claude Desktop
  • OpenAI's Codex
  • ChatGPT
  • Any system that can make an HTTP request

Or from inside Jenner

  • The collaborative web workspace
  • The macOS desktop app
  • A native Jupyter kernel

The same execution engine backs all of them, so code an agent validated through the API behaves the same way when a person opens it.

Frequently Asked Questions

No. Anonymous requests work with no key at all, rate-limited by IP at 1,000 requests per hour with a 30-second execution timeout. That is enough for an agent to test and iterate on real code. A free key raises the ceiling, and Pro or Enterprise keys raise it further.

No. The API executes the code in a sandboxed container on our infrastructure. There is no SAS license, no local install, and nothing for the model's host environment to provision.

Yes. /v1/run accepts repeatable input files alongside the script, in CSV or Parquet. Datasets the program produces come back with row counts and preview or download URLs, so an agent can inspect results rather than guess at them.

Every run returns an exit code, the full NOTE/WARNING/ERROR log, and structured diagnostics. Failures are explicit and machine-readable, so an agent can tell the difference between a program that worked and one that did not — which is exactly the signal a generate-only workflow lacks.

One hour. Each run returns an access token scoped to that run; the GET endpoints require it and it is separate from your API key.

Give your agent a way to check its work

No key needed to start. No SAS license, ever.