For engineers integrating us

SDK, API, connectors. One coherent surface.

Typed Python SDK, OpenAPI 3.1 REST surface, and fourteen encrypted source connectors — designed so a single engineer can wire RadMah AI into the data plane in an afternoon.

SDK type coverage
100%
REST routes
180
Connectors
14
Webhook sig
BLAKE3
radmah-quickstart.ipynbpython 3.11
cell · in[1]
1from radmah_sdk import Client2 3client = Client(api_key="rm_live_…")4 5# Synthesize from a CSV upload6ds  = await client.datasets.upload("./customers.csv")7job = await client.synthesize.run(8    dataset_id=ds.id,9    model="synthesize",10    rows=10_000,11    seed=42,12)13await job.wait()14 15bundle = await client.evidence.fetch(job.id)16assert bundle.verify()  # BLAKE3, offline17print(job.metrics.qa_score)
stream · out[1]
  • ▶ uploading customers.csv ………… 4.7 MB
  • dataset ds_4a7c81 · 20 cols · 482 931 rows
  • ▶ POST /v1/synthesize/jobs 202
  • job_9b3df1 · estimate 38 s · 14 credits
  • ▶ training the engine on 17 numeric / 3 cat …
  • epoch 12 / 20 loss 0.083
  • epoch 20 / 20 loss 0.041
  • ▶ generating 10 000 rows ………… 1.6 s
  • ✓ K-S gate 0.018 · χ² gate ok · constraints ok
  • ▶ fetching evidence bundle …
  • ✓ chain verified root a4f2…d801
  • >>> 0.9569

Three entry points. Same evidence chain.

SDK for engineers, REST for the rest of your stack, connectors for the data already in your warehouse — every one of them lands on the same sealed evidence pipeline.

See the contract before you wire it.

api.radmah.ai / v1 / synthesize / jobsopenapi 3.1
POST/v1/synthesize/jobs
X-API-Key:          slt_live_AbCdEfGh…
X-Idempotency-Key:  8e0c…b21
Content-Type:       application/json

{
  "dataset_id": "ds_4a7c81",
  "model":      "synthesize",
  "rows":       10000,
  "seed":       42
}
202Accepted
X-Job-Id:                job_9b3df1
X-Rate-Limit-Remaining:  47
Retry-After:             —

{
  "job_id":     "job_9b3df1",
  "status":     "queued",
  "estimate":   { "credits": 14, "seconds": 38 },
  "evidence":   { "expected_root_pending": true },
  "_links":     {
    "self":     "/v1/synthesize/jobs/job_9b3df1",
    "stream":   "/v1/synthesize/jobs/job_9b3df1/events",
    "cancel":   "/v1/synthesize/jobs/job_9b3df1:cancel"
  }
}
job.synthesize.completed
5 min replay window
  1. 01
    SLT signs payload
    BLAKE3(payload || ts || rolling_key)
  2. 02
    Webhook delivered
    POST your endpoint with headers
  3. 03
    You verify
    verify(payload, sig, key)
  4. 04
    Process if ok, 401 if not
    no signature → reject silently
X-SLT-Signature: blake3=2d4a8f… ts=1718834012
X-SLT-Event: job.synthesize.completed

Posture & auth that survives security review.

Tenant isolation

JWT carries tenant_id; every query filtered at the ORM. No cross-tenant fetch is physically possible.

Scoped keys

Read / generate / admin scopes, per-key rate-limit overrides, immediate revocation.

Signed webhooks

HMAC-SHA256 signature with per-tenant rolling key + timestamp; 5-minute replay window.

Idempotent retries

Idempotency-Key header stored 24 h; safe retry on transient 5xx without duplicate work.

Jump straight to it.

pip install radmah-sdk

SDK from PyPI, OpenAPI from the docs, or a working session with our integrations engineer. Pick whichever moves you fastest.

api.radmah.ai / v1 / synthesize / jobsopenapi 3.1
POST/v1/synthesize/jobs
X-API-Key:          slt_live_AbCdEfGh…
X-Idempotency-Key:  8e0c…b21
Content-Type:       application/json

{
  "dataset_id": "ds_4a7c81",
  "model":      "synthesize",
  "rows":       10000,
  "seed":       42
}
202Accepted
X-Job-Id:                job_9b3df1
X-Rate-Limit-Remaining:  47
Retry-After:             —

{
  "job_id":     "job_9b3df1",
  "status":     "queued",
  "estimate":   { "credits": 14, "seconds": 38 },
  "evidence":   { "expected_root_pending": true },
  "_links":     {
    "self":     "/v1/synthesize/jobs/job_9b3df1",
    "stream":   "/v1/synthesize/jobs/job_9b3df1/events",
    "cancel":   "/v1/synthesize/jobs/job_9b3df1:cancel"
  }
}