Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: FluentEDI Edi API
version: 1.1.0
summary: Deterministic tools for AI agents. No key, no signup, no SDK.
description: 'A public HTTP API of deterministic tools for the work a language model cannot do reliably by reasoning: knowing the current time in any timezone and whether an instant falls inside a window, exact arithmetic, hashing and signature verification, canonicalizing and content-addressing JSON, repairing malformed JSON and pinpointing where it broke, querying and diffing structured data, parsing CSV correctly, converting units, colours and currencies at live ECB rates, testing regular expressions…'
license:
name: Free to use
identifier: MIT
servers:
- url: https://fluentedi.com
tags:
- name: Edi
description: EDI and retail supply chain (X12)
paths:
/v1/edi/parse:
get:
operationId: edi_parse_get
summary: Parse an X12 EDI document (850, 856, 810, 855, 997 and others) into structured…
description: 'Reads a raw ASC X12 interchange and returns it as JSON: delimiters taken from the ISA header, the ISA/GS/ST envelope decoded, every segment split into named elements, and a document-specific summary - purchase order lines for an 850, the HL shipment hierarchy and SSCCs for an 856, invoice totals for an 810. EDI is positional and delimiter-sensitive, and unreadable without a spec table; reading it by inspection produces confident nonsense, which is why this is a tool rather than a prompt.'
tags:
- Edi
parameters:
- name: input
in: query
required: true
description: Raw X12 EDI text, beginning with ISA where available.
schema:
description: Raw X12 EDI text, beginning with ISA where available.
type: string
maxLength: 2000000
- name: include_segments
in: query
required: false
description: Include the flat segment list alongside the summary.
schema:
description: Include the flat segment list alongside the summary.
type: boolean
default: true
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: edi_parse_post
summary: Parse an X12 EDI document (850, 856, 810, 855, 997 and others) into structured…
description: 'Reads a raw ASC X12 interchange and returns it as JSON: delimiters taken from the ISA header, the ISA/GS/ST envelope decoded, every segment split into named elements, and a document-specific summary - purchase order lines for an 850, the HL shipment hierarchy and SSCCs for an 856, invoice totals for an 810. EDI is positional and delimiter-sensitive, and unreadable without a spec table; reading it by inspection produces confident nonsense, which is why this is a tool rather than a prompt.'
tags:
- Edi
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
input:
description: Raw X12 EDI text, beginning with ISA where available.
type: string
maxLength: 2000000
include_segments:
description: Include the flat segment list alongside the summary.
type: boolean
default: true
required:
- input
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/edi/validate:
get:
operationId: edi_validate_get
summary: Check an X12 document's envelope integrity and 856 HL hierarchy for the errors…
description: 'Runs the structural checks a trading partner runs before rejecting a file: control numbers matching between the ISA/IEA, GS/GE and ST/SE header and trailer pairs, declared counts matching actual counts, and - for an 856 - the HL hierarchy. HL faults are the usual cause of ASN rejections and chargebacks: a parent ID naming no existing node, a duplicate HL01, an unknown level code, a missing carton level. Every finding names the segment and states what the value should have been.'
tags:
- Edi
parameters:
- name: input
in: query
required: true
description: Raw X12 EDI text.
schema:
description: Raw X12 EDI text.
type: string
maxLength: 2000000
- name: require_levels
in: query
required: false
description: HL level codes that must be present in an 856, e.g. ["S","O","P","I"] for a pack-level ASN.
schema:
description: HL level codes that must be present in an 856, e.g. ["S","O","P","I"] for a pack-level ASN.
type: array
default: []
items:
type: string
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: edi_validate_post
summary: Check an X12 document's envelope integrity and 856 HL hierarchy for the errors…
description: 'Runs the structural checks a trading partner runs before rejecting a file: control numbers matching between the ISA/IEA, GS/GE and ST/SE header and trailer pairs, declared counts matching actual counts, and - for an 856 - the HL hierarchy. HL faults are the usual cause of ASN rejections and chargebacks: a parent ID naming no existing node, a duplicate HL01, an unknown level code, a missing carton level. Every finding names the segment and states what the value should have been.'
tags:
- Edi
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
input:
description: Raw X12 EDI text.
type: string
maxLength: 2000000
require_levels:
description: HL level codes that must be present in an 856, e.g. ["S","O","P","I"] for a pack-level ASN.
type: array
default: []
items:
type: string
required:
- input
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/edi/build:
get:
operationId: edi_build_get
summary: Generate a valid X12 856 ASN or 850 purchase order from JSON, with correct HL…
description: 'Compiles structured JSON into standards-valid X12. The parts that get documents rejected are exactly the parts a language model cannot hold in its head: the 856 hierarchy needs sequential HL IDs where every level names its parent''s ID, and on a multi-carton, multi-SKU shipment that bookkeeping goes wrong silently. The ISA header is fixed-width — 106 characters exactly, every element space-padded to size — and one character out crashes the receiver''s translator. Segment counts in SE01, CTT01, GE01 and IEA01 must agree with what was actually emitted. All of that is computed here rather than written by hand.'
tags:
- Edi
parameters:
- name: document
in: query
required: false
description: Transaction set to build.
schema:
description: Transaction set to build.
type: string
enum:
- '856'
- '850'
default: '856'
- name: data
in: query
required: true
description: 'Document content. For 856: {shipment_id, ship_date, orders:[{po_number, packs:[{sscc, items:[{upc, quantity, unit}]}]}], parties:[{role,name,id}]}. For 850: {po_number, order_date, lines:[{quantity, unit, unit_price, upc, description}], parties:[...]}.'
schema:
description: 'Document content. For 856: {shipment_id, ship_date, orders:[{po_number, packs:[{sscc, items:[{upc, quantity, unit}]}]}], parties:[{role,name,id}]}. For 850: {po_number, order_date, lines:[{quantity, unit, unit_price, upc, description}], parties:[...]}.'
type: object
- name: sender_id
in: query
required: false
description: ISA06 sender identifier.
schema:
description: ISA06 sender identifier.
type: string
default: SENDER
maxLength: 15
- name: receiver_id
in: query
required: false
description: ISA08 receiver identifier.
schema:
description: ISA08 receiver identifier.
type: string
default: RECEIVER
maxLength: 15
- name: sender_qualifier
in: query
required: false
description: ISA05 qualifier, e.g. ZZ, 01 (DUNS), 12 (phone).
schema:
description: ISA05 qualifier, e.g. ZZ, 01 (DUNS), 12 (phone).
type: string
default: ZZ
maxLength: 2
- name: receiver_qualifier
in: query
required: false
description: ISA07 qualifier.
schema:
description: ISA07 qualifier.
type: string
default: ZZ
maxLength: 2
- name: control_number
in: query
required: false
description: Interchange control number (ISA13). Also seeds GS06 and ST02.
schema:
description: Interchange control number (ISA13). Also seeds GS06 and ST02.
type: integer
default: 1
minimum: 1
- name: test_indicator
in: query
required: false
description: Mark the interchange as test (ISA15 = T) rather than production (P).
schema:
description: Mark the interchange as test (ISA15 = T) rather than production (P).
type: boolean
default: true
- name: timestamp
in: query
required: false
description: ISO instant for the envelope date/time. Defaults to now.
schema:
description: ISO instant for the envelope date/time. Defaults to now.
type: string
default: ''
- name: include_envelope
in: query
required: false
description: Wrap the transaction set in ISA/GS ... GE/IEA.
schema:
description: Wrap the transaction set in ISA/GS ... GE/IEA.
type: boolean
default: true
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: edi_build_post
summary: Generate a valid X12 856 ASN or 850 purchase order from JSON, with correct HL…
description: 'Compiles structured JSON into standards-valid X12. The parts that get documents rejected are exactly the parts a language model cannot hold in its head: the 856 hierarchy needs sequential HL IDs where every level names its parent''s ID, and on a multi-carton, multi-SKU shipment that bookkeeping goes wrong silently. The ISA header is fixed-width — 106 characters exactly, every element space-padded to size — and one character out crashes the receiver''s translator. Segment counts in SE01, CTT01, GE01 and IEA01 must agree with what was actually emitted. All of that is computed here rather than written by hand.'
tags:
- Edi
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
document:
description: Transaction set to build.
type: string
enum:
- '856'
- '850'
default: '856'
data:
description: 'Document content. For 856: {shipment_id, ship_date, orders:[{po_number, packs:[{sscc, items:[{upc, quantity, unit}]}]}], parties:[{role,name,id}]}. For 850: {po_number, order_date, lines:[{quantity, unit, unit_price, upc, description}], parties:[...]}.'
type: object
sender_id:
description: ISA06 sender identifier.
type: string
default: SENDER
maxLength: 15
receiver_id:
description: ISA08 receiver identifier.
type: string
default: RECEIVER
maxLength: 15
sender_qualifier:
description: ISA05 qualifier, e.g. ZZ, 01 (DUNS), 12 (phone).
type: string
default: ZZ
maxLength: 2
receiver_qualifier:
description: ISA07 qualifier.
type: string
default: ZZ
maxLength: 2
control_number:
description: Interchange control number (ISA13). Also seeds GS06 and ST02.
type: integer
default: 1
minimum: 1
test_indicator:
description: Mark the interchange as test (ISA15 = T) rather than production (P).
type: boolean
default: true
timestamp:
description: ISO instant for the envelope date/time. Defaults to now.
type: string
default: ''
include_envelope:
description: Wrap the transaction set in ISA/GS ... GE/IEA.
type: boolean
default: true
required:
- data
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/edi/acknowledge:
get:
operationId: edi_acknowledge_get
summary: Read a 997 or 999 acknowledgment and say which documents were accepted, which…
description: 'Decodes a Functional Acknowledgment into an answer rather than a code. A 997 reports its verdict as bare letters and numbers — AK5 of R with error 5, AK3 of 7, AK4 element 2 code 7 — which say nothing without a code table. This resolves every one into plain language, points at the failing segment position and element, and, if you supply the control numbers you sent, reconciles them so you can see what was acknowledged, what was rejected, and what never came back at all. Silence is the failure mode that costs money: an unacknowledged document is not a delivered one.'
tags:
- Edi
parameters:
- name: input
in: query
required: true
description: Raw 997 or 999 acknowledgment text.
schema:
description: Raw 997 or 999 acknowledgment text.
type: string
maxLength: 500000
- name: sent
in: query
required: false
description: Transaction set control numbers you sent (ST02 values), to reconcile against. e.g. ["0001","0002"].
schema:
description: Transaction set control numbers you sent (ST02 values), to reconcile against. e.g. ["0001","0002"].
type: array
default: []
items:
type: string
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: edi_acknowledge_post
summary: Read a 997 or 999 acknowledgment and say which documents were accepted, which…
description: 'Decodes a Functional Acknowledgment into an answer rather than a code. A 997 reports its verdict as bare letters and numbers — AK5 of R with error 5, AK3 of 7, AK4 element 2 code 7 — which say nothing without a code table. This resolves every one into plain language, points at the failing segment position and element, and, if you supply the control numbers you sent, reconciles them so you can see what was acknowledged, what was rejected, and what never came back at all. Silence is the failure mode that costs money: an unacknowledged document is not a delivered one.'
tags:
- Edi
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
input:
description: Raw 997 or 999 acknowledgment text.
type: string
maxLength: 500000
sent:
description: Transaction set control numbers you sent (ST02 values), to reconcile against. e.g. ["0001","0002"].
type: array
default: []
items:
type: string
required:
- input
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/gs1/checkdigit:
get:
operationId: gs1_checkdigit_get
summary: Calculate or validate a GS1 mod-10 check digit for SSCC-18, GTIN-14/13/12/8 and…
description: 'Computes the GS1 mod-10 check digit, or validates a complete code and says what the digit should have been. Also catches the failure behind most real-world barcode and ASN mismatches: a spreadsheet dropping leading zeros or rendering the identifier in scientific notation, silently changing it. Pass a full code to validate, or the payload without its final digit to compute one.'
tags:
- Edi
parameters:
- name: code
in: query
required: true
description: The code, with or without its check digit. Spaces and hyphens are ignored.
schema:
description: The code, with or without its check digit. Spaces and hyphens are ignored.
type: string
maxLength: 64
examples:
- 00614141123456789
- name: length
in: query
required: false
description: Expected total length (8, 12, 13, 14 or 18). Inferred when omitted.
schema:
description: Expected total length (8, 12, 13, 14 or 18). Inferred when omitted.
type: integer
default: 0
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: gs1_checkdigit_post
summary: Calculate or validate a GS1 mod-10 check digit for SSCC-18, GTIN-14/13/12/8 and…
description: 'Computes the GS1 mod-10 check digit, or validates a complete code and says what the digit should have been. Also catches the failure behind most real-world barcode and ASN mismatches: a spreadsheet dropping leading zeros or rendering the identifier in scientific notation, silently changing it. Pass a full code to validate, or the payload without its final digit to compute one.'
tags:
- Edi
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
code:
description: The code, with or without its check digit. Spaces and hyphens are ignored.
type: string
maxLength: 64
examples:
- 00614141123456789
length:
description: Expected total length (8, 12, 13, 14 or 18). Inferred when omitted.
type: integer
default: 0
required:
- code
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/id/validate:
get:
operationId: id_validate_get
summary: 'Validate an identifier''s checksum: IBAN, card, ISBN, ISSN, ISIN, CUSIP, LEI…'
description: Runs the real check algorithm for twenty-odd identifier schemes and says both whether it passes and what passing does not prove — which is usually the more useful half. A valid IBAN checksum does not mean the account exists; a lapsed LEI passes forever; one in ten random digit strings satisfies Luhn. Schemes with no checksum at all (BIC, IFSC, DOI, and India's PAN, whose algorithm has never been published) are reported as structure-only rather than dressed up as verified. Pass `scheme` or let it infer from shape.
tags:
- Edi
parameters:
- name: value
in: query
required: true
description: The identifier to check. Spaces, hyphens and dots are ignored.
schema:
description: The identifier to check. Spaces, hyphens and dots are ignored.
type: string
maxLength: 200
examples:
- GB82WEST12345698765432
- name: scheme
in: query
required: false
description: Which scheme to apply. "auto" infers it from the shape.
schema:
description: Which scheme to apply. "auto" infers it from the shape.
type: string
enum:
- auto
- iban
- card
- luhn
- isbn
- isbn10
- isbn13
- issn
- isin
- cusip
- lei
- aba
- imei
- orcid
- isni
- ean8
- ean13
- gtin
- upce
- vin
- gstin
- pan
- ifsc
- bic
- doi
- verhoeff
default: auto
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: id_validate_post
summary: 'Validate an identifier''s checksum: IBAN, card, ISBN, ISSN, ISIN, CUSIP, LEI…'
description: Runs the real check algorithm for twenty-odd identifier schemes and says both whether it passes and what passing does not prove — which is usually the more useful half. A valid IBAN checksum does not mean the account exists; a lapsed LEI passes forever; one in ten random digit strings satisfies Luhn. Schemes with no checksum at all (BIC, IFSC, DOI, and India's PAN, whose algorithm has never been published) are reported as structure-only rather than dressed up as verified. Pass `scheme` or let it infer from shape.
tags:
- Edi
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
value:
description: The identifier to check. Spaces, hyphens and dots are ignored.
type: string
maxLength: 200
examples:
- GB82WEST12345698765432
scheme:
description: Which scheme to apply. "auto" infers it from the shape.
type: string
enum:
- auto
- iban
- card
- luhn
- isbn
- isbn10
- isbn13
- issn
- isin
- cusip
- lei
- aba
- imei
- orcid
- isni
- ean8
- ean13
- gtin
- upce
- vin
- gstin
- pan
- ifsc
- bic
- doi
- verhoeff
default: auto
required:
- value
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.