What it is
DataNivra is a Test Data Management (TDM) system for humans, CI/CD pipelines, and autonomous AI agents. The console stays the place where your data team manages sources, classification, policies, subsetting, masking, certification, refresh and audit. The Test Data API is a second entry point to the same customer-resident engine: administrators approve versioned test-data profiles once, and authorized developers, pipelines and agents then invoke them to get repeatable datasets — always within the profile's bounds.
Status (stated plainly):
| Capability | Status |
|---|---|
| Profiles, plan, request, wait, release (REST and CLI) | Implemented and tested in the repository; not yet deployed to the hosted service |
| YAML/JSON manifests | Implemented in the CLI and both SDK helpers |
| Python and TypeScript SDK helpers | Not yet published to PyPI or npm; install from the repository or release assets |
| CI workload identity (GitHub Actions, GitLab CI) | Off by default; a deployment must enable it |
| Automatic approval inside an envelope | Preview; off by default (operator switch and tenant switch) |
| MCP adapter for AI agents | Preview; local stdio adapter only |
DataNivra does not run your tests. Your QA tools and runners execute tests; DataNivra prepares and governs the data and the approved targets those tests use.
Two resources, deliberately separate
- A profile definition (
TestDataProfile, stored as aTEST_DATA_PROFILEpolicy version) is privileged: it fixes sources, pinned policy versions, the target or a pool of target references, upper bounds and an optional automation envelope. A second person approves each version and confirms its checksum. See Profiles and manifests. - A profile invocation (
TestDataRequest) is minimal: it pins a profilename,versionand optionally thechecksumyou reviewed, and may only choose scenarios, exact counts and a TTL within the profile. It can never name a source, target, policy or envelope.
The control plane turns an invocation into the ordinary operations that already exist — a dataset request or an environment lease — so every existing check (policies, certification, separation of duties, quotas, audit) still applies.
Routes
| Method | Path | Permission |
|---|---|---|
| GET | /v1/test-data/profiles | test_data.request |
| POST | /v1/test-data/plan | test_data.request |
| POST | /v1/test-data/requests (accepts Idempotency-Key) | test_data.request |
| GET | /v1/test-data/requests, /v1/test-data/requests/{test_data_request_id} | test_data.request |
| POST | /v1/test-data/requests/{test_data_request_id}/approve, /reject | dataset.approve |
| POST | /v1/test-data/requests/{test_data_request_id}/release | test_data.request |
| GET, PATCH | /v1/organization/test-data-settings | org.admin |
| GET, POST | /v1/workload-identities, /v1/workload-identities/{workload_identity_id}, /disable | org.admin |
| POST | /v1/auth/workload/token | public (the CI token is the credential) |
test_data.request is held by the Developer, QA engineer and TDM engineer roles (and the organization owner) — every one of them could already request datasets.
Five-minute synthetic quickstart
Run against a local, synthetic control plane (for example make demo-local) or a tenant where an administrator approved a profile. Everything below is synthetic.
- Sign in:
datanivra login --base-url http://127.0.0.1:8000 --tenant demo --email owner@demo.datanivra.example.test(local dev login), ordatanivra login --device --tenant <SLUG>against a hosted tenant. - List what you may invoke:
datanivra test-data profiles. - Write a request manifest
pr-regression.yaml:
apiVersion: datanivra.io/v1alpha1
kind: TestDataRequest
metadata:
name: pr-regression
spec:
profile:
name: healthcare-integration
version: 1
purpose_ref: QA-1234- Validate it locally (no network):
datanivra test-data validate pr-regression.yaml— prints the kind, name and canonical checksum; exit code 28 if invalid. - Dry run:
datanivra test-data plan pr-regression.yaml -o json— the decision (AUTO_APPROVED,PENDING_HUMAN_APPROVALorDENIED) with reason codes, resolved scenarios, TTL and arequest_checksumreproducibility pin. Nothing is created. - Request and wait:
datanivra test-data request pr-regression.yaml --wait -o json > request.json— exit 0 whenREADY. - Run your tests against the approved target from your network.
- Release:
datanivra test-data release "$(jq -r .id request.json)" --reason-code TEST_RUN_FINISHED.
Which path fits you
| You are | Authenticate with | Decision you can expect |
|---|---|---|
| A person using the console | Your normal sign-in | The console flows you already use |
| A developer or QA engineer using the CLI or an SDK | A user session (datanivra login --device) | Exactly your existing powers: a lease needs dataset.provision, a build follows your tenant's approval scope |
| A CI pipeline (GitHub Actions, GitLab CI) | Its own OIDC token exchanged for a workload session (CI workload identity) | Denied unless the profile's envelope names the identity; approved automatically only inside the envelope and when automatic approval is enabled; otherwise a person approves |
| An AI agent | The local MCP adapter using the session of the person or workload that runs it | Same rules as that session; the agent can never approve or widen anything |
Release, revoke and cleanup
Releasing a request ends only what it holds — see Lease vs revoke and troubleshooting.