Synthetic Data API

Synthetic data, five lines from here.

Train on your own data without sending it anywhere — the SDK encodes locally, and only embeddings reach the API.

  • pip install dataxid
  • 100K rows/month free
  • Apache-2.0 SDK
quickstart.py
import dataxid
import pandas as pd

dataxid.api_key = "dx_..."

df = pd.read_csv("data.csv")
synthetic = dataxid.synthesize(data=df, n_samples=1000)
Control

Steer the distribution, not just the row count.

Generation is a starting point, not the whole job. Rebalance a skewed category, correct for bias, hold known values fixed, or fill the gaps in what you already have.

Rebalance a category

Override the natural distribution of any categorical column.

rebalance.py
distribution = dataxid.Distribution(
    column="gender",
    probabilities={"M": 0.5, "F": 0.5},
)

synthetic = model.generate(
    n_samples=1000,
    distribution=distribution,
)

Correct for bias

Reduce statistical parity gaps across sensitive attributes.

bias.py
bias = dataxid.Bias(
    target="income",
    sensitive=["gender", "race"],
)

synthetic = model.generate(
    n_samples=1000,
    bias=bias,
)

Condition on known values

Fix the columns you already know and let the model complete the rest.

conditional.py
conditions = pd.DataFrame({
    "income": [">50K"] * 1000,
})

synthetic = model.generate(
    conditions=conditions,
)

Impute missing cells

Fill nulls with model predictions while every non-null cell stays put.

impute.py
model = dataxid.Model.create(data=df)

filled = model.impute(
    df,
    trials=3,
    pick="mode",
)
Architecture

Your raw data never leaves your machine.

The SDK encodes and decodes locally. Only abstract embeddings — 64 floats per row — cross the API boundary, so the service never sees a single real value.

The SDK encodes raw rows on your machine and sends only 64-float embeddings across the API boundary. DataXID fits the model and samples 7,043 new embeddings without ever seeing a real value, then the SDK decodes the returned embeddings back into synthetic rows locally.

Your machine · raw rows

Four raw customer rows with real values, held on your own machine
tenureMonthlyChargesTotalChargesInternetServiceContractChurn
4170.352,884.35DSLOne yearNo
348.20144.60DSLMonth-to-monthYes
58101.905,910.20Fiber opticTwo yearNo
1684.751,356.00Fiber opticMonth-to-monthYes

encode() — locally, in the SDK

The wire · float32[64] per row

out → DataXID · fit(embeddings)

back ← DataXID · sample(n=7,043)

No values, no identifiers. The model trains and generates on embeddings alone.

Your machine · synthetic rows

Four synthetic rows decoded back on your machine from the returned embeddings
tenureMonthlyChargesTotalChargesInternetServiceContractChurn
3456.951,889.50DSLOne yearNo
253.85108.15DSLMonth-to-monthYes
66105.656,844.50Fiber opticTwo yearNo
2289.101,980.20Fiber opticMonth-to-monthNo

decode() — locally, in the SDK

Noise when you want it

Optional Gaussian noise on embeddings is one flag away, and rare categorical values are protected by default.

Same split, every shape

Single-table, multi-table, and time series all cross the same boundary.

Surfaces

One engine. Three ways in.

Agentic Synthetic Data is itself an MCP client. The tools you hand your own agent are the same tools that run our product.

Dashboard

Describe what you need in plain language and watch the agent build it.

Profile, generate, and evaluate in one connected loop.

Python SDK

Drop generation into a pipeline or a CI job.

pip install dataxid

MCP server

Point Cursor or Claude at the API and let your own agent drive it.

Streamable HTTP, authenticated with your API key.

mcp.json
{
  "mcpServers": {
    "dataxid": {
      "url": "https://api.dataxid.com/mcp",
      "headers": {
        "Authorization": "Bearer dx_live_..."
      }
    }
  }
}
API design

Built like an API you'd want to depend on.

The boring parts are the ones you notice at 3am. They are all here, documented, and consistent across every endpoint.

Response envelope
Every response is { object, data, metadata }. Lists add has_more.
Idempotency
Idempotency-Key on all writes. Replays return the cached response for 24 hours.
Pagination
Cursor-based with limit and starting_after. No offset drift.
Rate limits
X-RateLimit-Limit, -Remaining, -Reset, plus Retry-After on 429.
Errors
Typed hierarchy with code, doc_url, param, and a request_id on every failure.
Retries
The SDK retries with exponential backoff and honours Retry-After.
Environments
dx_test_ keys hit a free sandbox. dx_live_ keys are metered.
60 req/minSliding window, per organization
100K rows/monthFree tier, resets each billing period

Start with your own dataset.

Generate your first synthetic rows on the free tier.

Or read the docs first