Products
create_integration_product
writeCreate integration product
Record a product bought through a custom integration against the customiser that designed it, so Sign Customiser can hand it to production.
Overview
Records a product from an enabled custom integration against a customiser. Call get_store first. Select an integration where accepts_writes is true. Use this tool only for a product that already exists in that integration. Sign Customiser does not call the integration to verify it. Its price, dimensions, artwork references and captured selections become available to the manufacturer email and export paths. This is an inbound synchronisation: it never downloads the artwork, calls the integration back or emits the product-created webhook. There is no delete-product tool on this connector, so the call needs confirm: true and an idempotency_key that makes a retry replay the original product. It requires the products:write scope.
Permission
Requires theproducts:writepermission. A connection without it answersinsufficient_scopenaming the permission to approve.
Annotations
Prerequisites
- The customiser id, from list_customisers.
- An integration_id for an enabled custom integration. Call get_store and select one where accepts_writes is true.
- The product identifier the integration uses, its title, its price in minor units and the store currency.
- A merchant has connected this store and approved the products:write scope.
Side effects
- Creates one product record against the customiser, with its captured selections and artwork references.
- Uses product-write budget based on the validated payload size.
- Claims the idempotency_key for at least 24 hours.
Arguments
The customiser the product was designed with, from list_customisers.
An enabled custom integration from get_store where accepts_writes is true. An unknown, disabled or non-custom integration is a validation failure on this field.
The product identifier the integration uses. It must be unique across this Store. A repeat fails with store_product_id_conflict and does not create a second product.
The product title, as the shopper bought it.
The product description, if the integration has one.
The unit price in integer minor units of currency, never a decimal.
The was-price in minor units, which must be at least price_amount.
The ISO 4217 code in upper case. It must equal the store own currency.
The finished width in centimetres.
The finished height in centimetres.
The finished length in centimetres.
The selections captured with the design, at most 100 rows. These are what reach the manufacturer email.
A lower snake_case identifier, unique within this product. The size_cm and size_in keys cannot be combined with width_cm, height_cm or length_cm.
What the merchant sees for this row.
What the shopper chose.
References to the production artwork the integration already hosts. Every member is optional and every URL is stored as given.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
A credential-free HTTPS URL the integration already hosts. Sign Customiser stores the reference and never downloads it.
Must be true to apply the change, because this connector has no tool that deletes a product again. Without it the call returns a confirmation_required error and changes nothing. A dry run does not need it.
A client-generated key unique to this logical write, such as a UUID. Required: repeating the call with the same key and the same arguments replays the original result instead of writing twice, and the same key with different arguments is an idempotency_key_conflict. A dry run claims no key.
Result
The created product record, and whether the call replayed an earlier one. There is no dry run: the route has no validate twin.
The created product, with the fields get_integration_product publishes.
True when this call replayed an earlier write carrying the same idempotency_key rather than recording a second product. Read from the response Idempotency-Replay header, not from the v3 body.
The merchant-admin page for the owning customiser.
Error cases
price_amount or compare_at_amount is outside the range the store currency can carry.
Send confirm: true. There is no tool on this connector that deletes a product again.
currency must be the store own currency; the problem names it.
That key was used with different arguments. Re-send the original arguments or issue a new key.
The created product was later deleted. Issue a new key and re-check the resource before writing again.
The connection was approved without products:write.
Send idempotency_key. It is required for this write.
The store product-write budget is exhausted; wait retry_after seconds.
No customiser with that id exists in this store.
This Store already has a product with this store_product_id. Retry the original request with its original idempotency_key, or use a new store_product_id.
The integration_id is unknown, disabled, or does not accept recorded products or orders. Correct the field at the error pointer. Other invalid request fields can also produce this code.
Record a neon sign bought through an integration
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_integration_product",
"arguments": {
"customiser_id": 42,
"integration_id": 3,
"store_product_id": "ext-90210",
"title": "Custom neon sign — \"Open\"",
"price_amount": 24900,
"currency": "GBP",
"width_cm": 60,
"height_cm": 20,
"customisations": [
{
"key": "text",
"label": "Text",
"value": "Open"
}
],
"confirm": true,
"idempotency_key": "f6071829-3b4c-4e2f-9a3b-4c5d6e7f8091"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
"store": {
"id": 12,
"name": "Demo Signs"
},
"product": {
"id": 5001,
"customiser_id": 42,
"title": "Custom neon sign — \"Open\"",
"description": null,
"price_amount": 24900,
"compare_at_amount": null,
"currency": "GBP",
"image_url": null,
"width_cm": 60,
"height_cm": 20,
"length_cm": null,
"created_at": "2026-08-24T00:00:00Z",
"updated_at": "2026-08-24T00:00:00Z"
},
"idempotent_replay": false
}
}
}Without confirmation nothing is recorded (error)
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_integration_product",
"arguments": {
"customiser_id": 42,
"integration_id": 3,
"store_product_id": "ext-90210",
"title": "Custom neon sign",
"price_amount": 24900,
"currency": "GBP",
"idempotency_key": "f6071829-3b4c-4e2f-9a3b-4c5d6e7f8091"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"isError": true,
"structuredContent": {
"error": {
"code": "confirmation_required",
"title": "Confirmation required",
"detail": "Recording product ext-90210 against customiser 42 cannot be undone through this connector: there is no delete-product tool.",
"recovery": "This operation changes something consequential. Send confirm: true once the merchant has agreed to it.",
"parameter": "confirm",
"allowed_values": [
"true"
]
}
}
}
}