A SMALL API FOR RELIABLE IMPORTS

Your columns.
Your rules.
Every violation.

Send CSV and a column contract. Get exact record numbers, clear error codes and complete issue counts.

0.003 USDC / report · Base

No account. No subscription. Pay with an x402 v2 client using a standard EOA wallet.

Read the API contract

An import that fails, explained.

Real validator output · free example
01 / REQUEST
{
  "csv": "id,active,price\n1,TRUE,-5\n1,false,12",
  "columns": {
    "id": {
      "type": "integer",
      "unique": true
    },
    "active": {
      "type": "boolean"
    },
    "price": {
      "type": "number",
      "min": 0
    }
  }
}
02 / REPORT3 issues found
{
  "valid": false,
  "dataRows": 2,
  "issueCount": 3,
  "issues": [
    {
      "record": 2,
      "column": "active",
      "code": "type"
    },
    {
      "record": 2,
      "column": "price",
      "code": "below_min"
    },
    {
      "record": 3,
      "column": "id",
      "code": "duplicate_value"
    }
  ]
}
Types & presence

Strings, safe integers, finite numbers and strict true/false booleans. Missing headers and malformed rows get their own errors.

Value constraints

Nullability, exact-string uniqueness, enum membership, numeric bounds and Unicode code-point lengths.

Explicit, deterministic

No model guesses. No external data lookup. Quoted delimiters, embedded newlines, escaped quotes and UTF-8 BOM supported.

One request. A precise report.

Discovery manifest

POST /v1/validate · JSON in, JSON out. The first valid unpaid request returns HTTP 402 and a base64 PAYMENT-REQUIRED header. An x402 v2 client authorizes exactly 3,000 atomic USDC on Base and retries with PAYMENT-SIGNATURE.

curl -i -X POST https://tabular-contract.goodcrypto1.chatgpt.site/v1/validate -H "Content-Type: application/json" --data '{"csv":"id\n1\n1","columns":{"id":{"type":"integer","unique":true}}}'

Request fields

csvRequired string. First record is the header.
columnsRequired object keyed by exact header name. Every declared header must exist.
delimiterComma by default. Also semicolon, tab or pipe.
trimFalse by default. When true, trims headers and cell edges.
allowExtraColumnsFalse by default. When true, undeclared columns are ignored.

Column rule fields

typeRequired: string, integer, number or boolean.
nullableFalse by default. Empty string is the only null value.
uniqueFalse by default. Checks exact nonempty text after optional trimming.
enumArray of 1–100 permitted strings, compared exactly.
min / maxInclusive numeric limits.
minLength / maxLengthInclusive Unicode code-point limits, strings only.
Limits and exact semantics

Maximum CSV: 262,144 UTF-8 bytes, 5,000 data records, 64 columns. Entire JSON body: 600,000 bytes. The first 200 issues are returned; totals include every violation. Record numbers are logical records starting at 1 for the header, not physical lines. A header-only file is valid when its headers satisfy the contract.

Integers reject leading zeros, plus signs, decimals and values outside JavaScript’s safe integer range. Numbers use finite IEEE-754 semantics; scientific notation is accepted. Booleans must be lowercase true or false. A missing cell is an error even for nullable columns. Duplicate headers are reported; rules use the first matching column. Unknown rule fields are rejected.

Blank records are not skipped. LF, CRLF and CR separators are accepted. Whitespace after a closing quote is rejected. Dates, regular expressions, cross-field rules, spreadsheet formulas and semantic truth are not evaluated. This is a format and contract check, not a security scan or certification of data accuracy.

Payment, retries and testing status

Malformed requests return HTTP 400 before payment. Valid requests containing contract violations still produce paid reports. Payment goes directly to the receiving wallet. No private key is requested.

An authorization is bound to the exact JSON request bytes. Repeat the identical body and signature to retrieve a report without another charge. A different body returns HTTP 409. If settlement is uncertain, the report is still provided with HTTP 202 and an unverified payment status. Do not authorize another payment. Receipts are retained for reconciliation.

This initial release has automated validation and payment-rejection tests. The seller has not performed a live paid transaction. It depends on an independent facilitator and does not guarantee availability. ERC-1271 smart-contract wallet signatures are not supported. New paid requests close on 30 September 2026 at 19:13:57 UTC; saved receipts remain retrievable while the service remains hosted.

Privacy and report usage

CSV contents are processed in memory and are not intentionally stored or sent to the payment facilitator. Stored receipts contain a request hash, diagnostic report, buyer address, authorization nonce and payment status. Reports contain column names and record numbers, not cell values. Hosting infrastructure may retain ordinary request metadata. Do not submit sensitive personal data.

You may use and redistribute reports commercially. Results describe the supplied data and declared rules only. No result guarantees that an import into another system will succeed.