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.
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.
Generate, check, run, iterate — all of it machine-readable.
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.
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.
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.
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.
Real requests against the public API. No key, no setup.
curl -X POST https://api.jenneranalytics.com/v1/quick \
--data-binary @analysis.sas The MEANS Procedure
Variable N Mean Std Dev
-----------------------------------------------
bmi 19 17.8420103 1.4625169
-----------------------------------------------This snippet is missing a semicolon. A parse-only call names the problem, so the agent can fix it and move on.
data demo;
set sashelp.class /* <- missing semicolon */
bmi = weight / (height**2) * 703;
run;{
"valid": false,
"diagnostics": [
{ "severity": "error",
"message": "Unexpected token: Eq, expected Semi" }
]
}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.
{
"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": "..."
}Base URL https://api.jenneranalytics.com/v1
| Endpoint | Purpose |
|---|---|
POST/v1/run | Execute a script with optional data inputs. Returns output, log, exit code, datasets, files, and diagnostics as JSON. |
POST/v1/run/stream | Same as /v1/run, streamed as Server-Sent Events so the log arrives while the program is still running. |
POST/v1/quick | One-liner convenience. Raw script in, plain-text listing back — the fastest way to answer “does this SAS work?” |
POST/v1/validate | Parse-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. |
Start with no key. Add one when you need the headroom.
| Tier | Authentication | Rate limit | Timeout |
|---|---|---|---|
| Anonymous | No key required | 1,000 req/hr per IP | 30 seconds |
| Free | Email signup | 1,500 req/hr | 60 seconds |
| Pro | API key | 10,000 req/hr | 5 minutes |
| Enterprise | API key | Custom | Custom |
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.
No key needed to start. No SAS license, ever.