---
title: "Render branded business-form PDFs (invoice, purchase order, packing slip) for all marketplace apps."
method: POST
path: "/v1/forms"
tags: ["Forms"]
---

# Render branded business-form PDFs (invoice, purchase order, packing slip) for all marketplace apps.

`POST /v1/forms`

## Request

- Base URL: `https://signaledi.com/api`
- URL: `https://signaledi.com/api/v1/forms`
- Auth: HTTP bearer

Platform-wide form renderer for GitHub, Vercel, AWS Marketplace, RapidAPI, and generic API clients with a `platform`-scoped key. Gated by `DOCUMENT_FORMS_ENABLED` (falls back to the shipping-labels gate; 404 when off). Optional `brand` applies letterhead to the form header/footer only — never to GS1 label zones. Does not send EDI. Shopify Admin uses the same engine via `/api/shopify/embedded/forms`.

## Request body

- FormsRequest
  - `kind` 'invoice' | 'purchase_order' | 'packing_slip', required: Business form type to render.
  - `brand` object: Optional BrandProfile letterhead (forms only). Never applied to GS1 label zones.
    - `name` string
    - `logoUrl` string: https:// or data:image/png|jpeg only (SVG rejected).
    - `addressBlock` object
      - `companyName` string, required
      - `lines` string[]
      - `phone` string
      - `email` string
      - `web` string
    - `remitTo` object
    - `footerText` string
    - `accentColor` string: Hex color for rules/headings (#1d4ed8).
  - `document` object, required
    - `documentNumber` string, required
    - `documentDate` string
    - `poNumber` string
    - `reference` string
    - `currency` string
    - `notes` string
    - `billTo` object
      - `company` string
      - `lines` string[]
    - `shipTo` object
      - `company` string
      - `lines` string[]
    - `shipFrom` object
      - `company` string
      - `lines` string[]
    - `lines` object[], required
      - `sku` string
      - `description` string
      - `quantity` number
      - `uom` string
      - `unitPrice` number
      - `amount` number
    - `cartons` object[]: Optional packing-slip carton breakdown.
      - `sscc` string
      - `lines` object[]

## Response `200`

Form PDF bytes.

## Other responses

- `400`: Request body failed validation (`code` e.g. VALIDATION_ERROR, NO_WORKSPACE, BATCH_TOO_LARGE).
- `401`: Missing or invalid API key (`code` AUTH_UNAUTHORIZED).
- `403`: API key lacks the required `platform` scope (`code` PLATFORM_SCOPE_REQUIRED), its lane is invalid (API_KEY_ENVIRONMENT_INVALID), the workspace is not entitled to the platform API (PLATFORM_NOT_ENTITLED), or a supplied `workspaceId` does not match the authenticated workspace (FORBIDDEN).
- `404`: Resource not found, or the /v1 platform is disabled (`code` NOT_FOUND / PARTNER_NOT_FOUND / WORKSPACE_NOT_FOUND).
- `429`: Rate limit exceeded (`code` RATE_LIMITED).
- `500`: Unexpected server error (`code` e.g. PARSE_FAILED, VALIDATE_FAILED, OUTBOUND_FAILED, INBOUND_FAILED, BATCH_FAILED, TRANSACTIONS_FAILED, DOCUMENT_RECEIPT_FAILED, DOCUMENT_PAYLOAD_FAILED). Sanitized bodies carry an opaque `correlationId` to quote to support; internal error text is never echoed.

---

[API](https://skmtc.dev/signaledi/apis/signaledi-developer-api.md) · [All operations](https://skmtc.dev/signaledi/apis/signaledi-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/signaledi/apis/signaledi-developer-api/revisions/9bc596644a10?raw)
