{"openapi":"3.1.0","info":{"title":"Rowsmith test data API","version":"generator 1","description":"Generated fake test data from a schema. Free and rate-limited; nothing is sold. No real person's data is used as input and no record is derived from a real person. Identifiers come only from reserved or invalid ranges. Same schema + seed + generator version gives byte-identical output. Every endpoint takes a seed and returns X-Output-Version; send version to pin it (409 if not served). Every response: X-RateLimit-Limit, X-RateLimit-Reset; counted calls: X-RateLimit-Remaining. Terms: /terms. Data notice: /privacy. This document is dedicated to the public domain (CC0); the service is governed by /terms.","license":{"name":"CC0-1.0","identifier":"CC0-1.0"},"contact":{"name":"Rowsmith","url":"https://github.com/meiorz/rowsmith-mcp/issues"},"x-limits":{"max_rows":500,"max_columns":50,"max_cost_units":7000,"daily_cap_per_caller":200,"daily_cap_global":20000,"max_body_bytes":65536},"x-prng":"sfc32-splitmix32","x-output-versions":{"generator":"1","catalogue":"1","dataset":"1","sandbox":"2"}},"servers":[{"url":"https://testdata-api.re-jam620.workers.dev"}],"paths":{"/v1/generate":{"post":{"summary":"Generate rows from a schema","parameters":[{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"oneOf":[{"required":["columns"]},{"required":["schema"]}],"properties":{"table":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$","default":"data"},"rows":{"type":"integer","minimum":1,"maximum":500,"default":100},"seed":{"type":"integer","minimum":0,"maximum":4294967295,"default":1},"version":{"type":"string","description":"Pin the output version; refused with 409 if not served"},"format":{"enum":["csv","json","sql"],"default":"csv"},"columns":{"type":"array","minItems":1,"maxItems":50,"items":{"oneOf":[{"title":"uuid","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"uuid"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"uuid_col","type":"uuid"}},{"title":"sequence","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"sequence"},"null_rate":{"type":"number","minimum":0,"maximum":1},"start":{"type":"integer","minimum":0,"maximum":1000000000000,"example":1},"step":{"type":"integer","minimum":1,"maximum":1000000,"example":1},"prefix":{"type":"string","pattern":"^[A-Za-z0-9_-]{0,16}$","example":"ord_"},"pad":{"type":"integer","minimum":0,"maximum":16,"example":4}},"example":{"name":"sequence_col","type":"sequence"}},{"title":"integer","type":"object","additionalProperties":false,"required":["name","type","min","max"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"integer"},"null_rate":{"type":"number","minimum":0,"maximum":1},"min":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":1},"max":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":100}},"example":{"name":"integer_col","type":"integer","min":1,"max":100}},{"title":"decimal","type":"object","additionalProperties":false,"required":["name","type","min","max"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"decimal"},"null_rate":{"type":"number","minimum":0,"maximum":1},"min":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":1},"max":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":100},"scale":{"type":"integer","minimum":0,"maximum":6,"default":2,"example":2}},"example":{"name":"decimal_col","type":"decimal","min":1,"max":100}},{"title":"boolean","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"boolean"},"null_rate":{"type":"number","minimum":0,"maximum":1},"p_true":{"type":"number","minimum":0,"maximum":1,"default":0.5,"example":0.8}},"example":{"name":"boolean_col","type":"boolean"}},{"title":"enum","type":"object","additionalProperties":false,"required":["name","type","values"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"enum"},"null_rate":{"type":"number","minimum":0,"maximum":1},"values":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","maxLength":64,"pattern":"^(?![=+\\-@])[^\\u0000-\\u001f\\u007f\\\\]*$"},"example":["paid","refunded"]},"weights":{"type":"array","items":{"type":"number","minimum":0,"maximum":1000000},"description":"Same length as values","example":[8,2]}},"example":{"name":"enum_col","type":"enum","values":["paid","refunded"]}},{"title":"date","type":"object","additionalProperties":false,"required":["name","type","from","to"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"date"},"null_rate":{"type":"number","minimum":0,"maximum":1},"from":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-01-01","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-12-31","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"example":{"name":"date_col","type":"date","from":"2026-01-01","to":"2026-12-31"}},{"title":"datetime","type":"object","additionalProperties":false,"required":["name","type","from","to"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"datetime"},"null_rate":{"type":"number","minimum":0,"maximum":1},"from":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-01-01"},"to":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-12-31"}},"example":{"name":"datetime_col","type":"datetime","from":"2026-01-01","to":"2026-12-31"}},{"title":"first_name","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"first_name"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"first_name_col","type":"first_name"}},{"title":"last_name","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"last_name"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"last_name_col","type":"last_name"}},{"title":"full_name","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"full_name"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"full_name_col","type":"full_name"}},{"title":"email","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"email"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"email_col","type":"email"}},{"title":"phone","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"phone"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"phone_col","type":"phone"}},{"title":"test_card","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"test_card"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"test_card_col","type":"test_card"}},{"title":"ssn_invalid","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"ssn_invalid"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"ssn_invalid_col","type":"ssn_invalid"}},{"title":"iban_invalid","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"iban_invalid"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"iban_invalid_col","type":"iban_invalid"}},{"title":"text","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"text"},"null_rate":{"type":"number","minimum":0,"maximum":1},"min_words":{"type":"integer","minimum":1,"maximum":50,"default":3,"example":3},"max_words":{"type":"integer","minimum":1,"maximum":50,"default":12,"example":8}},"example":{"name":"text_col","type":"text"}}],"discriminator":{"propertyName":"type"}}},"schema":{"type":"object","description":"Instead of columns (send exactly one): a JSON Schema object (draft 2020-12 or draft-07; type object with properties; local $ref to #/$defs/, #/definitions/ or #/components/schemas/), or {\"openapi\": <OpenAPI document>, \"component\": \"<name under components.schemas>\"}. Pydantic and Zod schemas through their JSON Schema export. Mapped to columns by schema version 1 (X-Schema-Version): formats email, uuid, date and date-time, string enums, integer and number bounds (multipleOf sets the decimal places), booleans, the name hints email, first_name, last_name, name, full_name and phone, and other strings as text; nested objects one level deep as parent_child columns; nullable properties get null_rate 0.1. Anything else is left out, never guessed, and named in X-Schema-Unmapped; when nothing maps, 400 names each property and why. example, examples, default, const and x-* values are never used or echoed. At most 50 mapped properties and $ref chains 8 deep; a $ref cycle is refused.","x-schema-version":1}}}}}},"responses":{"200":{"description":"The generated data. Headers: X-Generator-Version, X-Output-Version, X-PRNG, X-Seed; on CSV and SQL also X-Reproduce: \"POST /v1/generate body-b64url=<base64url JSON>\", the request with defaults filled in and version pinned that regenerates the same bytes (\"body-sha256=<hex>\" instead when that would exceed 2048 characters). With schema, also X-Schema-Version (1) and, when a property was left out, X-Schema-Unmapped: the unmapped property paths, comma-separated (e.g. tags,address.zip), cut at 1024 characters with \"+N more\"; X-Reproduce then holds the mapped columns, not the schema. X-Output-SHA256: sha256 (hex) of the exact body bytes. X-Request-SHA256: sha256 of the canonical request (the JSON X-Reproduce encodes on /v1/generate, also on JSON answers; the path and query X-Reproduce names on /v1/invalid). Pair them in a golden manifest to pin a dataset and detect drift; nothing is stored. Neither is sent with empty_result. A pinned version is served as long as the service runs; a retired version answers 409."},"400":{"description":"The columns do not match the grammar, the schema cannot be mapped, or both or neither of columns and schema were sent."},"409":{"description":"The requested version is not served."},"413":{"description":"Body larger than 64 KB."},"422":{"description":"The request exceeds the cost budget; send fewer rows or columns."},"429":{"description":"Daily limit reached. Retry-After gives the seconds until 00:00 UTC."},"451":{"description":"Not available in this location."},"503":{"description":"The service is not open."}}}},"/v1/dataset":{"post":{"summary":"Generate related tables in one call (foreign keys that agree)","parameters":[{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["tables"],"properties":{"seed":{"type":"integer","minimum":0,"maximum":4294967295,"default":1},"format":{"enum":["sql","json"],"default":"sql"},"version":{"type":"string","description":"Pin the generator version; refused with 409 if not served"},"dataset_version":{"type":"string","description":"Pin the dataset version (1); refused with 409 if not served"},"tables":{"type":"array","minItems":1,"maxItems":10,"description":"1 to 10 tables, in dependency order. Rows across all tables: at most 500; the cost is the sum of the tables' cost units, within the per-call budget. Each table is generated with its own seed, derived from the request seed and the table name, so adding a table does not change the others.","items":{"type":"object","additionalProperties":false,"required":["name"],"oneOf":[{"required":["columns"]},{"required":["schema"]}],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"rows":{"type":"integer","minimum":1,"maximum":500,"default":10},"columns":{"type":"array","minItems":1,"maxItems":50,"description":"The column grammar of /v1/generate, plus primary_key: true on one uuid or sequence column (without one, a uuid or sequence column named id is the primary key), plus ref columns.","items":{"oneOf":[{"title":"uuid","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"uuid"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"uuid_col","type":"uuid"}},{"title":"sequence","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"sequence"},"null_rate":{"type":"number","minimum":0,"maximum":1},"start":{"type":"integer","minimum":0,"maximum":1000000000000,"example":1},"step":{"type":"integer","minimum":1,"maximum":1000000,"example":1},"prefix":{"type":"string","pattern":"^[A-Za-z0-9_-]{0,16}$","example":"ord_"},"pad":{"type":"integer","minimum":0,"maximum":16,"example":4}},"example":{"name":"sequence_col","type":"sequence"}},{"title":"integer","type":"object","additionalProperties":false,"required":["name","type","min","max"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"integer"},"null_rate":{"type":"number","minimum":0,"maximum":1},"min":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":1},"max":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":100}},"example":{"name":"integer_col","type":"integer","min":1,"max":100}},{"title":"decimal","type":"object","additionalProperties":false,"required":["name","type","min","max"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"decimal"},"null_rate":{"type":"number","minimum":0,"maximum":1},"min":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":1},"max":{"type":"number","minimum":-1000000000000,"maximum":1000000000000,"example":100},"scale":{"type":"integer","minimum":0,"maximum":6,"default":2,"example":2}},"example":{"name":"decimal_col","type":"decimal","min":1,"max":100}},{"title":"boolean","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"boolean"},"null_rate":{"type":"number","minimum":0,"maximum":1},"p_true":{"type":"number","minimum":0,"maximum":1,"default":0.5,"example":0.8}},"example":{"name":"boolean_col","type":"boolean"}},{"title":"enum","type":"object","additionalProperties":false,"required":["name","type","values"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"enum"},"null_rate":{"type":"number","minimum":0,"maximum":1},"values":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","maxLength":64,"pattern":"^(?![=+\\-@])[^\\u0000-\\u001f\\u007f\\\\]*$"},"example":["paid","refunded"]},"weights":{"type":"array","items":{"type":"number","minimum":0,"maximum":1000000},"description":"Same length as values","example":[8,2]}},"example":{"name":"enum_col","type":"enum","values":["paid","refunded"]}},{"title":"date","type":"object","additionalProperties":false,"required":["name","type","from","to"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"date"},"null_rate":{"type":"number","minimum":0,"maximum":1},"from":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-01-01","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-12-31","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"example":{"name":"date_col","type":"date","from":"2026-01-01","to":"2026-12-31"}},{"title":"datetime","type":"object","additionalProperties":false,"required":["name","type","from","to"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"datetime"},"null_rate":{"type":"number","minimum":0,"maximum":1},"from":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-01-01"},"to":{"type":"string","description":"YYYY-MM-DD (datetime also takes an ISO 8601 time), 1900 to 2100","example":"2026-12-31"}},"example":{"name":"datetime_col","type":"datetime","from":"2026-01-01","to":"2026-12-31"}},{"title":"first_name","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"first_name"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"first_name_col","type":"first_name"}},{"title":"last_name","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"last_name"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"last_name_col","type":"last_name"}},{"title":"full_name","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"full_name"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"full_name_col","type":"full_name"}},{"title":"email","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"email"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"email_col","type":"email"}},{"title":"phone","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"phone"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"phone_col","type":"phone"}},{"title":"test_card","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"test_card"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"test_card_col","type":"test_card"}},{"title":"ssn_invalid","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"ssn_invalid"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"ssn_invalid_col","type":"ssn_invalid"}},{"title":"iban_invalid","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"iban_invalid"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"iban_invalid_col","type":"iban_invalid"}},{"title":"text","type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"text"},"null_rate":{"type":"number","minimum":0,"maximum":1},"min_words":{"type":"integer","minimum":1,"maximum":50,"default":3,"example":3},"max_words":{"type":"integer","minimum":1,"maximum":50,"default":12,"example":8}},"example":{"name":"text_col","type":"text"}},{"title":"ref","type":"object","additionalProperties":false,"required":["name","type","table","column"],"description":"A foreign key: each value is drawn by seed from the values generated in this call for the primary key of an earlier table of the same request. Refs resolve only inside the request; nothing is stored.","properties":{"name":{"type":"string","pattern":"^[a-z_][a-z0-9_]{0,62}$"},"type":{"const":"ref"},"table":{"type":"string"},"column":{"type":"string"},"null_rate":{"type":"number","minimum":0,"maximum":1}},"example":{"name":"customer_id","type":"ref","table":"customers","column":"id"}}]}},"schema":{"type":"object","description":"Instead of columns: a JSON Schema or OpenAPI component, mapped as on /v1/generate (no ref columns)."}}}}}}}}},"responses":{"200":{"description":"sql (default): per table, in order, CREATE TABLE (TEXT, BIGINT, NUMERIC, BOOLEAN, DATE, TIMESTAMPTZ; PRIMARY KEY; FOREIGN KEY for refs) then its INSERTs. Written in the dialect common to PostgreSQL and SQLite 3.23 or later; CI executes it in SQLite with foreign keys enforced and in PostgreSQL 16. json: {\"tables\": {\"<name>\": [rows]}}. Headers: X-Generator-Version, X-Output-Version, X-Dataset-Version, X-PRNG, X-Seed; on sql X-Reproduce: \"POST /v1/dataset body-b64url=<base64url JSON>\"; X-Request-SHA256 and X-Output-SHA256 as on /v1/generate; X-Dataset-Rows-SHA256: \"<table>=<sha256>,...\", per table the sha256 of the JSON of its rows as arrays of values in column order, the same for the sql and the json form of one request. With schema tables, X-Schema-Version and X-Schema-Unmapped (paths prefixed by the table name). X-Output-SHA256: sha256 (hex) of the exact body bytes. X-Request-SHA256: sha256 of the canonical request (the JSON X-Reproduce encodes on /v1/generate, also on JSON answers; the path and query X-Reproduce names on /v1/invalid). Pair them in a golden manifest to pin a dataset and detect drift; nothing is stored. Neither is sent with empty_result. A pinned version is served as long as the service runs; a retired version answers 409."},"400":{"description":"The tables do not match the grammar, a ref points to a later, unknown or non-key column, or the rows exceed the total."},"409":{"description":"The requested version or dataset version is not served."},"413":{"description":"Body larger than 64 KB."},"422":{"description":"The tables together exceed the cost budget."},"429":{"description":"Daily limit reached. Retry-After gives the seconds until 00:00 UTC."}}}},"/v1/types":{"get":{"summary":"List the column types and their options","responses":{"200":{"description":"OK"}}}},"/v1/invalid":{"get":{"summary":"Invalid-on-purpose values (TEST DATA), each with the reason it is invalid","parameters":[{"name":"kind","in":"query","schema":{"enum":["email","card","address","unicode","iban","ssn","all"],"default":"all"}},{"name":"count","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"seed","in":"query","schema":{"type":"integer","minimum":0,"maximum":4294967295,"default":1}},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Comma-separated item fields, e.g. value,reason"},{"name":"version","in":"query","schema":{"type":"string"}},{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"responses":{"200":{"description":"{version, seed, kind, count, test_data, items[{kind, value, reason}]}. Headers: X-Output-Version, X-Test-Data, X-Reproduce: \"GET /v1/invalid?kind=<kind>&count=<count>&seed=<seed>[&fields=<fields>]&version=<version>\", the request with defaults filled in and version pinned that regenerates the same bytes. X-Output-SHA256: sha256 (hex) of the exact body bytes. X-Request-SHA256: sha256 of the canonical request (the JSON X-Reproduce encodes on /v1/generate, also on JSON answers; the path and query X-Reproduce names on /v1/invalid). Pair them in a golden manifest to pin a dataset and detect drift; nothing is stored. Neither is sent with empty_result. A pinned version is served as long as the service runs; a retired version answers 409."},"400":{"description":"JSON {error, next}: next says what to do."},"409":{"description":"JSON {error, next}: next says what to do."},"429":{"description":"JSON {error, next}: next says what to do."}}}},"/llms.txt":{"get":{"summary":"Plain-text guide for agents","responses":{"200":{"description":"OK"}}}},"/pricing.json":{"get":{"summary":"The free tier and its limits","responses":{"200":{"description":"OK"}}}},"/status.json":{"get":{"summary":"Last 7 UTC days of calls, distinct callers and refusals (approximate, team traffic excluded), limits, MCP tool size and uptime","responses":{"200":{"description":"No-store. Under 5 distinct callers a day, callers show as \"<5\" and refusals as one total."},"429":{"description":"JSON {error, next}: next says what to do."}}}},"/v1/sandbox":{"post":{"summary":"Create a payment sandbox (TEST DATA; deleted 1 hour after creation)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{"seed":{"type":"integer","minimum":0,"maximum":4294967295,"default":1}}}}}},"responses":{"201":{"description":"The sandbox: id (sbx_...), seed, version. Every object: livemode false, sandbox true, test_data \"TEST DATA\"; header X-Rowsmith-Sandbox: test."},"400":{"description":"JSON {error, next}: next says what to do."},"404":{"description":"JSON {error, next}: next says what to do."},"429":{"description":"JSON {error, next}: next says what to do."}}}},"/v1/sandbox/{id}/charges":{"post":{"summary":"Create a test charge. Only card numbers from Stripe's published testing list are accepted.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^sbx_[0-9a-f]{32}$"}},{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["amount","card"],"properties":{"amount":{"type":"integer","minimum":1,"maximum":99999999,"description":"Minor units"},"currency":{"enum":["usd","eur","gbp","jpy","cad","aud"],"default":"usd"},"card":{"type":"string"},"reference":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"1-40 of A-Z a-z 0-9 _ -, fewer than 8 digits in a row"},"metadata":{"type":"object","maxProperties":10,"propertyNames":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"1-40 of A-Z a-z 0-9 _ -, fewer than 8 digits in a row"},"additionalProperties":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"1-40 of A-Z a-z 0-9 _ -, fewer than 8 digits in a row"},"description":"Tokens only; fewer than 8 digits in a row"},"exp_month":{"type":"integer","minimum":1,"maximum":12},"exp_year":{"type":"integer","minimum":2000,"maximum":2099}}}}}},"responses":{"201":{"description":"The charge. Every object: livemode false, sandbox true, test_data \"TEST DATA\"; header X-Rowsmith-Sandbox: test."},"400":{"description":"JSON {error, next}: next says what to do."},"404":{"description":"JSON {error, next}: next says what to do."},"409":{"description":"JSON {error, next}: next says what to do."},"422":{"description":"Declined: code, decline_code, charge."},"429":{"description":"JSON {error, next}: next says what to do."}}},"get":{"summary":"List charges, newest first","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^sbx_[0-9a-f]{32}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"fields","in":"query","schema":{"type":"string"}},{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"responses":{"200":{"description":"{object: list, data, has_more}. Every object: livemode false, sandbox true, test_data \"TEST DATA\"; header X-Rowsmith-Sandbox: test."},"404":{"description":"JSON {error, next}: next says what to do."},"429":{"description":"JSON {error, next}: next says what to do."}}}},"/v1/sandbox/{id}/charges/{charge}":{"get":{"summary":"Retrieve a charge","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^sbx_[0-9a-f]{32}$"}},{"name":"charge","in":"path","required":true,"schema":{"type":"string"}},{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"responses":{"200":{"description":"The charge. Every object: livemode false, sandbox true, test_data \"TEST DATA\"; header X-Rowsmith-Sandbox: test."},"404":{"description":"JSON {error, next}: next says what to do."}}}},"/v1/sandbox/{id}/refunds":{"post":{"summary":"Refund a succeeded charge, fully or in part","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^sbx_[0-9a-f]{32}$"}},{"name":"fail","in":"query","schema":{"type":"string","pattern":"^(429|500|503)@(0(\\.\\d{1,6})?|1(\\.0{1,6})?)$"},"description":"Inject a failure, e.g. 429@0.2"},{"name":"latency","in":"query","schema":{"type":"integer","minimum":0,"maximum":3000},"description":"Wait this many ms first"},{"name":"empty_result","in":"query","schema":{"enum":["1","true"]},"description":"Answer with no rows or items"},{"name":"attempt","in":"query","schema":{"type":"integer","minimum":1,"maximum":100000,"default":1},"description":"Roll counter for fail on stateless endpoints"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["charge"],"properties":{"charge":{"type":"string","pattern":"^ch_test_[0-9a-f]{24}$"},"amount":{"type":"integer","minimum":1},"reference":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","description":"1-40 of A-Z a-z 0-9 _ -, fewer than 8 digits in a row"}}}}}},"responses":{"201":{"description":"The refund. Every object: livemode false, sandbox true, test_data \"TEST DATA\"; header X-Rowsmith-Sandbox: test."},"404":{"description":"JSON {error, next}: next says what to do."},"409":{"description":"JSON {error, next}: next says what to do."},"422":{"description":"JSON {error, next}: next says what to do."}}}},"/v1/sandbox/{id}/reset":{"post":{"summary":"Delete every object in the sandbox; the expiry does not move","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^sbx_[0-9a-f]{32}$"}}],"responses":{"200":{"description":"Reset. Every object: livemode false, sandbox true, test_data \"TEST DATA\"; header X-Rowsmith-Sandbox: test."},"404":{"description":"JSON {error, next}: next says what to do."}}}}}}