Skip to main content

Send an EDI 850 purchase order via API

Send an EDI 850 purchase order through SignalEDI: JSON payload shape, POST /api/v1/documents/outbound, validation errors, and confirmation via webhooks.

Quick answer

Can I send raw X12 instead of JSON?

Yes — SignalEDI also accepts raw X12 on supported intake paths. JSON is the fastest developer on-ramp because validation returns field-level context.

More common questions

What is an EDI 850?

The 850 Purchase Order is the most common retail EDI document. SignalEDI accepts JSON that maps to your partner's X12 850 implementation guide.

  • See /documents/850 for segment-level reference
  • Partner profiles control mandatory loops and qualifiers

POST request

Pass partnerId, documentTypeCode 850, and a payload with purchase order fields. SignalEDI validates and translates to X12 before routing.

curl -X POST https://api.signaledi.com/v1/documents/outbound \
  -H "Authorization: Bearer $SIGNALEDI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "partnerId": "your-partner-id",
  "documentTypeCode": "850",
  "payload": {
    "purchaseOrderNumber": "PO-1042",
    "shipTo": {
      "id": "DC-01",
      "name": "RetailMart DC 01"
    },
    "lines": [
      {
        "lineNumber": 1,
        "sku": "SKU-100",
        "quantity": 24,
        "unitPrice": 12.5
      }
    ]
  }
}'

Node and Python

Same outbound call in application code — store SIGNALEDI_API_KEY and partnerId in environment variables.

const res = await fetch("https://api.signaledi.com/v1/documents/outbound", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SIGNALEDI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    partnerId: "your-partner-id",
    documentTypeCode: "850",
    payload: {
      purchaseOrderNumber: "PO-1042",
      shipTo: { id: "DC-01", name: "RetailMart DC 01" },
      lines: [{ lineNumber: 1, sku: "SKU-100", quantity: 24, unitPrice: 12.5 }],
    },
  }),
});
const data = await res.json(); // { ok: true, documentId, status: "queued" }

import os
import requests

r = requests.post(
    "https://api.signaledi.com/v1/documents/outbound",
    headers={"Authorization": f"Bearer {os.environ['SIGNALEDI_API_KEY']}"},
    json={
        "partnerId": "your-partner-id",
        "documentTypeCode": "850",
        "payload": {
            "purchaseOrderNumber": "PO-1042",
            "shipTo": {"id": "DC-01", "name": "RetailMart DC 01"},
            "lines": [{"lineNumber": 1, "sku": "SKU-100", "quantity": 24, "unitPrice": 12.5}],
        },
    },
)
print(r.json())

Validation errors

Missing required fields return 400 with fieldErrors. Mapping violations after enqueue surface as document.error webhooks with fixable field paths.

  • Example 400: { "fieldErrors": { "partnerId": "Required" } }
{
  "ok": true,
  "documentId": "doc_01HXYZ…",
  "status": "queued"
}

Common questions

© 2026 SignalEDI Inc. All rights reserved.