WinFactor Docs

Submissions

List, read, and update customer submissions

GET /submissions

Query params: status (new|quoted|closed), templateId, createdAfter / createdBefore (ms), limit, cursor.

curl -H "Authorization: Bearer $WF_API_KEY" \
  "https://app.winfactor.app/api/v1/submissions?status=new&limit=20"
{
  "data": [
    {
      "id": "k57…", "templateId": "k12…", "status": "new",
      "customer": { "name": "Jane Doe", "email": "[email protected]", "phone": null,
                    "companyName": null, "address": null, "postalCode": null,
                    "city": null, "country": null },
      "dimensions": { "width": 2400, "height": 1800 },
      "unitAmount": 1, "locale": "en", "externalRef": null,
      "createdAt": 1781100202000
    }
  ],
  "nextCursor": null
}

GET /submissions/{id}

Everything from the list shape, plus:

  • configuration — the canonical pricing configuration (raw IDs)
  • resolvedConfiguration — the human-readable version: componentSelections[] (name, type, width, height, options with codes/names/groups), selectedOptions[], insideColor/outsideColor names, notes, selectedSection
  • externalPricing — your frozen live-pricing adjustment (configHash, lineItems, subtotal, receivedAt) or null
  • latestQuoteId

PATCH /submissions/{id}

Body (at least one field): status (new|quoted|closed), externalRef (≤200 chars — your CRM linkage).

POST /submissions/{id}/quotes

Create a draft quote for the submission. Body (all optional): taxRate, validityDays, currency, reference, notes, lineItems[].

  • Without lineItems: WinFactor calculates the breakdown, preferring frozen external pricing when its hash matches.
  • With lineItems: your array IS the quote — one call, no intermediate wrong-priced draft, and the quote.created event carries your items.

Returns 201 { "quoteId": "k61…" }. Defaults for omitted terms come from the organization's quote settings.

On this page