API v1

Veritas 360 Public Compliance API

Regulatory framework discovery and compliance document generation, over HTTPS with JSON.

Overview

The API exposes two capabilities of the Veritas 360 compliance engine:

1. Framework discovery

Send a plain-language query — "hospitals in Dubai", "financial services firms in Singapore" — and receive ranked candidate regulatory frameworks with regulator, jurisdiction, sector, source URL, confidence and reasoning.

2. Document generation

Request a policy or framework-reference document asynchronously: submit a job, poll its status, then download the finished document as json, md, pdf or docx.

Base URL: https://api.veritas360.com.au/api/public/v1

A machine-readable OpenAPI 3 document is available for client generation and testing tools.

Authentication

Every request (except the service card and the OpenAPI document) requires an API key issued by Kurateq. Keys look like v360_sk_… and are shown to you exactly once when issued — store them securely; only a hash is kept on our side.

Send the key in either header:

Authorization: Bearer v360_sk_...
# or
X-API-Key: v360_sk_...

A missing or invalid key returns 401 with a JSON error envelope. Repeated bad-key attempts from one address are temporarily blocked.

Lost or leaked key?

Contact your Kurateq account contact immediately. Keys can be rotated (new key issued, old one stops instantly) or disabled outright.

Sandbox & live mode

Every client starts in sandbox mode: all endpoints work end-to-end, but discovery and generation return clearly watermarked sample output and incur no processing cost. This lets you build and test your full integration safely.

When you're ready, Kurateq flips your key to live mode — same endpoints, same shapes, real results. Check your current mode any time with GET /ping.

Endpoints

EndpointDescription
GET/Service card and endpoint list (no auth)
GET/openapi.jsonOpenAPI 3 document (no auth)
GET/pingAuth check — returns your client name and current mode
GET/capabilitiesAvailable document types, output formats, and your key's limits
POST/frameworks/suggestFramework discovery. Body: {"query": "..."}
POST/documents/generateStart a generation job. Returns 202 with a jobId
GET/jobs/{jobId}Job status: queued → running → completed / failed
GET/documents/{jobId}?format=…Download the finished document (json, md, pdf, docx)
GET/usageYour request and generation counters against your limits

Generation request body

FieldRequiredNotes
frameworkYesFramework or standard name (aliases: standard, name)
documentTypeNoDefaults to framework_reference; see /capabilities for the full list
jurisdictionNoe.g. "United Arab Emirates"
organisationNoObject: {name, sector, country} — personalises the document

Quickstart (curl)

BASE=https://api.veritas360.com.au/api/public/v1
KEY=v360_sk_...        # issued by Kurateq

# 1. Am I alive, and what mode am I in?
curl -s -H "Authorization: Bearer $KEY" $BASE/ping

# 2. What can I do?
curl -s -H "Authorization: Bearer $KEY" $BASE/capabilities

# 3. Discover frameworks for a market
curl -s -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"query": "hospitals in Dubai"}' $BASE/frameworks/suggest

# 4. Generate a document (async)
curl -s -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"documentType":"privacy","framework":"Dubai ISR",
       "jurisdiction":"United Arab Emirates",
       "organisation":{"name":"Acme Clinics DMCC","sector":"healthcare"}}' \
  $BASE/documents/generate
# → {"jobId":"...","status":"queued","poll":"/api/public/v1/jobs/...", ...}

# 5. Poll until completed
curl -s -H "Authorization: Bearer $KEY" $BASE/jobs/<jobId>

# 6. Download in any format
curl -s -H "Authorization: Bearer $KEY" "$BASE/documents/<jobId>?format=pdf"  -o policy.pdf
curl -s -H "Authorization: Bearer $KEY" "$BASE/documents/<jobId>?format=docx" -o policy.docx

# 7. Check my meter
curl -s -H "Authorization: Bearer $KEY" $BASE/usage

Rate limits & quotas

ControlBehaviour
Request ratePer-key requests-per-minute limit. Current allowance is returned in X-RateLimit-Limit / X-RateLimit-Remaining headers; exceeding it returns 429 with a retry hint.
Generation quotasPer-day and per-30-day caps on document generation, per key. Sandbox keys get generous multiples since sandbox costs nothing.
ConcurrencyOne generation job in flight per key. A second POST /documents/generate while one is running returns 409 job_already_running — poll the first job to completion.

Your exact numbers are always visible via GET /capabilities (limits) and GET /usage (consumption). Limit increases are arranged through your Kurateq account contact.

Errors

Every error — including malformed JSON bodies and unknown paths — returns a JSON envelope, never HTML:

{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests.",
    "hint": "Retry after 12s",
    "requestId": "req_..."
  }
}

Include the requestId in any support query — it lets us trace the exact request.

StatusMeaning
400Malformed JSON or invalid parameters (e.g. unsupported_format)
401Missing or invalid API key
404Unknown path or job (job_not_found)
409A generation job is already running for this key
429Rate limit exceeded — honour the retry hint
5xxOur side — retry with backoff; contact support with the requestId if it persists