Sampuli drops into whatever you already use — a shell, a test runner, an ORM seed script, a CI job. Every value is country-accurate and validator-true. Pick your stack.
# 100 Kenyan people as JSON curl "https://sampuli.site/api/v1/ke/person?n=100" # German rows as CSV, only the fields you want curl "https://sampuli.site/api/v1/de/person?fields=name,account,card&n=500&format=csv" > seed.csv
const rows = await fetch( 'https://sampuli.site/api/v1/ng/person?n=250&fields=name,phone,bvn' ).then(r => r.json())
npm i @sampuli/data
import { generate, generateMany } from '@sampuli/data'
generate('ke.phone') // '0712345678'
generate('de.iban') // valid mod-97 IBAN
generateMany('br.person', 1000, { seed: 'ci' }) // reproducible
// prisma/seed.ts
import { PrismaClient } from '@prisma/client'
import { generateMany } from '@sampuli/data'
const db = new PrismaClient()
const people = generateMany('gb.person', 200, {
fields: ['name', 'email', 'phone', 'account'],
})
await db.customer.createMany({ data: people })
import { generateMany } from '@sampuli/data'
import { db } from './db'
import { customers } from './schema'
await db.insert(customers).values(
generateMany('us.person', 500, { fields: ['name', 'email', 'phone'] })
)
import { generate } from '@sampuli/data'
test('signup accepts a valid SA ID', async ({ page }) => {
await page.fill('#id_number', generate('za.id'))
await page.fill('#phone', generate('za.phone'))
await page.click('text=Continue')
})
# Turn a Sampuli CSV straight into a COPY / LOAD DATA file curl "https://sampuli.site/api/v1/fr/person?fields=name,email,account&n=1000&format=csv" \ | psql -c "COPY customers(name,email,iban) FROM STDIN CSV HEADER"
import requests
rows = requests.get(
"https://sampuli.site/api/v1/in/person",
params={"n": 500, "fields": "name,phone,id"},
).json()
Reach for faker for generic text (lorem, product blurbs, avatars); reach for Sampuli for anything that has to be correct for a country — IDs, tax numbers, IBANs, phone numbers.
import { faker } from '@faker-js/faker'
import { generate } from '@sampuli/data'
const customer = {
name: generate('de.name'), // country-accurate
iban: generate('de.iban'), // passes mod-97
bio: faker.lorem.paragraph(), // generic filler
avatar: faker.image.avatar(),
}
# Deterministic fixtures in CI — same seed, same data npx @sampuli/data us.person -n 1000 --seed "$GITHUB_SHA" --csv > fixtures/customers.csv
Prefer a GUI? Generate in the browser. Testing the API? Download the Postman collection ↓