Copy · paste · seed

Recipes: seed anything with realistic data

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.

Shell (curl)

# 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

Browser / any JS

const rows = await fetch(
  'https://sampuli.site/api/v1/ng/person?n=250&fields=name,phone,bvn'
).then(r => r.json())

Node — the npm package (no network, no cap)

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

// 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 })

Drizzle seed

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'] })
)

Playwright / Cypress fixtures

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')
})

SQL inserts

# 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"

Python

import requests
rows = requests.get(
    "https://sampuli.site/api/v1/in/person",
    params={"n": 500, "fields": "name,phone,id"},
).json()

Using Sampuli alongside faker

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(),
}

CI

# 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 ↓