API docs
Everything common to every SpreadRun API: authentication, billing, errors and limits. Each API has its own page for request and report formats.
APIs
| API | Endpoint | Price |
|---|---|---|
| Clinical Trial Results Table QA | POST /api/v1/clinical-trial-table-validator | $0.25 per completed audit |
| Hospital Price Transparency MRF Validator (beta) | POST /api/v1/hospital-mrf-validator | $0.25 per completed validation |
| UAD 3.6 Appraisal Report Validator (beta) | POST /api/v1/uad-36-appraisal-validator | $1.00 per completed report |
Authentication
Create a key on your account page. Keys start with sr_ and are shown once; we store only a hash. Send the key on every paid call:
Authorization: Bearer sr_your_keyX-API-Key: sr_your_key also works. Revoke a key on the account page and it stops working immediately. Up to 10 active keys per account.
Credits and billing
- Each API has its own price per completed run (see the table above), taken from prepaid credits. Credits are held in cents and work on every API. Packs: $5, $20 and $50 of credit, which is 20, 80 or 200 standard runs at $0.25. Credits never expire.
- A run is charged once, when it returns a report (PASS, WARN or FAIL). Each response carries a
requestId; the same request is never charged twice. - Input errors, internal errors and billing outages are never charged, and in those cases no report is returned.
- Successful responses include
priceCents, what this run cost, andbalanceCents, your remaining credit after the charge. - Signed in on the website, the test form on each product page can run full validations paid from the same balance, with no API key.
Response envelope
Successful calls return HTTP 200 with the validator's report inside an envelope:
{
"requestId": "uuid",
"api": "clinical-trial-table-validator",
"mode": "paid",
"charged": true,
"priceCents": 25,
"balanceCents": 950,
"report": { ... }
}The report format is different for each API and documented on its page. Every response also has an X-Request-Id header.
Errors
Errors return a JSON body with error.code and a plain-language error.message.
| HTTP | error.code | Meaning |
|---|---|---|
| 400 | input_error | The input cannot be validated: bad JSON, missing required columns, empty body, corrupt gzip, invalid parameters. Not charged. |
| 401 | unauthorized | Missing, unknown or revoked API key. |
| 402 | insufficient_credits | Your balance is below the price of one run. The report is not returned and nothing is charged. |
| 405 | method_not_allowed | Use POST. |
| 413 | payload_too_large | Request body over the endpoint limit (4.4 MB for paid calls; lower for the free demo). |
| 429 | rate_limited | Free demo endpoints only: 10 runs per day per API. |
| 500 | internal_error | The validator failed. Not charged. Retrying with the same input is safe. |
| 503 | billing_unavailable | Billing could not be confirmed, so the report was withheld. Not charged. Retry later. |
Example: HTTP 401
{
"error": {
"code": "unauthorized",
"message": "Unknown or revoked API key.",
"requestId": "7f3c2a1e-5b8d-4c6f-9e0a-1d2b3c4d5e6f"
}
}Example: HTTP 402
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this call. Buy credits on your account page.",
"balanceCents": 10,
"priceCents": 25,
"requestId": "7f3c2a1e-5b8d-4c6f-9e0a-1d2b3c4d5e6f"
}
}Limits
- Request body: up to 4.4 MB on paid endpoints. The hosting platform rejects anything over 4.5 MB before it reaches us.
- Time: a run that takes longer than 30 seconds is stopped and not charged. Typical runs take well under a second.
- Rate: there is no per-key rate limit in this version. If you plan sustained traffic above one request per second, tell us first.
Free demo endpoints
Each API has a demo endpoint that needs no key and is never charged: POST /api/demo/<api>. It takes the same input with smaller limits (512 KB for clinical tables, 2 MB and 100 records for MRF files, 1 MB for UAD appraisal files) and allows 10 runs per day per API from one network. It is what the test forms on the product pages use.
Your data
Submitted tables, files and appraisal reports are processed in memory for the length of the request and are not stored. We log the time, endpoint, outcome, report status, request size and duration for billing and usage, never the submitted contents.