# Printago API > Printago is a 3D print farm management platform. The REST API and Realtime MQTT service let you automate print farm operations programmatically — managing printers, parts, print jobs, orders, materials, and more. This is the same API that powers the Printago web app at app.printago.io. ## Base URL `https://api.printago.io` ## Authentication All requests require two headers: - `authorization`: Your API key, prefixed with `ApiKey ` (e.g., `ApiKey pk_live_abc123...`) - `x-printago-orgid`: Your organization ID (found in your dashboard URL or settings) API keys are managed at [app.printago.io/api](https://app.printago.io/api) under Settings > Integrations > API Keys. ### Rate Limits - 60 requests per minute (rolling window) - 600 requests per hour (rolling window) ## Documentation - [Full API Documentation](/): Interactive API docs with all 335+ endpoints, request/response schemas, and a built-in API console - [Authentication Guide](/authentication): Detailed auth setup, required headers, and error responses - [Realtime MQTT](/mqtt): Live printer stats and entity change events via MQTT - [OpenAPI Spec](/openapi): OpenAPI 3.0 specification and client generation instructions - [Download OpenAPI JSON](/swagger.json): Raw OpenAPI spec for code generation ## API Resources ### API Keys (8 endpoints) - [Get all API keys](/get/v1/api-keys) (requires: apiKey.view) - [Get API key by ID](/get/v1/api-keys/:id) (requires: apiKey.view) - [Get API key permissions](/get/v1/api-keys/:id/permissions) (requires: apiKey.view) - [Get API key roles](/get/v1/api-keys/:id/roles) (requires: apiKey.view) - [Create an API key](/post/v1/api-keys) (requires: apiKey.create) - [Search API keys](/post/v1/api-keys/search) (requires: apiKey.view) - [Update an API key](/patch/v1/api-keys/:id) (requires: apiKey.edit) - [Delete an API key](/delete/v1/api-keys/:id) (requires: apiKey.delete) ### Audit Logs (2 endpoints) - [GET /v1/audit-logs](/get/v1/audit-logs) - [POST /v1/audit-logs/search](/post/v1/audit-logs/search) ### Cost Catalog (6 endpoints) - [Get all cost components](/get/v1/cost-components) (requires: settings.view) - [Get cost component by ID](/get/v1/cost-components/:id) (requires: settings.view) - [Create new cost component](/post/v1/cost-components) (requires: settings.edit) - [Search cost components](/post/v1/cost-components/search) (requires: settings.view) - [Update cost component](/patch/v1/cost-components/:id) (requires: settings.edit) - [Delete cost component](/delete/v1/cost-components/:id) (requires: settings.edit) ### Customers (2 endpoints) - [Get all customers](/get/v1/customers) (requires: order.view) - [Search customers](/post/v1/customers/search) (requires: order.view) ### Entitlements (4 endpoints) - [Check if store has specific entitlement](/get/v1/entitlements/check/:entitlement) - [Get all entitlements](/get/v1/entitlements) - [Get entitlement by ID](/get/v1/entitlements/:id) - [Search entitlements](/post/v1/entitlements/search) ### Etsy (7 endpoints) - [Get Etsy listing](/get/v1/integrations/etsy/:integrationId/listing/:listingId) (requires: integration.view) - [Get Etsy settings](/get/v1/integrations/etsy/:integrationId/settings) (requires: integration.view) - [Get Etsy status](/get/v1/integrations/etsy/:integrationId/status) (requires: integration.view) - [Get Etsy usage stats](/get/v1/integrations/etsy/:integrationId/usage) (requires: integration.view) - [List Etsy integrations](/get/v1/integrations/etsy) (requires: integration.view) - [Sync Etsy orders](/post/v1/integrations/etsy/:integrationId/sync-orders) (requires: integration.manage) - [Update Etsy settings](/patch/v1/integrations/etsy/:integrationId/settings) (requires: integration.manage) ### Files (2 endpoints) - [Get signed download URLs](/post/v1/storage/signed-urls) (requires: file.download) - [Get signed upload URLs](/post/v1/storage/signed-upload-urls) (requires: part.create) ### Folders (10 endpoints) - [Get all folders](/get/v1/folders) (requires: part.view) - [Get folder by ID](/get/v1/folders/:id) (requires: part.view) - [Get folders by type](/get/v1/folders/by-type/:type) (requires: part.view) - [Get part folders](/get/v1/folders/parts) (requires: part.view) - [Get SKU folders](/get/v1/folders/skus) (requires: sku.view) - [Create a new folder](/post/v1/folders) (requires: part.create) - [Search folders](/post/v1/folders/search) (requires: part.view) - [Move folders to a new parent](/patch/v1/folders/move) (requires: part.edit) - [Rename a folder](/patch/v1/folders/rename) (requires: part.edit) - [Delete folders](/delete/v1/folders/delete) (requires: part.delete) ### Hints (4 endpoints) - [Get path schema](/get/v1/hints) - [Get type schema](/get/v1/hints/schema/types/:typeName) - [List available paths](/get/v1/hints/schema/paths) - [List available types](/get/v1/hints/schema/types) ### Integrations (3 endpoints) - [Get a specific integration by ID](/get/v1/integrations/:id) (requires: integration.view) - [Get all integrations](/get/v1/integrations) (requires: integration.view) - [Search integrations](/post/v1/integrations/search) (requires: integration.view) ### Linked Parts (6 endpoints) - [Get a specific linked part by ID](/get/v1/linked-parts/:id) (requires: sku.view) - [Get all linked parts for a store](/get/v1/linked-parts) (requires: sku.view) - [Create a new linked part](/post/v1/linked-parts) (requires: sku.edit) - [Search linked parts](/post/v1/linked-parts/search) (requires: sku.view) - [Update a linked part](/patch/v1/linked-parts/:id) (requires: sku.edit) - [Delete a linked part](/delete/v1/linked-parts/:id) (requires: sku.edit) ### Maintenance (15 endpoints) - [Get completion history](/get/v1/maintenance/history) (requires: maintenance.view) - [Get fleet maintenance status](/get/v1/maintenance/fleet-status) (requires: maintenance.view) - [Get printer maintenance status](/get/v1/maintenance/printers/:printerId/status) (requires: maintenance.view) - [Get recommended maintenance profiles](/get/v1/maintenance/recommended-profiles) (requires: maintenance.view) - [List enrollments](/get/v1/maintenance/enrollments) (requires: maintenance.view) - [List maintenance items](/get/v1/maintenance/items) (requires: maintenance.view) - [Create maintenance item](/post/v1/maintenance/items) (requires: maintenance.create) - [Duplicate maintenance item](/post/v1/maintenance/items/:id/duplicate) (requires: maintenance.create) - [Enroll printers](/post/v1/maintenance/enrollments) (requires: maintenance.edit) - [Enroll recommended maintenance](/post/v1/maintenance/recommended-enrollments) (requires: maintenance.edit) - [Mark maintenance done](/post/v1/maintenance/mark-done) (requires: maintenance.complete) - [Set maintenance mode](/patch/v1/maintenance/mode) (requires: maintenance.edit) - [Update maintenance item](/patch/v1/maintenance/items/:id) (requires: maintenance.edit) - [Delete maintenance item](/delete/v1/maintenance/items/:id) (requires: maintenance.delete) - [Unenroll printers](/delete/v1/maintenance/enrollments) (requires: maintenance.edit) ### Materials (12 endpoints) - [Get all material profile assignments](/get/v1/material-profile-assignments) (requires: material.view) - [Get all materials](/get/v1/materials) (requires: material.view) - [Get full material data](/get/v1/materials/full) (requires: material.view) - [Get material by ID](/get/v1/materials/:id) (requires: material.view) - [Assign profile to material](/post/v1/materials/:id/profiles) (requires: material.edit) - [Create material](/post/v1/materials) (requires: material.create) - [Search material profile assignments](/post/v1/material-profile-assignments/search) (requires: material.view) - [Search materials](/post/v1/materials/search) (requires: material.view) - [Update material](/patch/v1/materials/:id) (requires: material.edit) - [Clear material profile](/delete/v1/materials/:id/profiles) (requires: material.edit) - [Delete material](/delete/v1/materials/:id) (requires: material.delete) - [Delete materials](/delete/v1/materials) (requires: material.delete) ### Material Groups (11 endpoints) - [Get all group members](/get/v1/materials/group-members) (requires: material.view) - [Get all groups](/get/v1/materials/groups) (requires: material.view) - [Get group by ID](/get/v1/materials/groups/:id) (requires: material.view) - [Get group member by ID](/get/v1/materials/group-members/:id) (requires: material.view) - [Get group members](/get/v1/materials/group-members/group/:groupId) (requires: material.view) - [Add group member](/post/v1/materials/group-members) (requires: material.edit) - [Create group](/post/v1/materials/groups) (requires: material.edit) - [Update group](/patch/v1/materials/groups/:id) (requires: material.edit) - [Delete group](/delete/v1/materials/groups/:id) (requires: material.edit) - [Delete multiple groups](/delete/v1/materials/groups) (requires: material.edit) - [Remove group members](/delete/v1/materials/group-members) (requires: material.edit) ### Material Instances (5 endpoints) - [Get all material instances](/get/v1/materials/instances) (requires: material.instance.view) - [Get instance by ID](/get/v1/materials/instances/:id) (requires: material.instance.view) - [Create material instance](/post/v1/materials/instances) (requires: material.instance.create) - [Update material instance](/put/v1/materials/instances/:id) (requires: material.instance.edit) - [Delete material instance](/delete/v1/materials/instances/:id) (requires: material.instance.delete) ### Material Variants (12 endpoints) - [Get all material variants](/get/v1/material-variants) (requires: material.view) - [Get all variants](/get/v1/materials/variants) (requires: material.view) - [Get variant by ID](/get/v1/materials/variants/:id) (requires: material.view) - [Get variants by material](/get/v1/materials/:materialId/variants) (requires: material.view) - [Assign profile to variant](/post/v1/materials/variants/:variantId/profiles) (requires: material.edit) - [Batch create variants](/post/v1/materials/variants/batch) (requires: material.create) - [Create variant](/post/v1/materials/variants) (requires: material.create) - [Search material variants](/post/v1/material-variants/search) (requires: material.view) - [Update variant](/patch/v1/materials/variants/:id) (requires: material.edit) - [Clear variant profile](/delete/v1/materials/variants/:variantId/profiles) (requires: material.edit) - [Delete multiple variants](/delete/v1/materials/variants) (requires: material.delete) - [Delete variant](/delete/v1/materials/variants/:id) (requires: material.delete) ### Orders (24 endpoints) - [Get all customers](/get/v1/orders/customers) (requires: order.view) - [Get all ignored SKUs](/get/v1/ignored-skus) (requires: order.view) - [Get all orders](/get/v1/orders) (requires: order.view) - [Get complete order data](/get/v1/orders/full) (requires: order.view) - [Get customer by ID](/get/v1/orders/customers/:customerId) (requires: order.view) - [Get ignored SKUs list](/get/v1/orders/ignored-skus) (requires: order.view) - [Get order with full details](/get/v1/orders/:orderId) (requires: order.view) - [Get order without related data](/get/v1/orders/:orderId/only) (requires: order.view) - [Get print jobs for an external order](/get/v1/orders/by-external/:source/:externalId/jobs) (requires: order.view) - [Cancel an order](/post/v1/orders/:orderId/cancel) (requires: order.edit) - [Check if SKUs are ignored](/post/v1/orders/ignored-skus/check) (requires: order.view) - [Create a new customer](/post/v1/orders/customers) (requires: order.create) - [Create a new order](/post/v1/orders) (requires: order.create) - [Reconcile print jobs with orders](/post/v1/orders/reconcile) (requires: order.print) - [Reconcile print jobs with orders](/post/v1/orders/print) (requires: order.print) - [Search ignored SKUs](/post/v1/ignored-skus/search) (requires: order.view) - [Search orders](/post/v1/orders/search) (requires: order.view) - [Update an order](/put/v1/orders/:orderId) (requires: order.edit) - [Batch cancel orders](/patch/v1/orders/batch/cancel) (requires: order.edit) - [Batch close orders](/patch/v1/orders/batch/close) (requires: order.edit) - [Batch reopen orders](/patch/v1/orders/batch/reopen) (requires: order.edit) - [Update ignored SKUs list](/patch/v1/orders/ignored-skus) (requires: order.edit) - [Batch delete orders](/delete/v1/orders/batch/delete) (requires: order.delete) - [Delete an order](/delete/v1/orders/:orderId) (requires: order.delete) ### Order Items (9 endpoints) - [Get a specific order item](/get/v1/orders/items/:itemId) (requires: order.view) - [Get all order items](/get/v1/orders/items) (requires: order.view) - [Get all order items](/get/v1/order-items) (requires: order.view) - [Get items for a specific order](/get/v1/orders/:orderId/items) (requires: order.view) - [Add items to an order](/post/v1/orders/:orderId/items) (requires: order.edit) - [Search order items](/post/v1/order-items/search) (requires: order.view) - [Update an order item](/put/v1/orders/items/:itemId) (requires: order.edit) - [Batch update order items](/patch/v1/orders/:orderId/items/batch) (requires: order.edit) - [Delete an order item](/delete/v1/orders/items/:itemId) (requires: order.delete) ### Parts (14 endpoints) - [Get all part material assignments](/get/v1/part-material-assignments) (requires: part.view) - [Get all parts](/get/v1/parts) (requires: part.view) - [Get part by ID](/get/v1/parts/:id) (requires: part.view) - [Get part metadata](/get/v1/parts/:partId/metadata) (requires: part.view) - [Create a new part](/post/v1/parts) (requires: part.create) - [Create SKUs from parts](/post/v1/parts/create-skus) (requires: sku.create) - [Search part material assignments](/post/v1/part-material-assignments/search) (requires: part.view) - [Search parts](/post/v1/parts/search) (requires: part.view) - [Split multi-plate 3MF file](/post/v1/parts/:id/split-plates) (requires: part.edit) - [Trigger part estimation](/post/v1/parts/:partId/estimate) (requires: part.edit) - [Bulk update parts](/patch/v1/parts) (requires: part.edit) - [Update a part](/patch/v1/parts/:id) (requires: part.edit) - [Delete a part](/delete/v1/parts/:id) (requires: part.delete) - [Delete multiple parts](/delete/v1/parts) (requires: part.delete) ### Part Builds (9 endpoints) - [Get a specific part build by ID](/get/v1/part-builds/:id) (requires: queue.view) - [Get a specific part build step by ID](/get/v1/part-build-steps/:id) (requires: build.view) - [Get all part build steps](/get/v1/part-build-steps) (requires: build.view) - [Get all part builds for a store](/get/v1/part-builds) (requires: queue.view) - [Search part build steps](/post/v1/part-build-steps/search) (requires: build.view) - [Search part builds](/post/v1/part-builds/search) (requires: queue.view) - [Archive part builds](/patch/v1/part-builds/archive) (requires: queue.manage) - [Dismiss part builds (deprecated)](/patch/v1/part-builds/dismiss) (requires: queue.manage) - [Restore archived part builds](/patch/v1/part-builds/restore) (requires: queue.manage) ### Passkeys (9 endpoints) - [Get passkey authentication options](/get/v1/passkeys/authentication/options) - [Get passkey registration options](/get/v1/passkeys/registration/options) - [List passkeys](/get/v1/passkeys) - [Begin passkey signup](/post/v1/passkeys/signup/begin) - [Complete passkey signup](/post/v1/passkeys/signup/complete) - [Verify passkey authentication](/post/v1/passkeys/authentication/verify) - [Verify passkey registration](/post/v1/passkeys/registration/verify) - [Rename a passkey](/patch/v1/passkeys/:id) - [Delete a passkey](/delete/v1/passkeys/:id) ### Permissions (3 endpoints) - [Get all permissions](/get/v1/permissions) (requires: permission.view) - [List permission types](/get/v1/permissions/types) (requires: permission.view) - [Search permissions](/post/v1/permissions/search) (requires: permission.view) ### Print Jobs (19 endpoints) - [Get all print jobs](/get/v1/print-jobs) (requires: queue.view) - [Get completed job count](/get/v1/print-jobs/stats/completed-count) (requires: queue.view) - [Get job matching details](/get/v1/print-jobs/:id/matching-details) (requires: queue.view) - [Get job matching troubleshooting details](/get/v1/print-jobs/:id/matching-troubleshoot) (requires: queue.view) - [Get print job](/get/v1/print-jobs/:id) (requires: queue.view) - [List archived jobs](/get/v1/print-jobs/archived) (requires: queue.view) - [Search print jobs](/post/v1/print-jobs/search) (requires: queue.view) - [Split group](/post/v1/print-jobs/groups/split) (requires: queue.manage) - [Adjust group quantity](/patch/v1/print-jobs/groups/quantity) (requires: queue.manage) - [Bulk reorder jobs](/patch/v1/print-jobs/bulk-reorder) (requires: queue.manage) - [Cancel print jobs](/patch/v1/print-jobs/cancel) (requires: queue.manage) - [Clear finished jobs](/patch/v1/print-jobs/clear) (requires: job.delete.all) - [Pause print jobs](/patch/v1/print-jobs/pause) (requires: queue.manage) - [Prioritize jobs](/patch/v1/print-jobs/move-to-queue-front) (requires: queue.override) - [Reorder a job](/patch/v1/print-jobs/:id/reorder) (requires: queue.manage) - [Reorder group](/patch/v1/print-jobs/groups/reorder) (requires: queue.manage) - [Resume paused jobs](/patch/v1/print-jobs/resume) (requires: queue.manage) - [Retry failed jobs](/patch/v1/print-jobs/retry) (requires: queue.manage) - [Update print job](/patch/v1/print-jobs/:id) (requires: job.edit.all) ### Printers (16 endpoints) - [Get all printers](/get/v1/printers) (requires: printer.view) - [Get latest camera snapshot URL](/get/v1/printers/:id/snapshot) (requires: printer.camera) - [Get printer by ID](/get/v1/printers/:id) (requires: printer.view) - [Last printed history](/get/v1/printers/:id/history/last) (requires: printer.view, queue.view) - [Search printers](/post/v1/printers/search) (requires: printer.view) - [Send command to printers](/post/v1/printer-commands/send) (requires: printer.control) - [Bulk update printers](/patch/v1/printers) (requires: printer.edit) - [Confirm printer ready](/patch/v1/printers/confirm-ready) (requires: printer.ready) - [Multi-update printers](/patch/v1/printers/multi) (requires: printer.edit) - [Rename a printer](/patch/v1/printers/:id/rename) (requires: printer.edit) - [Set Fabmatic](/patch/v1/printers/continous-print) (requires: printer.config, printer.ready) - [Set printer enabled status](/patch/v1/printers/enabled) (requires: printer.control) - [Set provider config](/patch/v1/printers/set-config) (requires: printer.config) - [Update a printer](/patch/v1/printers/:id) (requires: printer.edit) - [Delete a printer](/delete/v1/printers/:id) (requires: printer.delete) - [Delete multiple printers](/delete/v1/printers) (requires: printer.delete) ### Printer Slots (4 endpoints) - [Get all printer slots](/get/v1/materials/printer-slots) (requires: printer.view) - [Get all printer slots](/get/v1/printer-slots) (requires: printer.view) - [Search printer slots](/post/v1/printer-slots/search) (requires: printer.view) - [Assign to printer slots](/patch/v1/materials/printer-slots/assign) (requires: printer.edit) ### Printing (2 endpoints) - [Create and queue prints](/post/v2/builds) - [Preview part builds and jobs (dry run)](/post/v2/builds/preview) ### Profiles (19 endpoints) - [Get a specific profile](/get/v1/profiles/:id) (requires: profile.view) - [Get all available printer models](/get/v1/profiles/printer-models) (requires: profile.view) - [Get all slicer profiles](/get/v1/profiles) (requires: profile.view) - [Get available slicer versions](/get/v1/profiles/slicer-versions) (requires: settings.view) - [Get available slicer versions for a profile](/get/v1/profiles/:id/versions) (requires: profile.view) - [Get full profile data with optional slicer version](/get/v1/profiles/:id/full) (requires: profile.view) - [Get printer models used in your store](/get/v1/profiles/my-printer-models) (requires: profile.view) - [Get profile with inheritance details](/get/v1/profiles/:id/view) (requires: profile.view) - [Get profiles by machine model and nozzle size](/get/v1/profiles/compatible/:machineModel/:nozzleDiameter) (requires: profile.view) - [Get profiles compatible with a printer](/get/v1/profiles/compatible/:id) (requires: profile.view) - [Get supported printer models](/get/v1/profiles/supported) (requires: profile.view) - [Create a new profile](/post/v1/profiles) (requires: profile.create) - [Import pre-parsed profiles](/post/v1/profiles/import-data) (requires: profile.create) - [Import profiles from a file](/post/v1/profiles/import) (requires: profile.create) - [Preview profiles from a file](/post/v1/profiles/preview) (requires: profile.create) - [Search profiles](/post/v1/profiles/search) (requires: profile.view) - [Update a profile](/patch/v1/profiles/:id) (requires: profile.edit) - [Delete a profile](/delete/v1/profiles/:id) (requires: profile.delete) - [Delete multiple profiles](/delete/v1/profiles) (requires: profile.delete) ### Settings (7 endpoints) - [Get available slicer versions](/get/v1/settings/slicers) (requires: settings.view) - [Get store settings](/get/v1/settings/store) (requires: settings.view) - [Get user settings](/get/v1/settings/user) - [Search notification settings](/post/v1/settings/notifications/search) (requires: settings.view) - [Search store settings](/post/v1/settings/store/search) (requires: settings.view) - [Update store settings](/patch/v1/settings/store) (requires: settings.edit) - [Update user settings](/patch/v1/settings/user) ### Shopify (6 endpoints) - [Get Shopify settings](/get/v1/integrations/shopify/:integrationId/settings) (requires: integration.view) - [Get Shopify status](/get/v1/integrations/shopify/:integrationId/status) (requires: integration.view) - [List Shopify integrations](/get/v1/integrations/shopify) (requires: integration.view) - [Disconnect Shopify](/post/v1/integrations/shopify/:integrationId/disconnect) (requires: integration.manage) - [Retry variant enrichment](/post/v1/integrations/shopify/orders/:orderId/retry-variant-enrichment) (requires: order.edit) - [Update Shopify settings](/patch/v1/integrations/shopify/:integrationId/settings) (requires: integration.manage) ### SKUs (7 endpoints) - [Get a specific SKU](/get/v1/skus/:id) (requires: sku.view) - [List all SKUs](/get/v1/skus) (requires: sku.view) - [Create a new SKU](/post/v1/skus) (requires: sku.create) - [Delete multiple SKUs](/post/v1/skus/delete-many) (requires: sku.delete) - [Search SKUs](/post/v1/skus/search) (requires: sku.view) - [Update a SKU](/patch/v1/skus/:id) (requires: sku.edit) - [Delete a SKU](/delete/v1/skus/:id) (requires: sku.delete) ### SKU Builds (3 endpoints) - [Get a specific SKU build by ID](/get/v1/sku-builds/:id) (requires: queue.view) - [Get all SKU builds for a store](/get/v1/sku-builds) (requires: queue.view) - [Search SKU builds](/post/v1/sku-builds/search) (requires: queue.view) ### SKU Costs (9 endpoints) - [Get a specific SKU cost by ID](/get/v1/sku-costs/:id) (requires: sku.view) - [Get all costs for a specific SKU](/get/v1/sku-costs/by-sku/:skuId) (requires: sku.view) - [Get all SKU costs for a store](/get/v1/sku-costs) (requires: sku.view) - [Get cost breakdown for a specific SKU](/get/v1/sku-costs/breakdown/:skuId) (requires: sku.view) - [Create a new SKU cost](/post/v1/sku-costs) (requires: sku.edit) - [Search SKU costs](/post/v1/sku-costs/search) (requires: sku.view) - [Update a SKU cost](/patch/v1/sku-costs/:id) (requires: sku.edit) - [Delete a SKU cost](/delete/v1/sku-costs/:id) (requires: sku.edit) - [Delete all costs for a specific SKU](/delete/v1/sku-costs/by-sku/:skuId) (requires: sku.edit) ### SKU Variants (37 endpoints) - [Get a specific property value by ID](/get/v1/sku-variants/prop-values/:id) (requires: sku.view) - [Get a specific SKU variant by ID](/get/v1/sku-variants/:id) (requires: sku.view) - [Get a specific variant binding by ID](/get/v1/sku-variants/bindings/:id) (requires: sku.view) - [Get a specific variant property by ID](/get/v1/sku-variants/props/:id) (requires: sku.view) - [Get a specific variant value by ID](/get/v1/sku-variants/values/:id) (requires: sku.view) - [Get all property values for a store](/get/v1/sku-variants/prop-values) (requires: sku.view) - [Get all SKU variants for a store](/get/v1/sku-variants) (requires: sku.view) - [Get all value filters for a SKU](/get/v1/sku-variants/filters/:skuId) (requires: sku.view) - [Get all variant bindings for a store](/get/v1/sku-variants/bindings) (requires: sku.view) - [Get all variant properties for a store](/get/v1/sku-variants/props) (requires: sku.view) - [Get all variant values for a store](/get/v1/sku-variants/values) (requires: sku.view) - [Get filtered option values for a SKU](/get/v1/sku-variants/filtered-values/:skuId/:optionId) (requires: sku.view) - [Get SKU-specific properties](/get/v1/sku-variants/bindings/:id/properties) (requires: sku.view) - [Get value filters for a SKU and option](/get/v1/sku-variants/filters/:skuId/:optionId) (requires: sku.view) - [Get variant values for a specific group](/get/v1/sku-variants/:groupId/values) (requires: sku.view) - [Match a SKU string with variants](/get/v1/sku-variants/sku-match/:skuString) (requires: sku.view) - [Create a new SKU variant](/post/v1/sku-variants) (requires: sku.edit) - [Create a new variant binding](/post/v1/sku-variants/bindings) (requires: sku.edit) - [Create a new variant property](/post/v1/sku-variants/props) (requires: sku.edit) - [Create a new variant value](/post/v1/sku-variants/values) (requires: sku.edit) - [Create multiple property values](/post/v1/sku-variants/prop-values) (requires: sku.edit) - [Reorder a variant binding](/post/v1/sku-variants/bindings/reorder) (requires: sku.edit) - [Reorder a variant property](/post/v1/sku-variants/props/reorder) (requires: sku.edit) - [Reorder a variant value](/post/v1/sku-variants/values/reorder) (requires: sku.edit) - [Search SKU options](/post/v1/sku-variants/search) (requires: sku.view) - [Set filtered values for a SKU option](/put/v1/sku-variants/filters) (requires: sku.edit) - [Update a SKU variant](/patch/v1/sku-variants/:id) (requires: sku.edit) - [Update a variant binding](/patch/v1/sku-variants/bindings/:id) (requires: sku.edit) - [Update a variant property](/patch/v1/sku-variants/props/:id) (requires: sku.edit) - [Update a variant value](/patch/v1/sku-variants/values/:id) (requires: sku.edit) - [Update multiple property values](/patch/v1/sku-variants/prop-values) (requires: sku.edit) - [Delete a SKU variant](/delete/v1/sku-variants/:id) (requires: sku.edit) - [Delete a variant binding](/delete/v1/sku-variants/bindings/:id) (requires: sku.edit) - [Delete a variant property](/delete/v1/sku-variants/props/:id) (requires: sku.edit) - [Delete a variant value](/delete/v1/sku-variants/values/:id) (requires: sku.edit) - [Delete multiple property values](/delete/v1/sku-variants/prop-values) (requires: sku.edit) - [Remove a value filter](/delete/v1/sku-variants/filters/:id) (requires: sku.edit) ### Slicer (2 endpoints) - [Get all slicer jobs](/get/v1/slicer) (requires: settings.view) - [Search slicer jobs](/post/v1/slicer/search) (requires: settings.view) ### Stores (2 endpoints) - [Get all stores for current user](/get/v1/stores) - [Update organization settings](/patch/v1/stores) (requires: organization.edit) ### Subscriptions (8 endpoints) - [Get addon by type with tiers](/get/v1/addons/:addonType) - [Get addon subscription by type](/get/v1/addon-subscriptions/:addonType) (requires: subscription.view) - [Get all addon subscriptions](/get/v1/addon-subscriptions) (requires: subscription.view) - [Get all available addons](/get/v1/addons) - [Get current subscription](/get/v1/subscriptions) (requires: subscription.view) - [Search addon subscriptions](/post/v1/addon-subscriptions/search) (requires: subscription.view) - [Search subscriptions](/post/v1/subscriptions/search) (requires: subscription.view) - [Configure audit logs](/patch/v1/subscriptions/audit-logs) (requires: audit.logs.configure) ### Users (17 endpoints) - [GET /v1/permissions/user/{userId}](/get/v1/permissions/user/:userId) - [GET /v1/roles](/get/v1/roles) - [GET /v1/roles/{roleId}/permissions](/get/v1/roles/:roleId/permissions) - [GET /v1/roles/with-permissions](/get/v1/roles/with-permissions) - [GET /v1/users](/get/v1/users) - [GET /v1/users/{userId}](/get/v1/users/:userId) - [POST /v1/users/{userId}/permissions](/post/v1/users/:userId/permissions) - [POST /v1/users/{userId}/roles](/post/v1/users/:userId/roles) - [POST /v1/users/bulk](/post/v1/users/bulk) - [POST /v1/users/invite](/post/v1/users/invite) - [POST /v1/users/invite/{invitationId}/resend](/post/v1/users/invite/:invitationId/resend) - [POST /v1/users/invite/{invitationId}/revoke](/post/v1/users/invite/:invitationId/revoke) - [PUT /v1/users/{userId}/permissions](/put/v1/users/:userId/permissions) - [PUT /v1/users/{userId}/roles](/put/v1/users/:userId/roles) - [DELETE /v1/users/{userId}](/delete/v1/users/:userId) - [DELETE /v1/users/{userId}/permissions](/delete/v1/users/:userId/permissions) - [DELETE /v1/users/{userId}/roles/{roleId}](/delete/v1/users/:userId/roles/:roleId) ## Realtime MQTT Subscribe to live updates via MQTT (same data powering the Printago dashboard). - **MQTTS**: `mqtts://realtime.printago.io:8883` - **WebSocket**: `wss://realtime.printago.io:9001` - **Auth**: Username = org ID, Password = API key (without `ApiKey ` prefix) - **Client ID**: Format `apiclient_{keyId}_{suffix}` where keyId is the first 24 characters of your API key. ### Topics - `stores/{orgId}/printer-stats/#` — Realtime printer telemetry (temps, progress, status) - `stores/{orgId}/printer-stats/{printerId}` — Single printer telemetry - `stores/{orgId}/entities/#` — All entity change events (INSERT/UPDATE/DELETE) - `stores/{orgId}/entities/{entityType}` — Specific entity type changes ### Entity Types printers, parts, print_jobs, orders, order_items, skus, materials, material_variants, material_groups, material_instances, folders, profiles, printer_slots, integrations, customers, api_keys, subscriptions, entitlements, cost_components, settings_store, settings_notifications, user_permissions, part_builds, part_build_steps, part_material_assignments, sku_builds, sku_costs, sku_option_bindings, sku_option_values, sku_options, sku_parts, slicer_jobs, addon_subscriptions, addon_usage_records ## Quick Start ```bash curl -X GET "https://api.printago.io/v1/printers" \ -H "authorization: ApiKey YOUR_API_KEY" \ -H "x-printago-orgid: YOUR_ORG_ID" ```