Choose the materials to print a quote in
Every extruder slot your file prints with needs a catalog material, and the print farm loads each one into its slot. When the quote is ready, suggested_materials lists those slots with the nearest catalog material to the colour and filament type in your file. Then either:
- Use the suggestions: order with
use_suggested_materials: true. Checkmatchfirst:approximatemeans the catalog has nothing close to that colour (or the file gave none). - Choose your own: list the catalog (
color_hexandfilament_typehelp you match) and sendmaterialsas[{ "slot": 2, "material": "mat_..." }], one entry for every slot insuggested_materials, no more and no fewer. A plain list of ids also works when the slots are 1, 2, 3... with no gaps.
This recipe orders in wallet mode; checkout mode takes the same materials and use_suggested_materials per line.
What you need
- quote_idstringRequired
The quote to print (
qte_...), fromquote_model_file. - use_suggested_materialsbooleanRequired
True to print in the suggested materials; false to send your own in
materials. - materialsarray of object
Only when
use_suggested_materialsis false:{ "slot": 1, "material": "mat_..." }for every slot listed in the quotesuggested_materials. - quantityintegerRequired
How many units to print.
- shipping_addressobjectRequired
Where to ship:
line1,city,country_code(ISO alpha-2) and optionallyline2,state,postal_code. - customerobjectRequired
The recipient:
name,emailand optionallyphone. - idempotency_keystringRequired
A unique string for this attempt, for example a UUID. Send the same value when you retry, so the write happens once.
Step 1: Get a quote
Read the quote. Once it is ready, suggested_materials has one entry per slot the file prints with: the slot, the file_color and file_filament_type your file gives it, the suggested material and how close the match is. It is null on quotes created before suggestions existed: send materials for those.
{
"path id": "$inputs.quote_id"
}Succeeds when:
$statusCode == 200$response.body#/status == 'ready'
Otherwise:
still_processing: retry after 5 seconds, at most 120 times, when$response.body#/status == 'processing'.quote_failed: stop the workflow when$response.body#/status == 'failed'.
Keeps for the next steps:
suggested_materials:$response.body#/suggested_materials
Step 2: Order prints of your quotes
Order in the suggested materials. suggestions_unavailable (422) means the quote has none: order with your own materials instead.
{
"header Idempotency-Key": "$inputs.idempotency_key"
}{
"mode": "wallet",
"items": [
{
"quote": "$inputs.quote_id",
"quantity": "$inputs.quantity",
"use_suggested_materials": true
}
],
"shipping_address": "$inputs.shipping_address",
"customer": "$inputs.customer"
}Succeeds when:
$statusCode == 201
Otherwise:
retry_server_error: retry after 5 seconds, at most 3 times, when$statusCode >= 500.payment_failed: stop the workflow when$statusCode == 402.material_slots_mismatch_or_not_orderable: stop the workflow when$statusCode == 422.
Keeps for the next steps:
order_id:$response.body#/idnumber:$response.body#/numbermaterial_slots:$response.body#/items/0/material_slotstotal:$response.body#/charges/total
Step 3: List catalog materials
List the catalog to pick a material per slot. Each material has color_hex and filament_type to compare with the file_color and file_filament_type of each slot.
Succeeds when:
$statusCode == 200
Keeps for the next steps:
materials:$response.body#/data
Step 4: Order prints of your quotes
Order with one material per slot. material_slots_mismatch (422) means the slots sent are not the ones the file prints with: details.expected_slots lists them. material_not_allowed (422) names a material that is not in the catalog.
{
"header Idempotency-Key": "$inputs.idempotency_key"
}{
"mode": "wallet",
"items": [
{
"quote": "$inputs.quote_id",
"quantity": "$inputs.quantity",
"materials": "$inputs.materials"
}
],
"shipping_address": "$inputs.shipping_address",
"customer": "$inputs.customer"
}Succeeds when:
$statusCode == 201
Otherwise:
retry_server_error: retry after 5 seconds, at most 3 times, when$statusCode >= 500.payment_failed: stop the workflow when$statusCode == 402.material_slots_mismatch_or_not_orderable: stop the workflow when$statusCode == 422.
Keeps for the next steps:
order_id:$response.body#/idnumber:$response.body#/numbermaterial_slots:$response.body#/items/0/material_slotstotal:$response.body#/charges/total
As a workflow file
Values starting with $ are filled in as you go: $inputs.x is something you provide, $steps.s.outputs.o is a value an earlier step returned, and $response.body#/path a field of this response.
This recipe is the workflow set_up_order_materials of arazzo.json, an Arazzo 1.0 document that tools and AI agents can follow step by step.