{openapi: 3.1.0,info: {title: Sign Customiser API Documentation,description: "",version: 1.0.0},servers: [{url: https://web.signcustomiser.com}],tags: [{name: Custom integrations,description: ""},{name: Customisers,description: ""},{name: Legacy,description: ""},{name: Pricing,description: ""},{name: Webhooks,description: ""}],components: {securitySchemes: {default: {type: http,scheme: bearer,description: You can retrieve your token by visiting your dashboard and clicking <b>Generate API token</b>.}}},security: [{default: []}],paths: {/api/v2/orders: {parameters: [],post: {summary: "Create an order\n\nStep 2 of the custom integration flow. After your server handles the `product:created`\ncallback and returns an `external_id`, send the completed order from your\necommerce platform. Each `products[].external_id` value must match a product ID\nyou previously returned during product creation.",operationId: createAnOrderStep2OfTheCustomIntegrationFlowAfterYourServerHandlesTheproductcreatedCallbackAndReturnsAnexternalIdSendTheCompletedOrderFromYourEcommercePlatformEachproductsexternalIdValueMustMatchAProductIDYouPreviouslyReturnedDuringProductCreation,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {order: {order_id: 1,external_id: order-123456,external_order_number: SC-1001,currency: USD,shipping_line: Standard Shipping,products: [{external_id: product-987654321,quantity: 2,price: 2999}]}},properties: {order: {type: object,properties: {order_id: {type: integer,example: 1},external_id: {type: string,example: order-123456},external_order_number: {type: string,example: SC-1001},currency: {type: string,example: USD},shipping_line: {type: string,example: Standard Shipping},products: {type: array,example: [{external_id: product-987654321,quantity: 2,price: 2999}],items: {type: object,properties: {external_id: {type: string,example: product-987654321},quantity: {type: integer,example: 2},price: {type: integer,example: 2999}}}}}}}}}}}},tags: [Custom integrations],requestBody: {required: true,content: {application/json: {schema: {type: object,properties: {integration_id: {type: integer,description: The Sign Customiser integration ID that owns the order.,example: 42},external_id: {type: string,description: "Your platform's internal order ID.",example: order-123456},external_order_number: {type: string,description: The human-readable order number shown to customers.,example: SC-1001},currency: {type: string,description: The order currency.,example: USD,nullable: true},billing_address: {type: object,description: The billing address for the order.,example: [],properties: {first_name: {type: string,description: The billing first name.,example: John},last_name: {type: string,description: The billing last name.,example: Smith},email: {type: string,description: The billing email address.,example: customer@example.com},phone: {type: string,description: The billing phone number.,example: +1 555-123-4567,nullable: true},address_1: {type: string,description: The first billing address line.,example: 123 Main St},address_2: {type: string,description: The second billing address line.,example: Suite 4,nullable: true},city: {type: string,description: The billing city.,example: Los Angeles},province: {type: string,description: The billing province or state.,example: CA},postcode: {type: string,description: The billing postcode or ZIP code.,example: "90001"},country: {type: string,description: The billing country code.,example: US}}},shipping_address: {type: object,description: The shipping address for the order.,example: [],properties: {first_name: {type: string,description: The shipping first name.,example: John},last_name: {type: string,description: The shipping last name.,example: Smith},address_1: {type: string,description: The first shipping address line.,example: 123 Main St},address_2: {type: string,description: The second shipping address line.,example: Suite 4,nullable: true},city: {type: string,description: The shipping city.,example: Los Angeles},province: {type: string,description: The shipping province or state.,example: CA},postcode: {type: string,description: The shipping postcode or ZIP code.,example: "90001"},country: {type: string,description: The shipping country code.,example: US}}},shipping_line: {type: string,description: The selected shipping method.,example: Standard Shipping},customer: {type: object,description: Customer details for the order.,example: [],properties: {first_name: {type: string,description: "The customer's first name.",example: John,nullable: true},last_name: {type: string,description: "The customer's last name.",example: Smith,nullable: true},email: {type: string,description: "The customer's email address.",example: customer@example.com,nullable: true},phone: {type: string,description: "The customer's phone number.",example: +1 555-123-4567,nullable: true}}},products: {type: array,description: The line items in the order.,example: [{external_id: product-987654321,quantity: 2,price: 2999}],items: {type: string}}},required: [integration_id,external_id,external_order_number,products]}}}}}},/api/v2/customisers: {parameters: [],get: {summary: "List customisers\n\nGet all customisers for the current organisation.",operationId: listCustomisersGetAllCustomisersForTheCurrentOrganisation,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {customisers: [{customiser_id: 1,name: Storefront neon sign,price_type: FIXED_WIDTH,product: NEON,selection_type: SINGLE,active: true,created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}]},properties: {customisers: {type: array,example: [{customiser_id: 1,name: Storefront neon sign,price_type: FIXED_WIDTH,product: NEON,selection_type: SINGLE,active: true,created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}],items: {type: object,properties: {customiser_id: {type: integer,example: 1},name: {type: string,example: Storefront neon sign},price_type: {type: string,example: FIXED_WIDTH},product: {type: string,example: NEON},selection_type: {type: string,example: SINGLE},active: {type: boolean,example: true},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}}}}}}},tags: [Customisers]}},"/api/v2/customisers/{customiser}": {parameters: [{in: path,name: customiser,description: The customiser ID.,example: "1",required: true,schema: {type: integer}}],get: {summary: "Get a customiser\n\nRetrieve a single customiser.",operationId: getACustomiserRetrieveASingleCustomiser,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {customiser: {customiser_id: 1,name: Storefront neon sign,price_type: FIXED_WIDTH,product: NEON,selection_type: SINGLE,active: true,created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}},properties: {customiser: {type: object,properties: {customiser_id: {type: integer,example: 1},name: {type: string,example: Storefront neon sign},price_type: {type: string,example: FIXED_WIDTH},product: {type: string,example: NEON},selection_type: {type: string,example: SINGLE},active: {type: boolean,example: true},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}}}}}},tags: [Customisers]}},/api/orders: {parameters: [],post: {summary: "Create a legacy order\n\nDeprecated. Use `POST /api/v2/orders` for new integrations.",operationId: createALegacyOrderDeprecatedUsePOSTapiv2ordersForNewIntegrations,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {ok: true},properties: {ok: {type: boolean,example: true}}}}}}},tags: [Legacy],requestBody: {required: true,content: {application/json: {schema: {type: object,properties: {order_id: {type: string,description: "Your platform's internal order ID.",example: "123456"},order_number: {type: string,description: The human-readable order number.,example: SC-1001},order_total: {type: number,description: The total order value.,example: 86.34},order_currency: {type: string,description: The order currency.,example: USD},email: {type: string,description: "The customer's email address.",example: customer@example.com,nullable: true},products: {type: array,description: The products in the order.,example: [architecto],items: {type: string}},shipping_address: {type: object,description: The shipping address for the order.,example: [],properties: {name: {type: string,description: The recipient name.,example: John Smith,nullable: true},phone: {type: string,description: The recipient phone number.,example: +1 555-123-4567,nullable: true},address1: {type: string,description: The first shipping address line.,example: 123 Main St,nullable: true},address2: {type: string,description: The second shipping address line.,example: Suite 4,nullable: true},city: {type: string,description: The shipping city.,example: Los Angeles,nullable: true},province: {type: string,description: The shipping province or state.,example: CA,nullable: true},country: {type: string,description: The shipping country code.,example: US,nullable: true},zip: {type: string,description: The shipping postcode or ZIP code.,example: "90001",nullable: true}},nullable: true},shipping_line: {type: string,description: The selected shipping method.,example: Express,nullable: true}},required: [order_id,order_number,products]}}}}}},"/api/customisers/{customiser}/products": {parameters: [{in: path,name: customiser,description: The Sign Customiser ID tied to this product.,example: "42",required: true,schema: {type: string}}],post: {summary: "Sync a legacy product\n\nDeprecated. Use the current custom integration flow for new builds.",operationId: syncALegacyProductDeprecatedUseTheCurrentCustomIntegrationFlowForNewBuilds,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {ok: true},properties: {ok: {type: boolean,example: true}}}}}}},tags: [Legacy],requestBody: {required: true,content: {application/json: {schema: {type: object,properties: {product_id: {type: string,description: "Your platform's product ID.",example: product-987654321},cart: {type: object,description: The legacy cart payload captured from the customiser.,example: [],properties: {}},price_breakdown: {type: object,description: The price breakdown captured during product creation.,example: [],properties: {}},custom_background_path: {type: string,description: The cropped custom background URL.,example: https://cdn.example.com/bg.jpg,nullable: true},custom_background_original_path: {type: string,description: The original custom background URL.,example: https://cdn.example.com/bg-original.jpg,nullable: true},product_type_paths: {type: object,description: Product type image URLs keyed by letter part.,example: [],properties: {},nullable: true},logo_original_path: {type: string,description: The original uploaded logo URL.,example: https://cdn.example.com/logo.png,nullable: true}},required: [product_id,cart,price_breakdown]}}}}}},"/api/v2/customisers/{customiser}/pricing": {parameters: [{in: path,name: customiser,description: The customiser ID.,example: "1",required: true,schema: {type: integer}}],get: {summary: "Get customiser pricing\n\nRetrieve all pricing configuration for a customiser.",operationId: getCustomiserPricingRetrieveAllPricingConfigurationForACustomiser,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {pricing: {customiser_id: 1,pricing_model: FIXED_WIDTH,value_units: {base_price: minor_currency_units,letter_price: minor_currency_units,price_per_letter: minor_currency_units,price_per_cm: currency_units_per_cm,price_per_sq_cm: currency_units_per_sq_cm_or_weight_unit},sizes: [],base_pricing: {mode: included_in_price_lists,rows: []},price_lists: []}},properties: {pricing: {type: object,properties: {customiser_id: {type: integer,example: 1},pricing_model: {type: string,example: FIXED_WIDTH},value_units: {type: object,properties: {base_price: {type: string,example: minor_currency_units},letter_price: {type: string,example: minor_currency_units},price_per_letter: {type: string,example: minor_currency_units},price_per_cm: {type: string,example: currency_units_per_cm},price_per_sq_cm: {type: string,example: currency_units_per_sq_cm_or_weight_unit}}},sizes: {type: array,example: []},base_pricing: {type: object,properties: {mode: {type: string,example: included_in_price_lists},rows: {type: array,example: []}}},price_lists: {type: array,example: []}}}}}}}}},tags: [Pricing]},put: {summary: "Update customiser pricing\n\nReplace all pricing configuration for a customiser.",operationId: updateCustomiserPricingReplaceAllPricingConfigurationForACustomiser,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {pricing: {customiser_id: 1,pricing_model: FIXED_WIDTH,value_units: {base_price: minor_currency_units,letter_price: minor_currency_units,price_per_letter: minor_currency_units,price_per_cm: currency_units_per_cm,price_per_sq_cm: currency_units_per_sq_cm_or_weight_unit},sizes: [],base_pricing: {mode: included_in_price_lists,rows: []},price_lists: []}},properties: {pricing: {type: object,properties: {customiser_id: {type: integer,example: 1},pricing_model: {type: string,example: FIXED_WIDTH},value_units: {type: object,properties: {base_price: {type: string,example: minor_currency_units},letter_price: {type: string,example: minor_currency_units},price_per_letter: {type: string,example: minor_currency_units},price_per_cm: {type: string,example: currency_units_per_cm},price_per_sq_cm: {type: string,example: currency_units_per_sq_cm_or_weight_unit}}},sizes: {type: array,example: []},base_pricing: {type: object,properties: {mode: {type: string,example: included_in_price_lists},rows: {type: array,example: []}}},price_lists: {type: array,example: []}}}}}}}}},tags: [Pricing],requestBody: {required: true,content: {application/json: {schema: {type: object,properties: {pricing: {type: object,description: The replacement pricing configuration.,example: [],properties: {pricing_model: {type: string,description: "",example: FIXED_WIDTH,nullable: true},sizes: {type: array,description: Size records.,example: [[]],items: {type: object,properties: {size_id: {type: integer,description: "",example: 1,nullable: true},client_key: {type: string,description: Must be at least 1 character.,example: small,nullable: true},name: {type: string,description: "",example: Small},description: {type: string,description: "",example: Up to 50cm wide,nullable: true},sort_order: {type: integer,description: "",example: 1,nullable: true},char_limit: {type: integer,description: Must be at least 0.,example: 20,nullable: true},line_limit: {type: integer,description: Must be at least 1. Must not be greater than 6.,example: 3,nullable: true},min_char: {type: integer,description: Must be at least 0.,example: 1,nullable: true},width_cm: {type: number,description: Must be at least 0.,example: 50,nullable: true},height_cm: {type: number,description: Must be at least 0.,example: null,nullable: true},line_height_cm: {type: number,description: Must be at least 0.,example: 12,nullable: true},height_strategy: {type: string,description: "",example: WIDTH,enum: [WIDTH,HEIGHT,DYNAMIC,FIXED],nullable: true},width_multiplier: {type: number,description: "",example: null,nullable: true},length_cm: {type: number,description: Must be at least 0.,example: null,nullable: true}},required: [name]}},base_pricing: {type: object,description: Base pricing settings.,example: [],properties: {mode: {type: string,description: "",example: included_in_price_lists},rows: {type: array,description: "",example: [[]],items: {type: object,properties: {size_id: {type: integer,description: "",example: 1,nullable: true},size_key: {type: string,description: "",example: null,nullable: true},base_price: {type: object,description: Fixed-width base price by line. For material length and frame fit this field is a number.,example: {line_1: 1000,line_2: 1200,line_3: 1400},properties: {},nullable: true},width_limit_cm: {type: number,description: "",example: 100,nullable: true},height_limit_cm: {type: number,description: "",example: 50,nullable: true},length_limit_cm: {type: number,description: "",example: null,nullable: true}}}}},required: [mode,rows]},price_lists: {type: array,description: Price lists.,example: [[]],items: {type: object,properties: {pricing_id: {type: integer,description: "",example: 10,nullable: true},name: {type: string,description: "",example: Standard},letter_pricing_method: {type: string,description: "",example: material_length,enum: [material_length,fixed_letter],nullable: true},shipping: {type: object,description: "",example: null,properties: {calculation: {type: string,description: "",example: physical,enum: [physical,volumetric],nullable: true},volumetric_divisor: {type: number,description: "",example: null,nullable: true},add_weight_to_product: {type: boolean,description: "",example: false,nullable: true}},nullable: true},rows: {type: array,description: "",example: [[]],items: {type: object,properties: {size_id: {type: integer,description: "",example: 1,nullable: true},size_key: {type: string,description: "",example: null,nullable: true},base_price: {type: object,description: Fixed-width base price by line. For material length and frame fit this field is a number.,example: {line_1: 1000,line_2: 1200,line_3: 1400},properties: {},nullable: true},letter_price: {type: object,description: Fixed-width letter price by line.,example: {line_1: 100,line_2: 120,line_3: 140},properties: {},nullable: true},price_per_cm: {type: number,description: Must be at least 0.,example: 0.5,nullable: true},price_per_letter: {type: number,description: Must be at least 0.,example: null,nullable: true},max_price_multiplier: {type: number,description: Must be at least 0.,example: 3,nullable: true},width_limit_cm: {type: number,description: "",example: 100,nullable: true},height_limit_cm: {type: number,description: "",example: 50,nullable: true},length_limit_cm: {type: number,description: "",example: null,nullable: true},price_per_sq_cm: {type: number,description: Must be at least 0.,example: 0.05,nullable: true},fixed_length_cm: {type: number,description: Must be at least 0.,example: null,nullable: true},width_modifier: {type: number,description: "",example: 1,nullable: true},height_modifier: {type: number,description: "",example: 1,nullable: true},length_modifier: {type: number,description: "",example: 1,nullable: true}}}}},required: [name,rows]}}},required: [sizes,base_pricing,price_lists]}},required: [pricing]}}}}}},/api/v2/webhooks: {parameters: [],get: {summary: "List all webhooks\n\nGet a list of all webhooks for the current organisation.",operationId: listAllWebhooksGetAListOfAllWebhooksForTheCurrentOrganisation,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {webhooks: [{webhook_id: 1,topic: product:created,url: https://example.com/webhook,status: active,secret: "abc123...",meta: {},created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}]},properties: {webhooks: {type: array,example: [{webhook_id: 1,topic: product:created,url: https://example.com/webhook,status: active,secret: "abc123...",meta: [],created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}],items: {type: object,properties: {webhook_id: {type: integer,example: 1},topic: {type: string,example: product:created},url: {type: string,example: https://example.com/webhook},status: {type: string,example: active},secret: {type: string,example: "abc123..."},meta: {type: object,properties: {}},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}}}}}}},tags: [Webhooks]},post: {summary: "Create a new webhook\n\nRegister a new webhook endpoint to receive event notifications.",operationId: createANewWebhookRegisterANewWebhookEndpointToReceiveEventNotifications,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {webhook: {webhook_id: 1,topic: product:created,url: https://example.com/webhook,status: active,secret: "abc123...",meta: {},created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}},properties: {webhook: {type: object,properties: {webhook_id: {type: integer,example: 1},topic: {type: string,example: product:created},url: {type: string,example: https://example.com/webhook},status: {type: string,example: active},secret: {type: string,example: "abc123..."},meta: {type: object,properties: {}},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}}}}}},tags: [Webhooks],requestBody: {required: true,content: {application/json: {schema: {type: object,properties: {topic: {type: string,description: "The event topic to subscribe to. Must be one of: product:created, order:created, form:submitted.",example: product:created},url: {type: string,description: The URL where webhook payloads will be sent. Must be a valid URL.,example: https://example.com/webhook},meta: {type: object,description: Optional metadata to store with the webhook.,example: [],properties: {},nullable: true}},required: [topic,url]}}}}}},"/api/v2/webhooks/{webhook_id}": {parameters: [{in: path,name: webhook_id,description: The ID of the webhook.,example: "1",required: true,schema: {type: integer}}],get: {summary: "Get a single webhook\n\nRetrieve details for a specific webhook.",operationId: getASingleWebhookRetrieveDetailsForASpecificWebhook,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {webhook: {webhook_id: 1,topic: product:created,url: https://example.com/webhook,status: active,secret: "abc123...",meta: {},created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}},properties: {webhook: {type: object,properties: {webhook_id: {type: integer,example: 1},topic: {type: string,example: product:created},url: {type: string,example: https://example.com/webhook},status: {type: string,example: active},secret: {type: string,example: "abc123..."},meta: {type: object,properties: {}},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}}}}}},tags: [Webhooks]},put: {summary: "Update a webhook\n\nUpdate an existing webhook's topic, URL, or metadata.",operationId: updateAWebhookUpdateAnExistingWebhooksTopicURLOrMetadata,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {webhook: {webhook_id: 1,topic: order:created,url: https://example.com/webhook-updated,status: active,secret: "abc123...",meta: {},created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-02T00:00:00.000000Z}},properties: {webhook: {type: object,properties: {webhook_id: {type: integer,example: 1},topic: {type: string,example: order:created},url: {type: string,example: https://example.com/webhook-updated},status: {type: string,example: active},secret: {type: string,example: "abc123..."},meta: {type: object,properties: {}},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-02T00:00:00.000000Z}}}}}}}}},tags: [Webhooks],requestBody: {required: true,content: {application/json: {schema: {type: object,properties: {topic: {type: string,description: "The event topic to subscribe to. Must be one of: product:created, order:created, form:submitted.",example: product:created},url: {type: string,description: The URL where webhook payloads will be sent. Must be a valid URL.,example: https://example.com/webhook},meta: {type: object,description: Optional metadata to store with the webhook.,example: [],properties: {},nullable: true}},required: [topic,url]}}}}},delete: {summary: "Delete a webhook\n\nRemove a webhook subscription.",operationId: deleteAWebhookRemoveAWebhookSubscription,description: "",responses: {"200": {description: "",content: {application/json: {schema: {type: object,example: {success: true},properties: {success: {type: boolean,example: true}}}}}}},tags: [Webhooks]}},"/api/v2/webhook-examples/{topic}": {parameters: [{in: path,name: topic,description: "The webhook topic to get examples for. Must be one of: product:created, order:created, form:submitted.",example: product:created,required: true,schema: {type: string}}],get: {summary: "Webhook payload examples\n\nRetrieve example webhook payloads for a specific topic. If data exists for the current organisation, real data will be used. Otherwise, example data is returned.",operationId: webhookPayloadExamplesRetrieveExampleWebhookPayloadsForASpecificTopicIfDataExistsForTheCurrentOrganisationRealDataWillBeUsedOtherwiseExampleDataIsReturned,description: "",responses: {"200": {description: "",content: {application/json: {schema: {oneOf: [{description: Product Created,type: object,example: {product: {product_id: 1,title: "Custom Neon: Hello World",description: "Text: Hello World\nColour: Red\nFont: Comics",description_html: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>",external_id: "1234",external_data: {},price: 10000,compare_price: 15000,customiser_id: 1,logo_upload_id: null,product_image_url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,uploads: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,type: product_image}],created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}},properties: {product: {type: object,properties: {product_id: {type: integer,example: 1},title: {type: string,example: "Custom Neon: Hello World"},description: {type: string,example: "Text: Hello World\nColour: Red\nFont: Comics"},description_html: {type: string,example: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>"},external_id: {type: string,example: "1234"},external_data: {type: object,properties: {}},price: {type: integer,example: 10000},compare_price: {type: integer,example: 15000},customiser_id: {type: integer,example: 1},logo_upload_id: {type: string,example: null},product_image_url: {type: string,example: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg},uploads: {type: array,example: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,type: product_image}],items: {type: object,properties: {url: {type: string,example: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg},type: {type: string,example: product_image}}}},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}},{description: Order Created,type: object,example: {order: {order_id: 1,order_number: 4,external_order_number: SIGN-12345,external_id: "12345",order_total: 120000,app_total: 100000,currency: USD,shipping_line: ground,billing_address: {first_name: John,last_name: Doe,company: Acme,address_1: 123 Fake Street,address_2: Unit 456,city: Brisbane,state: Queensland,postcode: "4000",country: Australia,phone: "123456789",email: john@example.com,created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00},shipping_address: {first_name: John,last_name: Doe,company: Acme,address_1: 123 Fake Street,address_2: Unit 456,city: Brisbane,state: Queensland,postcode: "4000",country: Australia,phone: "123456789",email: john@example.com,created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00},customer: {first_name: John,last_name: Doe,phone: "123456789",email: john@example.com,external_id: "1234",created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00},products: [{product_image_url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,product_id: 1,title: "Custom Neon: Hello World",description: "Text: Hello World\nColour: Red\nFont: Comics",description_html: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>",external_id: "1234",external_data: [],price: 10000,compare_price: 15000,customiser_id: 1,logo_upload_id: null,uploads: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,path: app-images/demonstration_image_1.jpg,type: product_image}],created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00}],created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00}},properties: {order: {type: object,properties: {order_id: {type: integer,example: 1},order_number: {type: integer,example: 4},external_order_number: {type: string,example: SIGN-12345},external_id: {type: string,example: "12345"},order_total: {type: integer,example: 120000},app_total: {type: integer,example: 100000},currency: {type: string,example: USD},shipping_line: {type: string,example: ground},billing_address: {type: object,properties: {first_name: {type: string,example: John},last_name: {type: string,example: Doe},company: {type: string,example: Acme},address_1: {type: string,example: 123 Fake Street},address_2: {type: string,example: Unit 456},city: {type: string,example: Brisbane},state: {type: string,example: Queensland},postcode: {type: string,example: "4000"},country: {type: string,example: Australia},phone: {type: string,example: "123456789"},email: {type: string,example: john@example.com},created_at: {type: string,example: 2025-10-22T00:55:09+00:00},updated_at: {type: string,example: 2025-10-22T00:55:09+00:00}}},shipping_address: {type: object,properties: {first_name: {type: string,example: John},last_name: {type: string,example: Doe},company: {type: string,example: Acme},address_1: {type: string,example: 123 Fake Street},address_2: {type: string,example: Unit 456},city: {type: string,example: Brisbane},state: {type: string,example: Queensland},postcode: {type: string,example: "4000"},country: {type: string,example: Australia},phone: {type: string,example: "123456789"},email: {type: string,example: john@example.com},created_at: {type: string,example: 2025-10-22T00:55:09+00:00},updated_at: {type: string,example: 2025-10-22T00:55:09+00:00}}},customer: {type: object,properties: {first_name: {type: string,example: John},last_name: {type: string,example: Doe},phone: {type: string,example: "123456789"},email: {type: string,example: john@example.com},external_id: {type: string,example: "1234"},created_at: {type: string,example: 2025-10-22T00:55:09+00:00},updated_at: {type: string,example: 2025-10-22T00:55:09+00:00}}},products: {type: array,example: [{product_image_url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,product_id: 1,title: "Custom Neon: Hello World",description: "Text: Hello World\nColour: Red\nFont: Comics",description_html: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>",external_id: "1234",external_data: [],price: 10000,compare_price: 15000,customiser_id: 1,logo_upload_id: null,uploads: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,path: app-images/demonstration_image_1.jpg,type: product_image}],created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00}],items: {type: object,properties: {product_image_url: {type: string,example: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg},product_id: {type: integer,example: 1},title: {type: string,example: "Custom Neon: Hello World"},description: {type: string,example: "Text: Hello World\nColour: Red\nFont: Comics"},description_html: {type: string,example: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>"},external_id: {type: string,example: "1234"},external_data: {type: array,example: []},price: {type: integer,example: 10000},compare_price: {type: integer,example: 15000},customiser_id: {type: integer,example: 1},logo_upload_id: {type: string,example: null},uploads: {type: array,example: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,path: app-images/demonstration_image_1.jpg,type: product_image}],items: {type: object,properties: {url: {type: string,example: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg},path: {type: string,example: app-images/demonstration_image_1.jpg},type: {type: string,example: product_image}}}},created_at: {type: string,example: 2025-10-22T00:55:09+00:00},updated_at: {type: string,example: 2025-10-22T00:55:09+00:00}}}},created_at: {type: string,example: 2025-10-22T00:55:09+00:00},updated_at: {type: string,example: 2025-10-22T00:55:09+00:00}}}}},{description: Form Submitted,type: object,example: {form_submission: {submission_number: 1234,type: custom_form_submission,form: {form_id: 1,customiser_id: 1,label: Custom Design Form,description: Lorem ipsum dolor,email: test@test.com,subject: My Custom Email Subject,created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z},responses: [{field_id: abcd1234,value: test@test.com,name: Your Email,input_type: EMAIL}],created_at: 2024-01-01T00:00:00.000000Z}},properties: {form_submission: {type: object,properties: {submission_number: {type: integer,example: 1234},type: {type: string,example: custom_form_submission},form: {type: object,properties: {form_id: {type: integer,example: 1},customiser_id: {type: integer,example: 1},label: {type: string,example: Custom Design Form},description: {type: string,example: Lorem ipsum dolor},email: {type: string,example: test@test.com},subject: {type: string,example: My Custom Email Subject},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z},updated_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}},responses: {type: array,example: [{field_id: abcd1234,value: test@test.com,name: Your Email,input_type: EMAIL}],items: {type: object,properties: {field_id: {type: string,example: abcd1234},value: {type: string,example: test@test.com},name: {type: string,example: Your Email},input_type: {type: string,example: EMAIL}}}},created_at: {type: string,example: 2024-01-01T00:00:00.000000Z}}}}}]}}}}},tags: [Webhooks]}}},jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema,webhooks: {productCreated: {post: {description: "Use this as the product creation callback for custom integrations. When a customer finishes a design, Sign Customiser POSTs this payload to the create-product URL configured on your custom integration. Verify the signature, create the product in your own platform, then return a 200 JSON response containing the `external_id` you will later send in `POST /api/v2/orders`.",operationId: receiveProductCreated,parameters: [{description: Unix timestamp used when generating the delivery signature.,example: "1704067200",in: header,name: x-webhook-timestamp,required: true,schema: {type: string}},{description: SHA-256 HMAC signature for the product:created payload.,example: YOUR_GENERATED_SIGNATURE,in: header,name: x-webhook-signature,required: true,schema: {type: string}}],requestBody: {content: {application/json: {example: {product: {product_id: 1,title: "Custom Neon: Hello World",description: "Text: Hello World\nColour: Red\nFont: Comics",description_html: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>",external_id: "1234",external_data: {},price: 10000,compare_price: 15000,customiser_id: 1,logo_upload_id: null,product_image_url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,uploads: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,type: product_image}],created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z}},schema: {type: object}}},required: true},responses: {"200": {description: Return your platform product ID,content: {application/json: {example: {external_id: your-product-id-123},schema: {type: object}}}}},summary: Product created}},orderCreated: {post: {description: Delivered when Sign Customiser records a completed order for your organisation.,operationId: receiveOrderCreated,parameters: [{description: Unix timestamp used when generating the delivery signature.,example: "1704067200",in: header,name: x-webhook-timestamp,required: true,schema: {type: string}},{description: SHA-256 HMAC signature for the order:created payload.,example: YOUR_GENERATED_SIGNATURE,in: header,name: x-webhook-signature,required: true,schema: {type: string}}],requestBody: {content: {application/json: {example: {order: {order_id: 1,order_number: 4,external_order_number: SIGN-12345,external_id: "12345",order_total: 120000,app_total: 100000,currency: USD,shipping_line: ground,billing_address: {first_name: John,last_name: Doe,company: Acme,address_1: 123 Fake Street,address_2: Unit 456,city: Brisbane,state: Queensland,postcode: "4000",country: Australia,phone: "123456789",email: john@example.com,created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00},shipping_address: {first_name: John,last_name: Doe,company: Acme,address_1: 123 Fake Street,address_2: Unit 456,city: Brisbane,state: Queensland,postcode: "4000",country: Australia,phone: "123456789",email: john@example.com,created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00},customer: {first_name: John,last_name: Doe,phone: "123456789",email: john@example.com,external_id: "1234",created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00},products: [{product_image_url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,product_id: 1,title: "Custom Neon: Hello World",description: "Text: Hello World\nColour: Red\nFont: Comics",description_html: "<p>Text: Hello World</p>\n<p>Colour: Red</p>\n<p>Font: Comics</p>",external_id: "1234",external_data: [],price: 10000,compare_price: 15000,customiser_id: 1,logo_upload_id: null,uploads: [{url: https://d1no4rdxmwcuog.cloudfront.net/default/app-images/demonstration_image_1.jpg,path: app-images/demonstration_image_1.jpg,type: product_image}],created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00}],created_at: 2025-10-22T00:55:09+00:00,updated_at: 2025-10-22T00:55:09+00:00}},schema: {type: object}}},required: true},responses: {"200": {description: Acknowledge delivery,content: {application/json: {example: {ok: true},schema: {type: object}}}}},summary: Order created}},formSubmitted: {post: {description: Delivered when a customer submits a Sign Customiser form workflow.,operationId: receiveFormSubmitted,parameters: [{description: Unix timestamp used when generating the delivery signature.,example: "1704067200",in: header,name: x-webhook-timestamp,required: true,schema: {type: string}},{description: SHA-256 HMAC signature for the form:submitted payload.,example: YOUR_GENERATED_SIGNATURE,in: header,name: x-webhook-signature,required: true,schema: {type: string}}],requestBody: {content: {application/json: {example: {form_submission: {submission_number: 1234,type: custom_form_submission,form: {form_id: 1,customiser_id: 1,label: Custom Design Form,description: Lorem ipsum dolor,email: test@test.com,subject: My Custom Email Subject,created_at: 2024-01-01T00:00:00.000000Z,updated_at: 2024-01-01T00:00:00.000000Z},responses: [{field_id: abcd1234,value: test@test.com,name: Your Email,input_type: EMAIL}],created_at: 2024-01-01T00:00:00.000000Z}},schema: {type: object}}},required: true},responses: {"200": {description: Acknowledge delivery,content: {application/json: {example: {ok: true},schema: {type: object}}}}},summary: Form submitted}}}}
