{
  "generated_from": "factory_api_v1.openapi3.json",
  "services": [
    {
      "slug": "catalogue",
      "file": "catalogue.openapi3.json",
      "tag": "CatalogueService",
      "description": "Your product catalogue — the products, kits, and flashings you sell.",
      "operations": 6,
      "schemas": 21,
      "bytes": 62518,
      "approx_tokens": 18388,
      "sha256": "0180fdb63438997c95f077b4c2f4ec0d09bb94b8c7a749919b66be44f7a2ff48",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "company",
      "file": "company.openapi3.json",
      "tag": "CompanyService",
      "description": "Your company's settings and custom-field definitions — identity, currency and locale, the measurement system quantities are expressed in, tax context, and the custom-field keys that write endpoints accept.",
      "operations": 2,
      "schemas": 13,
      "bytes": 33931,
      "approx_tokens": 9980,
      "sha256": "11f44aa2d741cef5218b65e2c3fce4abdc2570e8659de83ea07a43c12feb1448",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "customer",
      "file": "customer.openapi3.json",
      "tag": "CustomerService",
      "description": "Your company's customers — the businesses you quote and sell to.",
      "operations": 3,
      "schemas": 11,
      "bytes": 40022,
      "approx_tokens": 11771,
      "sha256": "262be27b2161d5a52793438d9c5763f0129c8775d4ca5e7fde362cdaba35eb80",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "inventory",
      "file": "inventory.openapi3.json",
      "tag": "InventoryService",
      "description": "Read and update stock levels for your catalogue products. Stock is tracked per product variant row, optionally split by colour. Each entry carries on-hand, promised, on-the-way, and available quantities for that one variant — never a cumulative product-level total — plus the variant's identifying attributes (thickness and name/value pairs), so entries are self-describing. An entry's productRowId is the same id the catalogue product's rows carry.",
      "operations": 3,
      "schemas": 9,
      "bytes": 35553,
      "approx_tokens": 10457,
      "sha256": "79ba8c6d4ec43f05f9d0da05f36b3c2eeda8d5b99a3093fd00803cf671459c1d",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "label",
      "file": "label.openapi3.json",
      "tag": "LabelService",
      "description": "The labels your company uses to tag orders.",
      "operations": 1,
      "schemas": 4,
      "bytes": 18324,
      "approx_tokens": 5389,
      "sha256": "db29414323d27126ece2f223ec03ceff613009b6ea028f82000521e196f35b22",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "order-status",
      "file": "order-status.openapi3.json",
      "tag": "OrderStatusService",
      "description": "The workflow statuses your company's orders move through.",
      "operations": 1,
      "schemas": 4,
      "bytes": 18571,
      "approx_tokens": 5462,
      "sha256": "a784213915a447fbf4f901383a69380d9bc87acfe7c75cf1c1cd28e49458dbbd",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "order",
      "file": "order.openapi3.json",
      "tag": "OrderService",
      "description": "Create sales orders, read and list them, upload flashing-drawing SVGs, and work with each order's conversation (messages and file attachments) — the order surface of the API. An order is created either as a draft or submitted immediately; after creation this API reads orders but does not update them — workflow status, fulfilment, and payment changes happen in the Factory app and are reflected on subsequent reads. Quotes live on QuoteService.",
      "operations": 15,
      "schemas": 67,
      "bytes": 223570,
      "approx_tokens": 65756,
      "sha256": "b9ced69d170814605ac74c7aa181cb0f59bdac55d013207d0ea1a28d96df6af3",
      "updated_at": "2026-09-17T03:33:39Z"
    },
    {
      "slug": "quote",
      "file": "quote.openapi3.json",
      "tag": "QuoteService",
      "description": "Create quotes, read them, add, update, and remove their line items, upload flashing-drawing SVGs, and work with each quote's conversation (messages and file attachments) — the only surface for creating and reading quotes; confirmed orders live on OrderService. A quote's line items can be added, updated, and removed individually after creation; the server recomputes totals on every change. A quote created as a draft is finalised and sent from the Factory app. The quote itself is not voided or deleted through this API, and turning an accepted quote into a confirmed order happens in the Factory app.",
      "operations": 15,
      "schemas": 65,
      "bytes": 210203,
      "approx_tokens": 61824,
      "sha256": "224d3074107e1e81f0abd156a637a130a060a35ad3f3ed3b0a147fd068ebf4d4",
      "updated_at": "2026-09-17T03:33:39Z"
    },
    {
      "slug": "search",
      "file": "search.openapi3.json",
      "tag": "SearchService",
      "description": "Preview: free-text search across your catalogue. This service is in\npreview — published for early use, not yet covered by the compatibility\nguarantees in the API conventions (see Versioning); it may change or be\nwithdrawn with 30 days' notice.",
      "operations": 1,
      "schemas": 5,
      "bytes": 20614,
      "approx_tokens": 6063,
      "sha256": "4f8f0beb8e743d1d8126315ebafde7e14460eb2987d4d9fbcecf5fce1dd365e6",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "supplier",
      "file": "supplier.openapi3.json",
      "tag": "SupplierService",
      "description": "List your company's suppliers. Suppliers are managed in the Factory purchasing UI — this read-only surface lets API consumers discover supplier ids for use as inventory list filters.",
      "operations": 2,
      "schemas": 5,
      "bytes": 22708,
      "approx_tokens": 6679,
      "sha256": "8fc0b42e0bced13fb34ef15d6c6726c5334a45379b457f82bc9b0397962930d4",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "user",
      "file": "user.openapi3.json",
      "tag": "UserService",
      "description": "The people in your company, for assigning work to.",
      "operations": 2,
      "schemas": 6,
      "bytes": 25134,
      "approx_tokens": 7392,
      "sha256": "44204eedb4d152886c1f8185cef3f88a07da0e584b652b6443c9926b024f69d1",
      "updated_at": "2026-09-16T23:44:13Z"
    },
    {
      "slug": "webhook",
      "file": "webhook.openapi3.json",
      "tag": "WebhookService",
      "description": "Register HTTPS endpoints to be notified when orders and quotes change, and inspect what was delivered. Every endpoint here requires the administrator role — tokens bound to any other user role are refused with 403. Deliveries are thin events: a signed JSON body `{id, type, occurred_at, data}` (snake_case keys) where `data` names the resource by id — `data.order.id` or `data.quote.id` (an order for `quote.converted_to_order`) — plus `data.previous` on transitions (`status_id`, `quote`, or `archived`). The body never carries the resource itself: read current state with GetOrder / GetQuote by that id (`order.archived` needs `includeArchived`). Every POST carries `Content-Type: application/json`, `X-Factory-Event` (the type), `X-Factory-Signature` (`t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\">`, keyed by the full `whsec_…` secret CreateWebhook returns once), `Date` (the same instant as `t`, as an HTTP-date) and `User-Agent: Factory-API/v1`. Delivery is at-least-once and never lost — deduplicate on `id`; answer 2xx within 10 seconds and do the work asynchronously; failed deliveries retry over ~10.6 hours, then exhaust.",
      "operations": 8,
      "schemas": 17,
      "bytes": 60507,
      "approx_tokens": 17796,
      "sha256": "adda08b3058639db2f2a50f2d623e6ad796cfe35f3dd5703dae12f9aabda6cf3",
      "updated_at": "2026-09-16T23:44:13Z"
    }
  ]
}
