Realistic synthetic data, generated on demand
Generate complete, related tables of realistic data with a single API call. People, addresses, places, flights and calculated values, ready to load into any database.
{
"tables": [{
"name": "customer",
"rowCount": 10000,
"fields": [
{ "type": "Number", "mode": "Sequential", "start": 1,
"map": { "value": { "column": "id", "dataType": "Integer" } } },
{ "type": "Person", "countries": [{ "country": "us" }],
"map": {
"firstName": { "column": "first_name", "dataType": "VarChar" },
"lastName": { "column": "last_name", "dataType": "VarChar" },
"dob": { "column": "dob", "dataType": "Date" } } },
{ "type": "Address", "boundingLocation": { "country": "us", "state": "az" },
"map": {
"addressLine1": { "column": "address", "dataType": "VarChar" },
"city": { "column": "city", "dataType": "VarChar" },
"zip": { "column": "zip", "dataType": "VarChar" },
"location": { "column": "home", "dataType": "Geometry" } } },
{ "type": "Calculated",
"calculation": {
"operation": "Age",
"inputs": [{ "column": "dob" }, { "literal": "2026-01-01" }] },
"map": { "value": { "column": "age", "dataType": "Integer" } } }
]
}]
}
Realistic by Design
Addresses, places, airports and airlines come from real reference data, so every row holds together.
Related Tables
Build parent and child tables in one request, with foreign keys that always match.
Ready to Load
Typed CSV with a schema, ready to import with Velocity, Foundry or any database tool.
Prepaid Credit
No subscription and no monthly fee. Credit you buy never expires.
Consistent data in every row
When every value is picked on its own, you get house numbers that don't exist on the street, ZIP codes in the wrong city and flights that arrive before they leave. Alchemy generates related values together from real reference data, so an address, a person or a flight is consistent across every column it fills.
Real, deliverable US addresses
Every Address row is a real US street address. The house number, street, unit, city, county, state and ZIP all come from the same address, and the coordinates point to where it actually is. Your test data passes the same address checks your production data does.
- Official county names, such as
Orleans ParishandAnchorage Municipality - Filter by state or county, a WKT polygon, or a radius around a point
- Coordinates as WKT for a
Geometrycolumn, or as separate X and Y values - Unique addresses on request, checked before any data is generated
{
"type": "Address",
"boundingLocation": { "country": "us", "state": "az" },
"map": {
"addressLine1": { "column": "street", "dataType": "VarChar" },
"city": { "column": "city", "dataType": "VarChar" },
"state": { "column": "state", "dataType": "VarChar" },
"zip": { "column": "zip", "dataType": "VarChar" },
"coordinateY": { "column": "latitude", "dataType": "Double" },
"coordinateX": { "column": "longitude", "dataType": "Double" }
}
}
| street | city | state | zip | latitude | longitude |
|---|---|---|---|---|---|
| 5020 West Peoria Avenue | Glendale | AZ | 85302 | 33.5820 | -112.1668 |
| 17460 West Willow Avenue | Surprise | AZ | 85388 | 33.6083 | -112.4342 |
| 1500 East Cedar Avenue | Flagstaff | AZ | 86004 | 35.2181 | -111.6208 |
Spatial data within any boundary
Generate points, lines and polygons for Geometry and Geography columns inside a city, county or state, around a point, or within your own polygon. The Location field returns real cities, counties, states and ZIP areas with their published boundaries.
- Points, lines, polygons and multi-part shapes as WKT
- Points as WKT or as separate X and Y values
- Keep generated geometry on land with
withinCountries - Polygons with holes
Names from around the world
Names come from each country's own name data, weighted by how common they are, so a generated customer list looks like a real one. The Person field generates first, middle and last names, sex, date of birth and US race and ethnicity together, so everything in the row agrees. Polish, Czech, Greek and Irish surnames take the masculine or feminine form that matches the person.
- Blend countries with relative weights, such as two US rows for every UK row
- Japanese in Romaji, Kanji or Hiragana, Korean in Hangul, and Greek in the Greek alphabet
- Filter by popularity, first letter and length
- Dates of birth spread across a range or clustered around an average age
- IDs built from the person, such as
X-1994-1103-MCCAL-4820
{
"type": "Person",
"countries": [{ "country": "pl" }],
"dobStart": "1960-01-01",
"dobEnd": "2005-12-31",
"map": {
"firstName": { "column": "first_name", "dataType": "VarChar" },
"lastName": { "column": "last_name", "dataType": "VarChar" },
"dob": { "column": "date_of_birth", "dataType": "Date" },
"sex": { "column": "sex", "dataType": "VarChar" }
}
}
| first_name | last_name | date_of_birth | sex |
|---|---|---|---|
| Arina | Szwiec | 1994-01-10 | Female |
| Jaroslaw | Kmieciński | 1994-09-10 | Male |
| Janina | Kuchar | 1969-02-03 | Female |
| Zen | Matuszczyk | 1960-02-01 | Male |
| last_name |
|---|
| 勝木 |
| 諏訪 |
| 駒井 |
| 正広 |
Columns calculated from the rest of the row
Derive a value from other columns in the same row: a line total from quantity and price, an age band from a date of birth, or the distance between two generated points. Operations nest inside each other, so complex expressions need no special syntax, and hidden columns let you calculate from inputs you don't want in the output.
- Arithmetic: addition, subtraction, multiplication, division and rounding
- Text: templates, slugs, hashes, casing, trimming and slicing
- Dates: age, date parts, date arithmetic and truncation
- Geometry: distance, bearing, area, buffer, centroid, within, intersects, GeoJSON and geohash
- Logic: compare, if, case, and/or/not, coalesce and map
[
{ "type": "Number", "mode": "Real", "min": 50, "max": 2500, "scale": 2,
"map": { "value": { "column": "total", "dataType": "Decimal" } } },
{ "type": "Calculated",
"calculation": {
"operation": "If",
"when": { "operation": "Compare", "comparison": "GreaterThan",
"inputs": [{ "column": "total" }, { "literal": 1000 }] },
"then": { "literal": "Review" },
"else": { "literal": "Auto" } },
"map": { "value": { "column": "approval_path", "dataType": "VarChar" } } },
{ "type": "Calculated",
"calculation": {
"operation": "Case",
"cases": [
{ "when": { "operation": "Compare", "comparison": "LessThan",
"inputs": [{ "column": "total" }, { "literal": 200 }] },
"then": { "literal": "Bronze" } },
{ "when": { "operation": "Compare", "comparison": "LessThan",
"inputs": [{ "column": "total" }, { "literal": 1000 }] },
"then": { "literal": "Silver" } } ],
"default": { "literal": "Gold" } },
"map": { "value": { "column": "tier", "dataType": "VarChar" } } }
]
| total | approval_path | tier |
|---|---|---|
| 697.97 | Auto | Silver |
| 2350.57 | Review | Gold |
| 351.53 | Auto | Silver |
| 2072.25 | Review | Gold |
Real airports and flights
The Airport field returns real airports with their IATA, ICAO and local codes, location, elevation and time zone. The Flight field builds a complete journey between two airports: a real airline, a valid flight number, a duration based on the distance flown, and departure and arrival in each airport's local time. Filter each end separately, for example US airports to anywhere in Europe.
- Adjustable cruising speed and taxi time
- Route as a WKT line, distance in kilometers or miles, seat class and seat number
- Filter each end by airport, country, region, continent or airport type
- Domestic or international scope, and minimum or maximum distance
- Heliports, seaplane bases and closed airfields when you need them
{
"type": "Flight",
"departure": { "countries": ["us"], "types": ["LargeAirport"] },
"arrival": { "continents": ["EU"], "types": ["LargeAirport"] },
"scope": "International",
"minDistanceKilometers": 5000,
"maxDistanceKilometers": 9000,
"departureTime": {
"mode": "Random",
"min": "2026-03-01T00:00:00",
"max": "2026-03-31T23:59:59"
},
"map": {
"flightNumber": { "column": "flight", "dataType": "VarChar" },
"airlineName": { "column": "airline", "dataType": "VarChar" },
"departureAirport": { "column": "from", "dataType": "Char" },
"arrivalAirport": { "column": "to", "dataType": "Char" },
"departureTime": { "column": "departs", "dataType": "DateTime" },
"arrivalTime": { "column": "arrives", "dataType": "DateTime" }
}
}
| flight | airline | from | to | departs | arrives |
|---|---|---|---|---|---|
| LM260 | Loganair | JAX | LHR | 2026-03-12 17:05:45 | 2026-03-13 05:55:45 |
| TO9 | Transavia France | IAD | CDG | 2026-03-25 12:38:37 | 2026-03-26 01:43:37 |
| AZ14 | ITA Airways | BHM | TSF | 2026-03-15 08:39:16 | 2026-03-16 00:59:16 |
| N730 | Nordic Regional Airlines | BWI | HEL | 2026-03-02 09:40:15 | 2026-03-03 01:35:15 |
Pay as you go, with credit that never expires
Alchemy runs on prepaid credit. There's no subscription, no monthly row allowance and nothing that resets at the end of the month. Buy credit when you need it, and whatever you don't use stays on your account. Every response tells you exactly what the call cost.
- No subscription fee, seat count, contract or minimum spend
- The cost of every call in the response and the
X-Alchemy-Costheader - Your balance and full call history through the account endpoints
- Optional auto top-up, within limits you set
X-Alchemy-Cost: 0.0001
Everything your test data needs
Valid identifiers, typed output and a browser test bench for building requests.
Valid Identifiers
Credit card numbers, IBANs, VINs, routing numbers, ISINs, CUSIPs, LEIs, barcodes and ISBNs that pass check-digit validation.
Typed Columns and a Schema
Every column keeps the data type you declare, and every response includes a schema. Get inline JSON, plain CSV or a packaged .csvx file.
No Production Data
You send a description of the data, not the data itself. Nothing to copy, mask or scrub out of a live system.
Crucible Test Bench
Build and run requests in the browser, inspect the rows, types and schema, and see spatial columns on a map. Download the results as CSV.
Where teams use Alchemy
Anywhere you need a database full of data that looks and behaves like your own.
Development and QA
Fill development and test databases with data that behaves like production, without copying production.
Demos and Training
Give sales demos and training environments customers, addresses and orders that look like the real thing.
Location and Mapping
Test geofencing, routing and map displays with addresses and shapes in the right places.
Travel and Logistics
Load booking, itinerary and scheduling systems with flights between real airports on real airlines.
From request to data set
Alchemy is a hosted HTTPS API. There's nothing to install, and any language with an HTTP client can call it.
Define your tables
List your tables, their row counts and a field for each column. Each field's map sets the column name and data type.
Call the API
Post the request to /v1/generate-dataset with your API key in the X-Api-Key header, or try it first in Crucible.
Try Alchemy in Crucible
Build a request in the browser and see the generated data straight away. Crucible is available to every registered account and runs on your own API key.