NAV
cURL

Getting Started

Welcome to the SimplyPrint API!

This documentation goes through authenticating and how to use the API.

Also available: llms.txt (AI-readable reference) | api/index.json (machine-readable index)

🤖 Get AI help with this API

Ask an AI assistant about the SimplyPrint API. They can read our docs and help you with authentication, endpoints, and integration.

AI-friendly URLs you can share:
https://apidocs.simplyprint.io/llms.txt - full API overview
https://apidocs.simplyprint.io/api/index.json - structured endpoint index
https://apidocs.simplyprint.io/static/{endpoint}.txt - individual endpoint details

The base URL

The base URL for the SimplyPrint API is https://api.simplyprint.io/{id}/.

To use the base API at https://api.simplyprint.io, you will need to specify an id.

The id represents the unique identifier for the company that you are using the API key for. This id is used to access the specific functionality within the API that is associated with the company.

The endpoint represents the specific functionality that you want to access within the API. There are various endpoints available, each with its own specific purpose and functionality.

For example, if you want to access the account/Test endpoint for a company with an id of 123, you would use the following API endpoint:

https://api.simplyprint.io/123/account/Test

If you are part of an organization, you might need to ask your organization administrator to allow API access for your account for the organization.

Gaining access to the API

There are two ways to gain access to the SimplyPrint API:

  1. Using an API key (recommended)
    • This is the recommended method for most users. This method requires a SimplyPrint account and an API key.
  2. Using OAuth2
    • This method is only available for approved integrations. You can use OAuth2 to access SimplyPrint API endpoints on behalf of a user.

To get an API key you'll need a SimplyPrint account that is either a member of an organization, or have at least the SimplyPrint Pro plan.

To create your own API key you first need a SimplyPrint account, you can go to your account settings and create a new API key.

Using the API key

curl {base_url}/account/Test \
  --header 'X-API-KEY: {API_KEY}'

Success return:

{
  "status": true,
  "message": "Your API key is valid!"
}

Error return in case of an invalid or missing API key:

{
  "status": false,
  "message": "No API key provided, or not logged in"
}

Error return in case of missing permissions for the organization:

{
  "status": false,
  "message": "You don't have access to this account"
}

To verify that your API key is valid and that you have access to the desired organization, you can make a request to the /account/Test endpoint.

To make any request to the SimplyPrint API, you will need to include your API key in the request header. You can do this by including the X-API-KEY header in your request. On the right side of this page, you can see an example of how to make a request to the /account/Test endpoint using cURL.

If you are unable to successfully make a request to the /account/Test endpoint using the provided example, there may be a few possible issues:

If you are unable to resolve the issue after troubleshooting these potential issues, you may need to contact your organization administrator for further assistance. Otherwise, feel free to contact us via our helpdesk.

Using OAuth2

SimplyPrint supports OAuth2 logins for all users, regardless of their subscription, for approved integrations such as the Cura slicer integration.

The OAuth2 method can be used to link a user's SimplyPrint account with a third party platform/software, and use the SimplyPrint API on behalf of the user.

To obtain OAuth2 access, you must be added as an OAuth2 provider by SimplyPrint. To request this, please fill out the OAuth2 Client Request Form.

Once you have been added as an OAuth2 provider, you can use the following documentation to implement OAuth2 in your application.

Authorizing your application

For users to grant your application access to their SimplyPrint account, you must first redirect them to the SimplyPrint OAuth2 authorization page. You can do this by redirecting the user to the following URL:

https://simplyprint.io/panel/oauth2/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope={scope}

The following parameters can be supplied as query parameters in the URL:

Parameter Type Required Description
client_id string yes The client ID of your OAuth2 application
redirect_uri string yes The redirect URI of your OAuth2 application
scope string yes The scope of the OAuth2 access token. This can be a +-separated list of scopes.
response_type string yes This must be set to code
state string no The value of this parameter will be returned to your application when the user is redirected back

Once the user has granted access to your application, they will be redirected to {redirect_uri}?code={code}&state={state}. The code parameter is the authorization code that you will use to obtain an access token. The state parameter will only be returned if you specified a state parameter in the authorization URL.

Obtaining an access token

Obtaining an access token

curl https://api.simplyprint.io/oauth2/Token \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Request body

{
  "grant_type": "authorization_code",
  "client_id": "{client_id}",
  "client_secret": "{client_secret}",
  "code": "{code}",
  "redirect_uri": "{redirect_uri}"
}

Success response

{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": "{access_token}",
  "refresh_token": "{refresh_token}"
}

Now that you have a code parameter, you can use it to obtain an access token. To do this, you must make a POST request to the following URL:

https://api.simplyprint.io/oauth2/Token

This will return an access token that you can use to make requests to the SimplyPrint API on behalf of the user.

This access token will expire after 1 hour. Once it expires, you can use the refresh_token parameter to obtain a new access token. To do this, you must make a POST request to the same URL as above, but with the following request parameters:

Parameter Type Description
grant_type string This must be set to refresh_token
client_id string The client ID of your application
client_secret string The client secret of your application
refresh_token string The refresh token that was returned when you obtained the access token

To refresh your access token, you can make a POST request to the same URL as above, but with the following request parameters:

Parameter Type Description
grant_type string This must be set to refresh_token
client_id string The client ID of your application
client_secret string The client secret of your application
refresh_token string The refresh token that was returned when you obtained the access token

This will return a new access token that you can use to make requests to the SimplyPrint API on behalf of the user.

Testing your access token

Testing your access token

curl https://api.simplyprint.io/oauth2/TokenInfo \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {access_token}'

Success response

{
  "status": true,
  "message": null,
  "user": {
    "id": 112,
    "name": "John Doe",
    "email": "john@doe.com",
  },
  "company": {
    "id": 123,
    "name": "My Company"
  },
  "scopes": [
    ...
  ],
  "expires_at": 1706292803
}

To test your access token, you can make a GET request to the following URL:

https://api.simplyprint.io/oauth2/TokenInfo

This endpoint returns the following information:

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
user object User object.
user.id integer User ID.
user.name string User name. This is only returned if the user.read scope is included in the access token.
user.email string User email. This is only returned if the user.read scope is included in the access token.
company object Company object.
company.id integer Company ID.
company.name string Company name.
scopes array Array of scopes that are included in the access token.
expires_at integer The unix timestamp of when the access token expires.

The company id is especially important, as you will need to use this in the base URL for all requests to the SimplyPrint API.

Printers

Get printer info

curl https://api.simplyprint.io/{id}/printers/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "page": 1,
    "page_size": 10,
    "search": "Printer 1"
  }'

Success response

{
  "status": true,
  "message": null,
  "page_amount": 21,
  "total": 61,
  "data": [
    {
      "id": 13,
      "sort_order": 0,
      "printer": {
        "name": "Printer 1",
        "state": "in_maintenance",
        "group": 942,
        "groupName": "Storage",
        "position": 0,
        "api": "Duet",
        "ui": "Duet",
        "ip": "10.78.16.52",
        "machine": "AMD Ryzen 9 5900HX with Radeon Graphics",
        "online": false,
        "region": null,
        "firmware": "RepRapFirmware for Duet 3 Mini 5+",
        "firmwareVersion": "3.5.3",
        "spVersion": "1.3.13",
        "temps": {
          "ambient": 20,
          "current": {
            "tool": [
              26
            ],
            "bed": 22
          },
          "target": {
            "tool": [
              0
            ],
            "bed": 0
          },
          "targetTemperatures": false
        },
        "tags": {
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.7,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ]
        },
        "activeExtruder": 0,
        "activeNozzle": 0,
        "activeTools": [
          0
        ],
        "hasPSU": 1,
        "psuOn": false,
        "hasFilSensor": false,
        "filSensor": false,
        "model": {
          "id": 6,
          "name": "Ender-3",
          "brand": "Creality",
          "bedSize": [
            400,
            400
          ],
          "bedType": "square",
          "maxHeight": 250,
          "image": "https://cdn.simplyprint.io/i/printer_types/creality/ender-3/product_photo_sm.png",
          "hasHeatedBed": true,
          "coolPlate": false,
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.7,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ],
          "nozzles": 1,
          "extruders": 1,
          "extruderSettings": null,
          "maxToolTemp": 255,
          "maxBedTemp": 110,
          "probeToolTemp": 0,
          "filamentWidth": 1.75,
          "nozzleDia": 0.7,
          "directDrive": 0,
          "hasAbl": 0,
          "ablOnPrint": 0,
          "axes": {
            "x": {
              "speed": 100,
              "inverted": false
            },
            "y": {
              "speed": 100,
              "inverted": false
            },
            "z": {
              "speed": 3.5,
              "inverted": false
            },
            "e": {
              "speed": 5,
              "inverted": false
            }
          },
          "screwOffset": 35,
          "filamentRetraction": 430,
          "customBoundingBox": null,
          "probingGcode": null,
          "probingFirmware": "",
          "heatedChamber": 0,
          "canM117": true,
          "extrudeAbs": 0,
          "originCenter": 0,
          "bedBelt": 0,
          "fwRetract": 0,
          "extrusionType": 1,
          "noControl": false,
          "mms": null,
          "startOptions": null,
          "peripheralsDefinition": null,
          "zipPrinting": false,
          "slicerSupport": true,
          "specialExtensions": null,
          "pluginsToInstall": ""
        },
        "hasCam": 1,
        "hasQueue": {
          "items": 1,
          "fits": false
        },
        "locked": 0,
        "lockReason": null,
        "health": {
          "usage": 0,
          "temp": 0,
          "memory": 55
        },
        "unsupported": 0,
        "latency": null,
        "autoprint": false,
        "currentAutoprintJobs": 0,
        "autoprintMaxJobs": 16,
        "aiEnabled": true,
        "aiSettings": {
          "rules": [
            {
              "action": {
                "onPause": {
                  "coolBed": false,
                  "coolHotend": true,
                  "liftExtruder": {
                    "enabled": true,
                    "distance": 10
                  },
                  "retractFilament": {
                    "enabled": true,
                    "distance": 10
                  }
                },
                "printAction": "pause",
                "notification": true
              },
              "trigger": "any",
              "sensitivity": "medium"
            }
          ],
          "regions": []
        },
        "autoprintDetails": {
          "method": "custom"
        },
        "integration": "Duet",
        "capabilities": null,
        "peripheralsDefinition": {
          "power:psu": {
            "n": "PSU",
            "f": "rw"
          }
        },
        "peripheralsState": null,
        "nopi": 0,
        "licensed": false,
        "serial_number_id": null,
        "outOfOrder": 0
      },
      "filament": null,
      "job": null,
      "notifications": []
    }
  ]
}

List printers in the account with paging, or fetch a single printer's info by passing pid. This is the same payload the panel uses to render the printer grid, so the response is rich. You can trim it with the printer_columns, job_columns, and filament_columns query parameters when you only need a subset of fields.

Request

POST /{id}/printers/Get or GET /{id}/printers/Get?pid={id}

Required OAuth scope
printers.read

Query parameters

Parameter Type Required Description
pid integer no Return a single printer (as data object instead of array). Must belong to the account.
page integer no Page number (GET). Default 1.
page_size integer no Page size (GET). 1-25. Default 25. Note that the POST body accepts 1-100; the GET cap is stricter to keep URLs short.
order_by string no Sort order. One of status, name, online, last_online, ui, created.
printer_columns string no Comma-separated list of printer fields to return. Omit to return the full set. See "Extra printer columns" below.
job_columns string no Comma-separated list of job fields to return.
filament_columns string no Comma-separated list of filament fields to return.
no_printer any no Any value omits the printer object from each row.
no_filament any no Any value omits the filament object from each row.
no_job any no Any value omits the job object from each row.
no_notifications any no Any value omits the notifications array.
compact boolean no MCP-friendly column set (AI-relevant fields only). Pre-fills printer_columns, job_columns, and filament_columns unless you set them.

Request body

Parameter Type Required Description
page integer no Page number. Default 1.
page_size integer no Page size (POST). 1-100. Default 25.
search string no Search string. Matches against printer id, name, SKU, MAC, IP, and machine type.
sort_id string no Sort column. One of name, sku, mac, created.
sort_dir string no asc or desc.

Extra printer columns

These fields are only returned when explicitly requested via printer_columns. They are not part of the default response:

Column Description
sku Printer SKU. Partner-managed accounts only.
mac MAC address.
firmwareVersion Firmware version string.
comment User-set comment on the printer.
ssid Wi-Fi SSID the host reported last.
apiVersion Host API version.
pythonVersion Host Python version.
ethernet true if the host is on ethernet.
hostname Host hostname.
nfcId NFC tag id associated with the printer.
qrId QR code id associated with the printer.
probeData Bed probe mesh (decoded JSON).
lastOnline ISO-8601 UTC timestamp of last online-seen.
created ISO-8601 UTC timestamp of when the printer was added.

Response

When pid is passed, data is a single printer object (no array wrapping).

Parameter Type Description
status boolean true if the request was successful.
message string/null Error message if status is false.
page_amount integer Total number of pages (not returned when pid is passed).
total integer Total number of matching printers across all pages.
data array/object Array of printer rows, or a single row when pid is passed.
data[].id integer Printer id.
data[].sort_order integer Sort index within the printer's group.
data[].printer object Printer state + metadata (see below).
data[].filament object/null Assigned filament per extruder, keyed by extruder index, or null if none.
data[].job object/null Current print job, or null if the printer isn't printing. See Get Print Jobs.
data[].notifications array Open printer notifications (warnings / errors). Empty array when there are none.
data[].printer fields
Field Type Description
name string Printer name.
state string Printer state (e.g. operational, printing, offline).
group integer/null Printer group id.
groupName string Printer group name (only present when the printer is in a group).
position integer Position within the group.
api / ui string Host software (e.g. OctoPrint, Klipper).
ip string Local IP, if known to the server.
machine string Host machine type (e.g. Raspberry Pi 4 Model B Rev 1.2).
online boolean Whether the printer is currently online.
region string Realtime region the printer is connected through.
firmware string Firmware name reported by the printer.
firmwareVersion string Firmware version reported by the printer.
spVersion string SimplyPrint agent version.
temps object Current/target temperatures per tool + bed.
tags object/null Tag summary (custom tags, material, nozzle size).
activeExtruder integer Currently active extruder index.
activeNozzle integer/null Currently active nozzle id.
activeTools array Tools currently selected on the printer.
hasPSU / psuOn boolean SimplyPrint-connected PSU present / currently switched on.
hasFilSensor / filSensor boolean Filament runout sensor present / currently triggered.
model object Printer model metadata: id, name, brand, bedSize, bedType, maxHeight, extruders, nozzleDia, filamentWidth, maxToolTemp, maxBedTemp, hasHeatedBed, hasAbl, image, plus additional slicer and start-option hints.
hasCam boolean true if a camera is attached.
hasQueue object/null Printer-specific queue summary: { items, fits }.
locked boolean true if the printer is locked (e.g. due to a downsized subscription).
lockReason string/null Reason for lock, or null.
health object Host health: { usage, temp, memory }.
unsupported boolean true if the printer model is marked unsupported.
latency integer/null Roundtrip latency to the printer in ms.
autoprint boolean true if AutoPrint is enabled on this printer.
currentAutoprintJobs / autoprintMaxJobs integer AutoPrint cycle counters.
aiEnabled boolean true if the AI failure detection is enabled.
aiSettings object/null AI failure-detection rules and thresholds. See AI get settings.
autoprintDetails object/null AutoPrint state snapshot (same shape as printers/autoprint/CheckState).
integration string/null Integration driver name when the printer is driven through a vendor API (e.g. Duet, Bambu).
capabilities object/null Feature flags the host has advertised, or null.
peripheralsDefinition / peripheralsState object/null Attached peripheral definitions and live state. Either may be null.
nopi boolean true if the printer is running in direct (no-Pi) mode.
licensed boolean true if the printer counts against your plan's licensed printer seat.
serial_number_id integer/null SimplyPrint-issued serial number id.
outOfOrder boolean true if the printer is marked out of order.

Start print / create job

curl https://api.simplyprint.io/{id}/printers/actions/CreateJob?pid=1234,1235 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "filesystem": "196a1dd0b93a66c19192a39fa4c16e71"
  }'

Success response

{
  "status": true,
  "message": null,
  "files": [
    {
      "name": "Benchy.gcode",
      "analysis": {
        "slicer": "PrusaSlicer",
        "filament": [
          8.15
        ],
        "estimate": 4862,
        "movement": {
          "mRelative": 0,
          "eRelative": 0
        },
        "temps": {
          "tool": {
            "T0": 215
          },
          "bed": 60,
          "pset": 1
        },
        "modelSize": {
          "x": 60,
          "y": 60,
          "z": 48
        },
        "printArea": {
          "maxX": 130,
          "minX": 70,
          "maxY": 130,
          "minY": 70,
          "maxZ": 48,
          "minZ": 0.2
        },
        "v": 5
      },
      "printers": [
        385
      ],
      "queued": false,
      "cost": [
        {
          "estimate": false,
          "total_cost": 1.42,
          "lines": [
            {
              "id": 1,
              "label": "Material usage",
              "cost": 0.35
            },
            {
              "id": 3,
              "label": "Machine run time",
              "cost": 0.97
            },
            {
              "id": 4,
              "label": "Energy cost",
              "cost": 0.1
            }
          ]
        }
      ]
    }
  ],
  "jobIds": [
    495462
  ],
  "staggeredPrinterIds": []
}

Start one print on one or more printers. Every target printer must be in the operational state. Choose exactly one file-picking mode: filesystem, queue_file, multi_queue, file_id, reprint, or next_queue_item.

Required permission OAuth scope
print printers.actions
reprint_file Required if reprint is used.

Request

POST /{id}/printers/actions/CreateJob?pid=1234,1235

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to start the print on. Must be operational.

Request body: pick one file source

Parameter Type Description
filesystem string Filesystem id of a user file (upload via API Files).
file_id string API Files id, starts a print without adding it to the user's file list.
queue_file integer Queue item id. Starts that specific queue item.
multi_queue object Map of queue item id → array of printer ids, e.g. {638: [12645, 12646]}. Used when several printers should each start a different queue item.
next_queue_item boolean When true, match the next queue item automatically. Requires the Print Farm plan.
reprint integer Print job id to reprint. Requires the reprint_file permission.

Request body: options

Parameter Type Description
mms_map object/string MMS (multi-material system) mapping. Format: [{"pid": printer_id, "map": [extruder_mapping]}]. For example [0,1,2,3] maps T0 to E0, T1 to E1, etc. For multi-nozzle printers use objects [{"nozzle": 0, "ext": 4}]. Accepts either array or JSON-string.
start_options object/string Per-start overrides (heat soak, probe, etc.). Accepts either array or JSON-string.
custom_fields array Custom fields to attach to every started job. Each entry is a Custom Field Submission Value.
individual_custom_fields array Per-item custom field overrides, keyed for each printer (same shape nested inside id / value entries). See the panel "Start print" flow for details.
skipped_objects array Array of object ids to pre-skip when the print begins.
quick_queue integer Logs this call as "Quick queue" feature usage (for Quick queue integrations that submit a print and one or more queue items in a single click).

Extra settings for next_queue_item

These are honored when next_queue_item is true. You can also pass a full match_criteria object with the same keys as the account's queue matcher to override per-request.

Parameter Type Default Description
analysis_strict boolean true Require a valid G-code analysis on the matched item.
fit_strict boolean true Require the item's print area to fit the printer's bed.
temps_strict boolean true Require the printer to be able to reach the item's slicer temperatures.
filament_strict boolean false Require the item's filament to match the printer's assigned filament.
filament_temps_strict boolean false Require the item's sliced filament temperatures to match the printer's assigned filament.
tags_strict boolean true Require the item's slicer tags (nozzle size, material, etc.) to match the printer's tags.

Response

Field Type Description
status boolean true if at least one print job was started.
message string Error message when status is false, or a partial-success note ("Started some jobs, but...").
files array Started print job objects, one per unique file that was started.
files[].name string Filename the print was started with.
files[].analysis object Parsed G-code analysis. Same shape as Queue items.
files[].printers integer[] Printer ids the job started on.
files[].queued boolean true if this job originated from the print queue.
files[].cost object[] Optional calculated cost lines. May include multiple entries when started on printers with different material assignments.
jobIds integer[] Print job ids created by this call.
staggeredPrinterIds integer[] Printers whose print was staggered (added to PRINT_PENDING rather than starting immediately).
token string Present only when the account is configured to require confirmation; pass this to StartPrint to finalize.
errors string[] Present only when one or more queue items failed to start. Per-item error messages.
matching_errors object[] Present only for next_queue_item when a printer couldn't be matched.
matching_errors[].error string Human-readable reason for the match failure.
matching_errors[].issues array Per-criterion misses (e.g. bed size, temp reach, filament mismatch).
error string Present only on quota-enforcement failures: "quota_exceeded".
quota_failures array Quota reasons that blocked the start (present with error: "quota_exceeded").
balance_insufficient boolean true if the user's credit balance is short of the estimated cost.
can_request_more boolean true if the user can request a balance top-up.
estimated_cost / estimated_material / estimated_print_time numeric Estimated resource usage used by the quota check.

Pause print job

curl https://api.simplyprint.io/{id}/printers/actions/Pause?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

Pause one or more active prints. Each targeted printer must be in the printing state. If a printer has AI failure detection enabled and pauses via AI with a hotend cool-down, you can later resume and the original target temperatures are restored before motion continues.

Required permission OAuth scope
pause printers.actions

Request

POST /{id}/printers/actions/Pause

Query parameters

Parameter Type Required Description
pid integer or integer[] yes The ID(s) of the printer(s) to pause. Comma-separate to pause several at once. Each printer must be in the printing state.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Resume print job

curl https://api.simplyprint.io/{id}/printers/actions/Resume?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

Resume one or more paused prints. Each targeted printer must be in the paused state. When AI paused the print with a hotend cool-down, this endpoint queues the "restore temperatures" G-code before issuing the resume so the head is back at temperature before motion resumes.

Required permission OAuth scope
pause printers.actions

Request

POST /{id}/printers/actions/Resume

Query parameters

Parameter Type Required Description
pid integer or integer[] yes The ID(s) of the printer(s) to resume. Each printer must be in the paused state.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Cancel print job

curl https://api.simplyprint.io/{id}/printers/actions/Cancel?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "reason": 3,
    "comment": "Nozzle clogged",
    "return_to_queue": true,
    "return_position": "top"
  }'

Success response

{
  "status": true,
  "message": null
}

Cancel one or more active prints. Targeted printers must be in the printing, paused, or pausing state. If your account requires a cancel reason or comment, those fields become mandatory; the endpoint rejects the request otherwise.

Required permission Description
cancel Cancel own prints.
cancel_others_prints Required to cancel a print that was started by a different user.
cancel_decide_queue_return Required to override the return-to-queue behavior via return_to_queue / return_position.

Request

POST /{id}/printers/actions/Cancel

Query parameters

Parameter Type Required Description
pid integer or integer[] yes The ID(s) of the printer to cancel. Comma separated. Each must be in printing, paused, or pausing state.

Request body

Field Type Required Description
reason integer conditional Cancel reason id, see Cancel reasons. Required when the account's showCancelReason + requireCancelReason settings are on. Ignored when showCancelReason is off.
comment string conditional Free-text comment (max 500 chars). Required when optionalStopComment + requireComment are on. Ignored when optionalStopComment is off.
return_to_queue boolean no Override the per-account default for returning a cancelled queued print to the print queue. Only honored when cancelShowReturnOption is on and the user has cancel_decide_queue_return.
return_position string no Where to place the returned queue item. One of original, bottom, top, custom. Requires the same permission as return_to_queue.
custom_position integer if return_position is custom 0-based sort position when return_position is custom.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Cancel pending (staggered) print

curl https://api.simplyprint.io/{id}/printers/actions/CancelPendingPrint?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

Cancel a pending print on one or more printers in the staggered-start queue before it actually begins printing. Each targeted printer must currently be in PRINT_PENDING state (see Get pending print status). The pending print job is disassociated from its staggered queue item and the queue item is deleted.

The endpoint returns an error if none of the targeted printers had a cancellable pending print. That happens either because none of them were pending, or because the caller lacks cancel_others_prints for a pending print that someone else started.

Required permission OAuth scope
cancel printers.actions
cancel_others_prints Required to cancel a pending print started by another user.

Request

POST /{id}/printers/actions/CancelPendingPrint

Query parameters

Parameter Type Required Description
pid integer or integer[] yes Printer id(s) whose pending prints should be cancelled. Each must be PRINT_PENDING.

Response

Field Type Description
status boolean true if at least one pending print was cancelled.
message string "No pending prints to cancel" when none of the printers were eligible.

Clear print bed

curl https://api.simplyprint.io/{id}/printers/actions/ClearBed?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "success": true,
    "rating": 4
  }'

Success response

{
  "status": true,
  "message": null
}

Mark a printer's bed as cleared after a finished print. This completes the print job record, optionally writes a success flag and a star rating, and re-arms the printer for the next queue pick. Each targeted printer must be in the operational or offline state.

Required permission OAuth scope
clear_bed printers.actions

Request

POST /{id}/printers/actions/ClearBed

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to clear, comma separated. Each must be in the operational or offline state.

Request body

Field Type Required Description
success boolean no true if the print was successful. Default false.
rating integer no 1-4 star rating for the print. Omit to skip rating.
autoPrintResetClearCount boolean no Reset the AutoPrint "cleared beds" counter for the printer(s). Requires the autoprint_manage permission; silently ignored otherwise.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Skip objects in an active print

curl https://api.simplyprint.io/{id}/printers/actions/SkipObjects?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "object_ids": [2, 5]
  }'

Success response

{
  "status": true,
  "message": null
}

Skip one or more individual objects inside a running print. SimplyPrint reads the object definition block from your G-code, so the printer must have been started from a slicer that emits object metadata (PrusaSlicer, OrcaSlicer, BambuStudio, etc.). Under the hood this either sends a native EXCLUDE_OBJECT / Klipper command or the equivalent firmware-specific G-code.

At least one object must remain active. The endpoint rejects a request that would skip every object.

Required permission OAuth scope
skip_objects printers.actions

Panel web sessions (not API key / OAuth callers) are additionally gated by the panel-printing ACL on the printer.

Request

POST /{id}/printers/actions/SkipObjects

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id to skip objects on. Each must be in printing, paused, pausing, cancelling, or resuming state.

Request body

Field Type Required Description
object_ids array yes Array of object ids (as emitted by the slicer's object block) to skip. Must be non-empty.
object_ids.* any yes Each entry must be a non-empty value (integer id or string label).

Response

Field Type Description
status boolean true if at least one object was skipped.
message string Error message. Common values: "No active print job found", "No objects found in the print job", "Cannot skip all objects...".

Refresh material data

curl https://api.simplyprint.io/{id}/printers/actions/RefreshMaterialData?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

Ask a connected printer to re-read its current filament material data (useful for printers that read material from an RFID tag on the spool, e.g. Bambu AMS, after you've physically swapped a filament but the printer hasn't noticed yet). The endpoint dispatches a refresh_material_data signal to the printer's live connection; the response is a simple acknowledgment.

Required permission
change_filament

Request

POST /{id}/printers/actions/RefreshMaterialData

Query parameters

Parameter Type Required Description
pid integer yes The printer id to refresh material data on. Must belong to the account.

Response

Field Type Description
status boolean True if the request was accepted.
message string Error message if status is false.

Send raw gcode

curl https://api.simplyprint.io/{id}/printers/actions/SendGcode?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "gcode": ["G28 XY"]
  }'

Success response

{
  "status": true,
  "message": null
}

Send ad-hoc G-code, a saved G-code snippet, or a predefined macro to one or more operational printers. At least one of gcode, macro, or snippet_id must be present in the request body; if several are sent, the executor resolves in the order snippet_idgcodemacro.

Required permission OAuth scope
send_raw_gcode printers.actions

POST /{id}/printers/actions/SendGcode

Query parameters

Parameter Type Required Description
pid integer[] yes The ID(s) of the printer(s) to send the gcode to. Must be in the operational state.

Request body

Parameter Type Required Description
gcode string[] conditional Array of G-code commands (1-200 entries, each up to 500 chars). Required if neither macro nor snippet_id is set.
macro string conditional Name of a predefined macro, see the GcodeMacroType enum (e.g. extrude, retract, home, disable_motors). Required if neither gcode nor snippet_id is set.
macro_context object no Optional context variables passed to the macro template.
snippet_id integer conditional ID of a saved G-code snippet (visible to the caller) to run. Required if neither gcode nor macro is set.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Delete / disconnect printer

curl https://api.simplyprint.io/{id}/printers/Delete?pid=1234&just_connection=1 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}
Required permissions
printer_delete
OAuth scope printers.write

This endpoint permanently removes a printer from your account, or disconnects the printer's Raspberry Pi (or other host) without removing the printer record. Use just_connection=1 when you want to move the Pi to a different printer while keeping history, jobs, and settings intact.

Request

GET /{id}/printers/Delete

Parameter Type Required Description
pid integer yes The ID of the printer to delete.
just_connection integer no If set to 1, only the Pi connection will be deleted. Otherwise, the printer will be permanently deleted.
Default: 0

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Prepare 1-Click print

Required permission
print_queue or print
curl https://api.simplyprint.io/{id}/printers/OneClickPrint?pid=1234,1235 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "bedsMustBeCleared": true,
  "autoAddAvailable": false,
  "queueOneclickProcessGroupsFully": false,
  "settings": {
    "match_on_analysis": true,
    "match_on_fit": true,
    "match_on_temps": true,
    "match_on_filament": false,
    "match_on_filament_temps": false
  },
  "autoPrintMatchCriteria": {
    "match_on_analysis": true,
    "match_on_fit": true,
    "match_on_temps": true,
    "match_on_filament": false,
    "match_on_filament_temps": false
  },
  "canEditSettings": true,
  "hasQueue": true,
  "custom_fields": null,
  "queue": [
    {
      "id": 1234,
      "userFileName": "Benchy.gcode",
      "printers": [
        385
      ]
    }
  ]
}

Returns everything the panel's 1-Click print modal needs to let a user start the next queue items on one or more printers: whether the beds must be cleared first, the account's queue match criteria, any custom fields that will be prompted on start, and the next matching queue items for the requested printers.

All requested printers must be in the operational state. Locked or in-maintenance printers are always filtered out of the match. A printer that currently has an active print job is also dropped, unless bedsMustBeCleared is false.

GET /{id}/printers/OneClickPrint?pid=1234,1235

Query parameters

Parameter Type Required Description
pid integer[] yes Printers you want to retrieve 1-Click print data for. Comma separated list.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
bedsMustBeCleared boolean true if beds must be cleared before printing (account setting queueOneclickBedCleared).
autoAddAvailable boolean true if auto-discover printers is available for the next item (account setting).
queueOneclickProcessGroupsFully boolean true if the matcher should finish one group before moving on to the next.
settings object Queue match criteria that gate whether an item is eligible for a given printer.
autoPrintMatchCriteria object Match criteria used by AutoPrint. Same shape as settings.
canEditSettings boolean true if the current user is an admin and can edit the match criteria.
hasQueue boolean true if the account's print queue has at least one item.
custom_fields array or null Custom fields that must be filled in when starting a print from the queue, or null if none.
queue array or null Next queue items that match the requested printers, or null if hasQueue is false.

AutoPrint overview

AutoPrint is SimplyPrint's print-farm automation layer: it handles clearing the bed after each print (via gcode, an integration like FarmLoop / SwapMod / JobOx / 3DQue, or manual confirmation), picks the next queue item that matches the printer, and loops the printer through cycles until it hits a configured cap.

All printers/autoprint/* endpoints below require the Print Farm plan, the autoprint_manage permission, and an API key (OAuth is disabled for every endpoint in this sub-tree).

Settings are resolved in priority order: printer → model → account. A printer with printer_has_settings = false inherits from the model, and a model with model_has_settings = false inherits from the account.

AutoPrint enable / disable

curl https://api.simplyprint.io/{id}/printers/autoprint/SetEnabled?pid=1234,1235 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "on": true
  }'

Success response

{
  "status": true,
  "message": null
}

Toggle AutoPrint on or off for one or more printers. When enabled, the printer begins looping through its AutoPrint configuration after each completed print.

POST /{id}/printers/autoprint/SetEnabled

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to toggle. Comma separated. All must belong to the account.

Request body

Parameter Type Required Description
on boolean yes true to enable AutoPrint, false to disable.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

AutoPrint check state

curl https://api.simplyprint.io/{id}/printers/autoprint/CheckState?pid=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "printers": {
    "23073": {
      "printer": 23073,
      "ready": false,
      "isActionable": false,
      "nextAction": null,
      "issues": [
        "Printer is not online"
      ],
      "blockers": [
        {
          "type": null,
          "severity": null,
          "message": "Printer is not online",
          "data": [],
          "resolution": null
        }
      ],
      "method": {
        "id": "farmloop",
        "variant": null,
        "official": true,
        "integration": {
          "connected": true,
          "id": null,
          "name": null,
          "email": null,
          "avatar": null,
          "accountLabel": null,
          "features": [],
          "extra": {
            "stage": "prelaunch",
            "nextStage": null,
            "betaActive": true,
            "betaDeadline": null
          }
        }
      },
      "state": {
        "blockType": null,
        "awaitingManualClear": false,
        "maxCyclesReached": false,
        "waitingForSystem": false,
        "awaitingMatchingQueueItem": false,
        "awaitingBedCool": false,
        "awaitingSecondsPass": null,
        "awaitingSecondsTotal": null,
        "integration": {
          "connected": true
        }
      },
      "config": {
        "method": "farmloop",
        "requiresConfirmation": true,
        "aiBedCheck": false,
        "clearTimeout": 300,
        "alwaysClear": true
      },
      "nextItem": {
        "id": 430379,
        "filename": "UM3E_calicat.gcode",
        "note": null,
        "printable": true,
        "type": "printable",
        "left": 1,
        "printed": 0,
        "filesystem_id": "40dc8db415fb454492e6796cbc96d4f7",
        "tags": {
          "nozzleData": [
            {
              "size": 0.4,
              "i": 0,
              "nozzleIndex": 0
            }
          ]
        },
        "group": 213,
        "analysis": {
          "v": 12,
          "slicer": "Cura",
          "estimate": 2550,
          "filament": [
            997
          ],
          "temps": {
            "bed": 60,
            "tool": {
              "T0": 205
            },
            "maxTool": 205
          },
          "modelSize": {
            "x": 35.3,
            "y": 42.46,
            "z": 34.6
          }
        },
        "added": "2026-04-13T16:32:44+00:00",
        "sort_order": 7,
        "user": "John Doe",
        "user_id": 1234,
        "custom_fields": [],
        "approval": {
          "status": "approved",
          "approved_by": 1234,
          "approved_by_name": "John Doe",
          "approved_at": "2026-04-13T16:34:01+00:00"
        },
        "quota_warnings": {
          "over_quota": false,
          "insufficient_balance": false
        }
      }
    }
  }
}

Return the live AutoPrint readiness and next-action state for one or more printers. Used by the panel's AutoPrint dashboard to decide which badge to show on each printer tile and what to do next (e.g. "waiting for bed to cool", "awaiting manual clear", "no matching queue item").

GET /{id}/printers/autoprint/CheckState?pid=1234,1235

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to check. Comma separated. Must belong to the account.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
printers object Map of printer id → live AutoPrint state (see fields below).
printers[pid].printer integer Printer id (duplicate of the map key, convenient for iteration).
printers[pid].ready boolean true if AutoPrint could run on this printer right now.
printers[pid].isActionable boolean true if there is a user-actionable next step (e.g. "confirm bed clear").
printers[pid].nextAction string/null Short hint for the next action (e.g. confirm_clear, wait_for_queue), or null.
printers[pid].issues string[] Human-readable issues blocking AutoPrint from running.
printers[pid].blockers object[] Structured blocker list: { type, severity, message, data, resolution }.
printers[pid].method object Active method id/variant and integration connection state (fields below).
printers[pid].method.id string AutoPrint method id (same values as GetMethods[].id).
printers[pid].method.variant string/null Variant id if the method has variations, else null.
printers[pid].method.official boolean true if the method is a first-party SimplyPrint integration.
printers[pid].method.integration object Live per-printer connection state for the method's integration. This is a different block from GetMethods[].integration, which describes the method itself (not a specific printer's connection). Common fields: connected, id, name, email, avatar, accountLabel, features, extra.
printers[pid].state.awaitingBedCool boolean true if AutoPrint is waiting for the bed to cool to bedReleaseTemp.
printers[pid].state.awaitingSecondsPass number/null Seconds remaining on the autoReleaseTime countdown, or null.
printers[pid].state.awaitingSecondsTotal number/null Total seconds in the current countdown, or null.
printers[pid].state.awaitingManualClear boolean true if AutoPrint is waiting for the user to confirm the bed is clear.
printers[pid].state.maxCyclesReached boolean true if maxPrints has been hit and AutoPrint has stopped.
printers[pid].state.waitingForSystem boolean true if SimplyPrint is handling the transition internally.
printers[pid].state.awaitingMatchingQueueItem boolean true if there is no queue item that matches the printer's criteria.
printers[pid].state.integration object Same shape as printers[pid].method.integration; duplicated here for convenience.
printers[pid].config object Snapshot of the effective AutoPrint settings (post inheritance resolution). Fields: method, requiresConfirmation, aiBedCheck, clearTimeout, alwaysClear.
printers[pid].nextItem object/null Next matched queue item formatted for the printer, or null. Same shape as queue items.

AutoPrint get methods

curl https://api.simplyprint.io/{id}/printers/autoprint/GetMethods?pid=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "methods": [
    {
      "id": "farmloop",
      "name": "FarmLoop",
      "description": "Automatic Printing System for Bambu Lab Printers.",
      "logo": "i/static/integrations/farmloop/farmloop-logo.svg",
      "logoFontAwesome": false,
      "category": "gcode",
      "official": true,
      "cycleDepend": false,
      "beta": "Currently in public beta",
      "compatibleModelSlugs": [
        "a1mini",
        "a1"
      ],
      "modelMapping": {
        "622": [
          479,
          573
        ]
      },
      "variations": [
        {
          "id": "a1mini_push_stage2",
          "name": "Bambu Lab A1 Mini - Push Stage 2",
          "description": "Gcode for the Bambu Lab A1 Mini - Push Stage 2"
        }
      ],
      "integration": {
        "provider": "farmloop",
        "purpose": "farmloop",
        "featureKeys": [
          "stage2"
        ],
        "helpdeskId": "1vzumru",
        "canConnect": false,
        "ownership": "company"
      },
      "commercial": {
        "link": "https://3d-farmers.com/",
        "buyLink": null,
        "isAffiliate": false,
        "couponCode": {
          "code": "SIMPLYWIN10",
          "discount": 10
        },
        "affiliatedDisclaimer": "3D Farmers"
      },
      "link": "https://3d-farmers.com/",
      "defaultSettings": {
        "clearTimeout": 300,
        "alwaysClear": true,
        "bedReleaseTemp": 25
      },
      "restriction": {
        "feature": "stage2",
        "defaults": {
          "bedReleaseTemp": 25,
          "autoReleaseTime": 3600
        }
      },
      "variantCard": "farmloop",
      "postProcessor": "farmloop"
    },
    {
      "id": "manual",
      "name": "Manual",
      "description": "AutoPrint will wait for you to manually mark the bed as clear before starting the next print",
      "logo": "fa-person-carry-box",
      "logoFontAwesome": true,
      "category": "manual",
      "official": false,
      "cycleDepend": false,
      "beta": null,
      "compatibleModelSlugs": null,
      "modelMapping": null,
      "variations": []
    }
  ]
}

Return the full catalog of AutoPrint clearing methods: hardware integrations (FarmLoop, SwapMod, JobOx, Loop Mod, 3DQue, AutoClear, Printflow3D, AutoSwap, PlateCycler, 3D-Printomat, Innocube3D SwapMod), built-in methods (manual, api, webhook, custom, belt, pushoff), and their compatibility slugs, variations, default settings, and commercial / affiliate info.

Pass pid to include a per-method compatible flag for that specific printer, plus the printer's currently active activeMethod and activeVariant.

GET /{id}/printers/autoprint/GetMethods

Query parameters

Parameter Type Required Description
pid integer no Printer id to scope compatibility to. Must belong to the account.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
methods array All known AutoPrint methods.
methods[].id string Method id (matches the method value you pass to SaveAutoPrintSettings).
methods[].name string Human-readable name.
methods[].description string Short description shown in the panel.
methods[].logo string Either a CDN path or a Font Awesome class name.
methods[].logoFontAwesome boolean true if logo is a Font Awesome class, false if it's a CDN path.
methods[].category string gcode, manual, or api.
methods[].official boolean true if SimplyPrint runs the integration.
methods[].cycleDepend boolean true if the method can't run on a printer without its hardware kit installed.
methods[].beta string/null Beta notice shown in the panel when non-null.
methods[].compatibleModelSlugs string[]/null Printer model slugs this method works with, or null for "any printer".
methods[].modelMapping object/null Internal mapping from printer model id to linked models, when relevant.
methods[].variations array Per-printer-model variants (e.g. "A1 Mini Push Stage 2").
methods[].integration object Integration metadata. Fields on this block: provider, purpose, featureKeys, helpdeskId, canConnect, ownership. This is a different shape from CheckState's integration block, which tracks live connection state per printer.
methods[].commercial object Affiliate link, coupon code, and disclaimer for paid hardware. Fields: link, buyLink, isAffiliate, couponCode, affiliatedDisclaimer. The same five keys are also flattened onto methods[] itself for convenience.
methods[].defaultSettings object Recommended defaults when this method is selected (e.g. bedReleaseTemp, clearTimeout). Omitted when the method has no recommended defaults.
methods[].restriction object Only present on methods whose policy caps certain fields (e.g. FarmLoop Lite). Shape: {feature, defaults}.
methods[].variantCard string Panel-UI hint for which "variant card" component to render. Informational. Present only on methods that use variants.
methods[].postProcessor string Slicer post-processor id associated with the method, when relevant. Informational.
methods[].compatible boolean Only present when pid was passed. true if the method is compatible with the printer's model.
activeMethod string/null Only present when pid was passed. Id of the method currently active on the printer.
activeVariant string/null Only present when pid was passed. Variant id currently selected.

AutoPrint get settings

curl https://api.simplyprint.io/{id}/printers/autoprint/GetAutoPrintSettings?pid=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "clear_gcode": [
    "M17 R ; restore z current",
    "M106 S0 ; turn off part cooling fan"
  ],
  "on_end_gcode": [
    "M17 R ; restore z current",
    "M106 S255 ; turn on part cooling fan"
  ],
  "inherited_clear_gcode": [
    "M17 R ; restore z current",
    "G1 Z235 F12000"
  ],
  "inherited_on_end_gcode": [
    "M17 R ; restore z current",
    "M106 S255 ; turn on part cooling fan"
  ],
  "printer_settings": null,
  "printer_has_settings": false,
  "model_settings": {
    "bedReleaseTemp": 25,
    "autoReleaseTime": null,
    "maxPrints": null,
    "ackNoGcode": false,
    "method": "farmloop",
    "clearTimeout": 300,
    "aiBedCheck": null,
    "alwaysClear": true,
    "variant": null
  },
  "model_has_settings": true,
  "account_settings": {
    "bedReleaseTemp": 30,
    "autoReleaseTime": null,
    "maxPrints": null,
    "ackNoGcode": false,
    "method": null,
    "clearTimeout": null,
    "aiBedCheck": null,
    "alwaysClear": null,
    "variant": null
  },
  "account_has_settings": true,
  "queue_match_settings": {
    "gcodeAnalysis": false,
    "fit": true,
    "bedType": true,
    "printerTemps": false,
    "filament": true,
    "filamentTemps": true,
    "tags": true,
    "nozzleSize": true,
    "nozzleType": false,
    "nozzleVolume": false,
    "colorMatchLevel": 5,
    "materialType": false,
    "materialTypeStrict": true
  },
  "queue_match_settings_other": {
    "gcodeAnalysis": false,
    "fit": true,
    "bedType": true,
    "printerTemps": false,
    "filament": true,
    "filamentTemps": true,
    "tags": true,
    "nozzleSize": true,
    "nozzleType": false,
    "nozzleVolume": false,
    "colorMatchLevel": 5,
    "materialType": false,
    "materialTypeStrict": true
  },
  "can_macro": true
}

Read the full AutoPrint configuration for a printer, including inherited settings from its model and the account defaults. Also returns the currently-resolved clear and on-end gcode for the printer (with any variable substitutions expanded) plus the inherited versions from the model level.

GET /{id}/printers/autoprint/GetAutoPrintSettings?pid=1234

Query parameters

Parameter Type Required Description
pid integer yes Printer id to read settings for. Must belong to the account.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
clear_gcode string[] Effective clear-bed gcode lines for this printer (post substitution).
on_end_gcode string[] Effective on-end gcode lines for this printer.
inherited_clear_gcode string[] Clear-bed gcode as inherited from the model defaults (before per-printer overrides).
inherited_on_end_gcode string[] On-end gcode as inherited from the model defaults.
printer_settings object/null Per-printer AutoPrint settings, or null if the printer is using model/account defaults.
printer_has_settings boolean true if the printer has its own AutoPrint settings.
model_settings object Resolved AutoPrint settings for the printer's model.
model_has_settings boolean true if the model has its own settings saved (rather than falling back to account defaults).
account_settings object Account-wide AutoPrint defaults.
account_has_settings boolean true if the account has AutoPrint defaults defined.
queue_match_settings object Queue match criteria used by AutoPrint (strict flags per dimension: fit, filament, tags, etc.).
queue_match_settings_other object Queue match criteria used by manual start (for comparison in the panel).
can_macro boolean true if the caller has permission to edit gcode macros on the account.
Settings fields (printer_settings / model_settings / account_settings)
Field Type Description
bedReleaseTemp integer/null Temperature (°C) below which the bed is considered "released" and AutoPrint proceeds.
autoReleaseTime integer/null Seconds to wait after print end before AutoPrint proceeds, regardless of temperature.
maxPrints integer/null Max number of cycles before AutoPrint stops.
ackNoGcode boolean true if the user has acknowledged running a method with no clearing gcode.
method string/null AutoPrint method id (see AutoPrint get methods).
clearTimeout integer/null Seconds to wait before manually falling through to "confirm clear" in hybrid methods.
aiBedCheck boolean/null true if AI failure detection should verify the bed is clear.
alwaysClear boolean/null true if the clear gcode should run every cycle rather than only when needed.
variant string/null Variant id for methods with variations (see variations[] on GetMethods).

AutoPrint save settings

curl https://api.simplyprint.io/{id}/printers/autoprint/SaveAutoPrintSettings?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "useDefault": "0",
    "saveAsDefault": "0",
    "bedReleaseTemp": 30,
    "autoReleaseTime": null,
    "maxPrints": 100,
    "ackNoGcode": true,
    "method": "farmloop",
    "clearTimeout": 300,
    "aiBedCheck": true,
    "alwaysClear": true,
    "variant": "a1mini_push_stage2"
  }'

Success response

{
  "status": true,
  "message": null
}

Save AutoPrint settings for a printer, its model, or the whole account. The useDefault / saveAsDefault flags control which level the write targets:

useDefault saveAsDefault Effect
"org" or "1" ignored Clear the printer's and its model's settings; fall back to account defaults. (Requires account defaults to already exist.)
"model" ignored Clear the printer's settings; fall back to model defaults.
"0" "0" Save as printer-specific settings only.
"0" "org" or "1" Save as account defaults and clear the printer's overrides.
"0" "model" Save as model defaults (scoped to the printer's model) and clear printer overrides.

At least one of bedReleaseTemp or autoReleaseTime must be non-null when useDefault is "0".

If the chosen method has restriction policies (e.g. FarmLoop Lite caps certain fields), they may be echoed back in a top-level restrictions array.

POST /{id}/printers/autoprint/SaveAutoPrintSettings?pid=1234

Query parameters

Parameter Type Required Description
pid integer yes Printer id whose settings (or whose model's) to save.

Request body

Parameter Type Required Description
useDefault string yes "org", "model", "1", or "0". See table above.
saveAsDefault string yes "org", "model", "1", or "0". See table above.
bedReleaseTemp integer/null yes Release temperature in °C (0-999). Nullable, but not both nullable with autoReleaseTime when saving.
autoReleaseTime integer/null yes Release timeout in seconds (0-86400). Nullable.
maxPrints integer/null yes Cycle cap (0-10000). Sending 0 is normalized to null.
ackNoGcode boolean/null yes Has the user acknowledged a no-gcode method.
method string/null yes AutoPrint method id (see GetMethods), or null.
clearTimeout integer/null yes Manual-clear fallback timeout in seconds (0-3600).
aiBedCheck boolean/null yes true to enable AI bed-clear verification.
alwaysClear boolean/null yes true to always run the clear gcode.
variant string/null no Variant id for the selected method (see variations[] on GetMethods). Max 100 chars.

Response

Field Type Description
status boolean true if settings were saved.
message string Error message. Common values: "Must either set bed release temp or auto-release seconds", "Account AutoPrint defaults don't exist - save settings first".
restrictions array Present only when the chosen method's policy clamped one or more fields. Each entry names the field and value.

AutoPrint get gcode templates

curl https://api.simplyprint.io/{id}/printers/autoprint/GetGcodeTemplates?method=loop \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "method": {
    "name": "loop",
    "gcode": {
      "is_autoprint_clear": [
        "; Loop bed-clearing sequence. Source: https://github.com/Pierro55/Loop/tree/main/Instructions",
        "G1 Z190 F1500"
      ],
      "is_autoprint_on_end": null
    }
  }
}

Return the built-in gcode template(s) for AutoPrint clearing methods. Pass method to get just that one method's template; omit it to get the full catalog keyed by method id. Each method has a gcode.is_autoprint_clear (clear-bed lines) and optional gcode.is_autoprint_on_end (on-print-end prep lines).

GET /{id}/printers/autoprint/GetGcodeTemplates

Query parameters

Parameter Type Required Description
method string no Method id to filter to (see id from GetMethods).

Response

When method is passed, the response contains method as a single object. When omitted, the response contains methods as a map keyed by method id.

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
method object Only when method query param is passed. Single-method result.
method.name string Method id (same as what you passed).
method.gcode.is_autoprint_clear string[]/null Clear-bed gcode lines, or null if the method ships without clear gcode.
method.gcode.is_autoprint_on_end string[]/null On-end gcode lines, or null.
methods object Only when method query param is omitted. Map of method id → method object.

AutoPrint set cleared beds amount

curl https://api.simplyprint.io/{id}/printers/autoprint/SetClearedBedsAmount?pid=1234,1235 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "amount": 0
  }'

Success response

{
  "status": true,
  "message": null
}

Directly set the "printed cycles so far" counter for one or more printers. Typically used to reset the counter back to 0 after physically swapping a print bed, or to align the counter with hardware that has been run outside of AutoPrint's knowledge.

POST /{id}/printers/autoprint/SetClearedBedsAmount

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to update. Comma separated.

Request body

Parameter Type Required Description
amount integer yes Cleared-beds counter value to assign. 0-100000.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Set printers out of order

curl https://api.simplyprint.io/{id}/printers/SetOutOfOrder?pid=1234,1235 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "on": true
  }'

Success response

{
  "status": true,
  "message": null
}
Required permission
printer_edit

Toggle the out-of-order flag on one or more printers. Out-of-order printers stay visible in your farm but are excluded from queue assignment and AutoPrint, and they're marked on the panel with a red badge.

Request

POST /{id}/printers/SetOutOfOrder

Query parameters

Parameter Type Required Description
pid integer[] yes The ID(s) of the printer to set out of order. Comma separated list of printer IDs.

Request body

Field Type Required Description
on boolean yes true to mark the printers as out of order, false to bring them back into service.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Get bed types

curl https://api.simplyprint.io/{id}/printers/GetBedTypes \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "bedTypes": [
    {
      "type": "prusa_smooth_sheet",
      "genericBedType": "smooth_pei_plate",
      "fullName": "Prusa Smooth Double-sided PEI Sheet",
      "shortName": "Smooth PEI",
      "brands": [
        "Prusa"
      ],
      "printerModels": null,
      "buyLink": "https://www.prusa3d.com/product/smooth-pei-print-sheet/",
      "coldBed": false,
      "childOf": null,
      "image": "https://cdn.simplyprint.io/i/static/bed-types/prusa_smooth_sheet.png",
      "minTemperature": null,
      "maxTemperature": 100,
      "isOfficialFromBrand": "Prusa",
      "isAftermarket": false,
      "deprecated": false,
      "notes": "Avoid cleaning with acetone. Best suited for PLA and similar materials.",
      "description": "Smooth PEI surface providing excellent adhesion for PLA and other common materials.",
      "gcodeIdentifiers": null,
      "slicing": {
        "orcaslicer": {
          "settingsKey": "curr_bed_type",
          "value": "High Temp Plate",
          "default": true
        },
        "bambustudio": {
          "settingsKey": "curr_bed_type",
          "value": "High Temp Plate",
          "default": true
        }
      }
    },
    {
      "type": "prusa_textured_sheet",
      "genericBedType": "textured_pei_plate",
      "fullName": "Prusa Original Textured PEI Sheet",
      "shortName": "Textured PEI",
      "brands": [
        "Prusa"
      ],
      "printerModels": null,
      "buyLink": "https://www.prusa3d.com/product/textured-powder-coated-steel-sheet/",
      "coldBed": false,
      "childOf": null,
      "image": "https://cdn.simplyprint.io/i/static/bed-types/prusa_textured_sheet.png",
      "minTemperature": null,
      "maxTemperature": 110,
      "isOfficialFromBrand": "Prusa",
      "isAftermarket": false,
      "deprecated": false,
      "notes": "Avoid printing PLA without glue stick to prevent damage to the sheet.",
      "description": "Textured powder-coated PEI sheet for better adhesion with PETG and other materials.",
      "gcodeIdentifiers": null,
      "slicing": {
        "orcaslicer": {
          "settingsKey": "curr_bed_type",
          "value": "Textured PEI Plate",
          "default": false
        },
        "bambustudio": {
          "settingsKey": "curr_bed_type",
          "value": "Textured PEI Plate",
          "default": false
        }
      }
    }
  ]
}

List the bed types available to this account. The response includes SimplyPrint's built-in bed type catalog (filtered by the brands and models the account has printers of, unless all=1 is passed), plus any custom bed types the account has created via the panel. Use the returned type string (or a custom bed type's id) when assigning a bed type tag to a printer.

GET /{id}/printers/GetBedTypes

Query parameters

Parameter Type Required Description
all string no 1 to return the full catalog (skip the brand/model filter).
for_printer integer no Restrict to bed types compatible with this printer id. Must belong to the account.
for_brand string no Restrict to bed types compatible with a given printer brand.
for_models string no Restrict to bed types compatible with the given printer models. Comma-separated list.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
bedTypes array Built-in bed types available to the account (filtered by the params above).
customBedTypes array Account's custom bed types. Only present when the account has at least one defined.

See Create or update custom bed type for how the customBedTypes entries are defined. Each built-in bedTypes entry exposes: type (slug), genericBedType, fullName, shortName, brands, printerModels, image, minTemperature/maxTemperature, and slicer integration mappings.

Get pending print status

curl https://api.simplyprint.io/{id}/printers/GetPendingPrintStatus?pid=1234,1235 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "printers": {
    "385": {
      "received": "2026-04-18T09:42:17Z",
      "queue_position": 2,
      "total_in_queue": 5,
      "downloading_status": "waiting",
      "heating_status": "waiting",
      "is_scheduled": false,
      "scheduled_for": null,
      "staggered_group": {
        "id": 1,
        "name": "Default staggered group",
        "has_multiple_groups": false,
        "max_heating_at_once": 2,
        "max_downloading_at_once": 2,
        "currently_heating": 1,
        "currently_downloading": 0
      },
      "ready_for_download": true,
      "ready_for_heating": false
    }
  }
}
Required permission
printer_info

Return the staggered-start state for printers that are currently in the PRINT_PENDING state. A "pending print" is a print that has been started but is waiting in the staggered-start queue for its turn to download the file and start heating. SimplyPrint uses this to avoid hammering the network or popping the fuse by heating several beds at once. Printers that are not currently pending are silently excluded from the response.

GET /{id}/printers/GetPendingPrintStatus?pid=1234,1235

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to check. Must all belong to the account. Comma separated.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
printers object Map of printer id → pending-print status. Printers not in PRINT_PENDING are omitted.
printers[pid].received string ISO-8601 UTC timestamp when the status snapshot was produced.
printers[pid].queue_position integer 1-based position of this print in its staggered-start queue.
printers[pid].total_in_queue integer Total number of pending prints in the same staggered group.
printers[pid].downloading_status string Staggered download state (e.g. waiting, downloading, done).
printers[pid].heating_status string Staggered heating state.
printers[pid].is_scheduled boolean true if the print is a scheduled future print.
printers[pid].scheduled_for string/null ISO-8601 UTC scheduled start time, or null when not scheduled.
printers[pid].staggered_group object The staggered group the print is queued in.
printers[pid].staggered_group.id integer Staggered group id.
printers[pid].staggered_group.name string Staggered group display name.
printers[pid].staggered_group.has_multiple_groups boolean true if the account has more than one staggered group.
printers[pid].staggered_group.max_heating_at_once integer Concurrent-heating cap for the group.
printers[pid].staggered_group.max_downloading_at_once integer Concurrent-download cap for the group.
printers[pid].staggered_group.currently_heating integer Number of prints currently heating in the group.
printers[pid].staggered_group.currently_downloading integer Number of prints currently downloading in the group.
printers[pid].ready_for_download boolean true if this print is next in line to download.
printers[pid].ready_for_heating boolean true if this print is next in line to start heating.

Save multi-material (MMS) settings

curl https://api.simplyprint.io/{id}/printers/settings/SaveMMS?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "nozzle": 0,
    "mmss": [
      {"mms": "bambu_ams", "chains": 1},
      {"mms": "bambu_ams_lite"}
    ]
  }'

Success response

{
  "status": true,
  "message": null
}

Configure which multi-material system(s) a printer's nozzle is wired up to. SimplyPrint uses this to know how many filament slots a printer really has, how to chain feeders, and which slicer presets are compatible.

Two request shapes are supported:

  1. New (recommended): pass mmss as an array of MMS entries for the given nozzle (for multi-nozzle printers, send one request per nozzle with nozzle set to the nozzle index).
  2. Legacy: pass mms (and optionally chains) to apply the same MMS to every nozzle. Send "mms": null to clear the MMS on every nozzle.
Required permission
printer_edit

Request

POST /{id}/printers/settings/SaveMMS?pid=1234

Query parameters

Parameter Type Required Description
pid integer yes Printer id to update. Must belong to the account.

Request body (new format)

Field Type Required Description
nozzle integer no Nozzle index to configure (0-256). Default 0. Must be a valid nozzle on the printer.
mmss array yes One entry per MMS attached to the nozzle. Send multiple entries to describe a chain of MMS units.
mmss[].mms string yes MMS type, one of the Multi-material solution values below.
mmss[].chains integer no Number of chained units. Omit for the MMS type's native chain behavior. Only meaningful for MMS types that support chaining (Prusa MMU, 3D Chameleon, etc.).
mmss[].size integer no Slot count override (0-256). Use when an MMS supports variable slot counts; otherwise the default size for the type is used.

Request body (legacy format)

Use one of the two shapes, not both.

Field Type Required Description
mms string or null yes MMS type (see values below). Pass null to clear the MMS on every nozzle on the printer.
chains integer no Number of chained units. Omit for the MMS type's native chain behavior.

Multi-material solution values

Pass one of these strings for mms or mmss[].mms:

Value MMS
bambu_ams Bambu AMS (original)
bambu_ams_2_pro Bambu AMS 2 Pro
bambu_ams_ht Bambu AMS HT
bambu_ams_lite Bambu AMS Lite
prusa_mmu3 Prusa MMU3
prusa_mmu2 Prusa MMU2
prusa_mmu1 Prusa MMU1
3d_chameleon 3DChameleon
mosaic_palette2s Mosaic Palette 2S
mosaic_palette2 Mosaic Palette 2
boxturtle BoxTurtle
creality_cfs Creality CFS
anycubic_ace_pro Anycubic ACE Pro
custom Custom / unlisted MMS
virtual Virtual (software-only) MMS

Response

Field Type Description
status boolean true if the printer's MMS layout was updated.
message string Error message. Common values: "Invalid nozzle index", "No MMS data provided".

Save start option defaults

curl https://api.simplyprint.io/{id}/printers/settings/SaveStartOptionDefaults \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "autoprint": false,
    "start_options": {
      "91": {"heatSoak": true, "levelBed": true},
      "42": null
    }
  }'

Success response

{
  "status": true,
  "message": null
}

Save account-wide default start options per printer model. These defaults auto-fill the start-print dialog for every user on the account, so admins can enforce consistent pre-print behavior (heat soak, bed levelling, probe, etc.) without each operator having to pick the right flags every time.

Required permission
printer_edit

Request

POST /{id}/printers/settings/SaveStartOptionDefaults

Request body

Field Type Required Description
start_options object yes Map of printer model id → start-options payload. Pass null as a value to delete that model's defaults. Must be non-empty.
autoprint boolean no true to save as AutoPrint defaults; false (default) for manual start defaults.

Response

Field Type Description
status boolean true if the defaults were saved.
message string Error message. Common values: "No start options provided", "Invalid start options".

AI failure detection overview

SimplyPrint's AI failure detection watches a printer's webcam feed and fires rules when it thinks a print is failing. Each rule combines a trigger (what the AI recognizes: spaghetti, warping, blobbing, or any defect) with a sensitivity (how confident the AI needs to be), an action (notify, pause, or cancel), and a per-pause cleanup sub-action block (retract filament, lift extruder, cool hotend / bed).

The AI endpoints operate on a priority chain: printer settings → account settings → SimplyPrint default. A printer with settings = null inherits the account settings.

AI get settings

curl https://api.simplyprint.io/{id}/printers/ai/GetSettings?pid=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "settings": null,
  "company_settings": {
    "rules": [
      {
        "trigger": "any",
        "sensitivity": "medium",
        "action": {
          "onPause": {
            "coolHotend": false,
            "coolBed": false,
            "retractFilament": {
              "enabled": false,
              "distance": 10
            },
            "liftExtruder": {
              "enabled": false,
              "distance": 10
            }
          },
          "notification": true,
          "printAction": null
        }
      }
    ],
    "regions": [],
    "thresholds": {
      "notification": 0.3,
      "action": 0.5
    },
    "modelName": "amnet_v8"
  }
}

Return both the printer-level AI settings (settings) and the account-level defaults (company_settings). A printer that hasn't customized its AI config returns settings: null; the AI will then use company_settings at runtime.

GET /{id}/printers/ai/GetSettings?pid=1234

Query parameters

Parameter Type Required Description
pid integer yes Printer id. Must belong to the account.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
settings object/null Printer-level AI settings, or null if the printer inherits from the account.
settings.rules array AI rules (see AI rule shape below).
settings.regions array Camera regions the AI is scoped to. Empty array means "whole frame".
settings.thresholds object Confidence thresholds. notification fires the alert; action fires the pause/cancel.
settings.thresholds.notification number 0-1 inclusive. AI confidence required before a notification fires.
settings.thresholds.action number 0-1 inclusive. AI confidence required before a pause / cancel fires.
settings.modelName string Model version in use (e.g. amnet_v8). Informational.
company_settings object/null Account-level AI settings, same shape as settings. May be null for brand-new accounts.

AI rule shape

Field Type Description
trigger string What the AI should react to. One of any, spaghetti, warping, blobbing.
sensitivity string One of low, medium, high, veryHigh.
action.notification boolean true to send a push/email notification when the rule fires.
action.printAction string/null cancel or pause to act on the print, or null for notify-only.
action.onPause object Cleanup actions to perform on pause (ignored when printAction != "pause").
action.onPause.coolHotend boolean Drop the hotend to 0 on pause.
action.onPause.coolBed boolean Drop the bed to 0 on pause.
action.onPause.retractFilament.enabled boolean Retract filament on pause.
action.onPause.retractFilament.distance integer Retraction distance in mm.
action.onPause.liftExtruder.enabled boolean Lift the extruder off the print on pause.
action.onPause.liftExtruder.distance integer Lift distance in mm.

AI save settings

curl https://api.simplyprint.io/{id}/printers/ai/SaveSettings?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "thresholds": {"notification": 0.3, "action": 0.5},
    "rules": [
      {
        "trigger": "any",
        "sensitivity": "medium",
        "action": {
          "notification": true,
          "printAction": "pause",
          "onPause": {
            "coolHotend": true,
            "coolBed": false,
            "retractFilament": {"enabled": true, "distance": 10},
            "liftExtruder": {"enabled": true, "distance": 10}
          }
        }
      }
    ]
  }'

Success response

{
  "status": true,
  "message": null,
  "printer_ai_settings": {
    "rules": [
      {
        "trigger": "any",
        "sensitivity": "medium",
        "action": {
          "onPause": {
            "coolHotend": true,
            "coolBed": false,
            "retractFilament": {
              "enabled": true,
              "distance": 10
            },
            "liftExtruder": {
              "enabled": true,
              "distance": 10
            }
          },
          "notification": true,
          "printAction": "pause"
        }
      }
    ],
    "regions": [],
    "thresholds": {
      "notification": 0.3,
      "action": 0.5
    }
  }
}

Overwrite the AI rules and confidence thresholds for a specific printer. Pass rules: null to clear the printer's override and fall back to the account defaults.

Every rule must have action.notification: true or an action.printAction set; a rule that does neither is rejected with "Either notification or printAction must be enabled".

Accounts without the CAM_AI_PRINT_ACTIONS feature are restricted in two different ways:

  1. Attempting to disable notifications (notification: false) on any rule hard-fails the whole request with "You don't have access to disable notifications".
  2. Attempting to override printAction succeeds but is silently reverted on a per-rule basis to the previously-saved printAction. New rules fall back to the default rule's printAction.
Required permission
ai_printer_settings

Request

POST /{id}/printers/ai/SaveSettings?pid=1234

Query parameters

Parameter Type Required Description
pid integer yes Printer id. Must belong to the account.

Request body

Field Type Required Description
rules array/null no AI rules to save. Pass null or omit to clear per-printer rules. Max 20 entries. See AI rule shape.
thresholds object/null no Confidence thresholds: {notification, action}, each 0-1.

Response

Field Type Description
status boolean true if the settings were saved.
message string Error message. Common values: "Either notification or printAction must be enabled", "You don't have access to disable notifications".
printer_ai_settings object The saved settings echoed back (same shape as settings in AI get settings).

AI enable / disable

curl https://api.simplyprint.io/{id}/printers/ai/SetEnabled?pid=1234,1235 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "on": true
  }'

Success response

{
  "status": true,
  "message": null,
  "consent": false
}

License shortage response

{
  "status": false,
  "message": "No more AI camera detection licenses available.",
  "total": 3,
  "consumed": 3,
  "remaining": 0
}

Toggle AI failure detection on or off for one or more printers. Enabling AI on a printer consumes one AI_CAMERA_DETECTION addon seat from the account's pool; enabling more printers than the account has seats for returns a 200 response with status: false and the license counters shown above, so integrators can surface a friendly "buy more" prompt.

The consent field mirrors the account's aiDataSharingConsent flag (whether the account has opted in to letting SimplyPrint use frames for training); relevant when a first-time enable needs a consent prompt.

Required permission
ai_printer_toggle

Request

POST /{id}/printers/ai/SetEnabled

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to toggle. Comma separated.

Request body

Parameter Type Required Description
on boolean yes true to enable AI detection, false to disable it.

Response

Field Type Description
status boolean true if the toggle succeeded for the requested printers.
message string Error message if status is false (e.g. "No more AI camera detection licenses available.").
consent boolean Whether the account has opted in to AI data-sharing.
total integer Only on license shortage: total AI seats available.
consumed integer Only on license shortage: seats currently consumed.
remaining integer Only on license shortage: unused seats left.

Printer notifications overview

Printer notifications are event-driven warnings or info banners tied to a specific printer (e.g. an HMS warning from a Bambu Lab cloud link, a firmware update prompt, a filament runout message, or a vendor-specific alert). Each open notification has an id (row id) and an optional eventId (stable UUID if the notification was issued by a system that deduplicates across restarts).

Notifications can also carry actions: a set of named buttons surfaced in the panel (e.g. retry / ignore). Resolving a notification with an action fires the matching side effect on the printer; resolving without an action simply marks the row as done.

issuedBy and resolvedBy use the PrinterNotificationEventActor enum: 0 = system, 1 = printer, 2 = user, 3 = event (resolved as a side-effect of another event resolving). In the HMS example below the value 1 means the notification was raised by the printer itself.

Get printer notifications

curl https://api.simplyprint.io/{id}/printers/notification/Get?pid=1234,1235 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "printers": {
    "20519": [
      {
        "id": 712690,
        "eventId": "bc7ae811-97db-4110-b45f-d04767d16059",
        "type": "generic",
        "severity": 1,
        "payload": {
          "url": "https://e.bambulab.com/index.php?e=0700200000030002&s=device_hms&lang=en",
          "data": {
            "code": "0700200000030002"
          },
          "title": "HMS",
          "message": "AMS A Slot 1 filament has run out and automatically switched to the slot with the same filament."
        },
        "issuedBy": 1,
        "issuedAt": 1774188589,
        "resolvedBy": null,
        "resolvedAt": null
      },
      {
        "id": 714514,
        "eventId": "a53c9d34-ce08-4e54-b1cc-5a9274773905",
        "type": "generic",
        "severity": 1,
        "payload": {
          "url": "https://e.bambulab.com/index.php?e=0700210000030002&s=device_hms&lang=en",
          "data": {
            "code": "0700210000030002"
          },
          "title": "HMS",
          "message": "AMS A Slot 2 filament has run out and automatically switched to the slot with the same filament."
        },
        "issuedBy": 1,
        "issuedAt": 1774228437,
        "resolvedBy": null,
        "resolvedAt": null
      }
    ]
  }
}

List open (unresolved) notifications for one or more printers. Returns a map keyed by printer id. A printer with no open notifications returns an empty array ("385": []).

GET /{id}/printers/notification/Get?pid=1234,1235

Query parameters

Parameter Type Required Description
pid integer[] yes Printer id(s) to fetch notifications for. Comma separated.

Response

Field Type Description
status boolean true if the request was successful.
message string Error message if status is false.
printers object Map of printer id to array of notifications.
printers[pid][].id integer Row id. Pass this back to Resolve to close the notification.
printers[pid][].eventId string/null Optional deduplication uuid. Present when the issuing system emits stable event ids.
printers[pid][].type string Notification type (e.g. generic, vendor-specific types like bambu_hms, prusa_error).
printers[pid][].severity integer 0 = info, 1 = warning, 2 = error (vendor-dependent).
printers[pid][].payload object Notification content (fields below). Null-valued fields are stripped on serialization.
printers[pid][].payload.title string/null Short human-readable title. Max 255 chars.
printers[pid][].payload.message string/null Full message body. Max 1024 chars.
printers[pid][].payload.url string/null Optional URL to more info (e.g. the vendor's HMS lookup). Max 255 chars.
printers[pid][].payload.image_url string/null Optional image URL to render in the notification banner. Max 255 chars.
printers[pid][].payload.effect string/null Tagged side effect this notification had on the printer. One of pause, cancel, block_autoprint, or null.
printers[pid][].payload.data object/null Raw event data (vendor-specific shape, e.g. {code} for HMS codes).
printers[pid][].payload.actions object/null Map of action id to action metadata. Each action currently has {type: "button", label} (see ButtonPrinterNotificationEventActionData). Present when the notification has actionable buttons.
printers[pid][].payload.metadata object/null Server-side state attached to the event (e.g. {dismissed: true} after a dismiss call).
printers[pid][].issuedBy integer Actor enum that raised the notification: 0 = system, 1 = printer, 2 = user, 3 = event.
printers[pid][].issuedAt integer Unix timestamp when the notification was raised.
printers[pid][].resolvedBy integer/null Resolved-by actor enum (same encoding as issuedBy), or null for open notifications.
printers[pid][].resolvedAt integer/null Unix timestamp when resolved, or null.

Resolve printer notifications

curl https://api.simplyprint.io/{id}/printers/notification/Resolve?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "notifications": [
      {"id": 712690},
      {"id": "bc7ae811-97db-4110-b45f-d04767d16059", "action": "retry"},
      {"id": 714514, "dismiss": true}
    ]
  }'

Success response

{
  "status": true,
  "message": null
}

Resolve one or more open notifications on a specific printer. Each entry in notifications[] must reference an open notification on the target printer by either its numeric id or its eventId (string UUID). All entries must resolve to open notifications. If any id is missing or already resolved the endpoint fails without mutating anything.

Notifications with multiple actions require you to pick one with action or pass force: true to resolve anyway; sending a resolve without either is rejected to avoid ambiguous state.

POST /{id}/printers/notification/Resolve?pid=1234

Query parameters

Parameter Type Required Description
pid integer yes Printer id the notifications belong to.

Request body

Field Type Required Description
notifications array yes Notifications to resolve.
notifications[].id integer or string yes Row id (integer) or eventId (uuid string).
notifications[].action string no Action id from payload.actions. Fires the action's side effect on the printer before resolving.
notifications[].force boolean no true to resolve ambiguous (multi-action) notifications without picking an action.
notifications[].dismiss boolean no true to mark the notification as dismissed rather than resolved. Sets payload.metadata.dismissed = true without closing the row.

Response

Field Type Description
status boolean true if every referenced notification was resolved/dismissed.
message string Error message. Common values: "Notification event(s) not found", "Invalid action X for event Y", "Multiple actions available for event Y, use force to resolve anyway".

Resolve all printer notifications

curl https://api.simplyprint.io/{id}/printers/notification/ResolveAll?group=99 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

Bulk-resolve every open notification on a set of printers. With no query param it targets every printer on the account; with group it targets only printers in that printer group. All resolved rows get force: true and no action. Use this when an operator wants to clear the panel's red badges after walking the farm.

GET /{id}/printers/notification/ResolveAll

Query parameters

Parameter Type Required Description
group integer no Printer group id to scope the clear to. Omit to clear across every printer on the account.

Response

Field Type Description
status boolean true if the bulk resolve completed. Still true when nothing needed resolving.
message string Error message (e.g. "Group doesn't exist or doesn't belong to you", returns HTTP 404).

Cancel reasons

ID Description
1 Print failed
2 Regretted print
3 No filament extruded / nozzle clog
4 Fell of the plate
5 Not enough filament
6 Other

Filament

List Filaments

curl https://api.simplyprint.io/{id}/filament/GetFilament \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "showid": true,
  "is_kg": false,
  "brands": {
    "test brand": 1,
    ...
  },
  "types": {
    "PLA": 1,
    ...
  },
  "filament": {
    "3017": {
      "id": 3017,
      "uid": "PL23",
      "type": {
        "id": 5637,
        "name": "PLA"
      },
      "brand": "test brand",
      "colorName": "test color",
      "colorHex": "#000000",
      "dia": 1.75,
      "note": null,
      "productionId": null,
      "batchId": null,
      "cost": 23.5,
      "qrId": null,
      "nfcId": null,
      "recyclable": false,
      "total": 335284,
      "left": 234699,
      "nozzle": 0,
      "extruder": 0,
      "bought": "2024-06-28T22:00:00+00:00",
      "firstUsedDate": null,
      "lastDriedDate": null,
      "created": 1630508337,
      "printer": 0,
      "nfc": 0,
      "qr": 0,
      "prodId": ""
    },
    ...
  }
}

This endpoint returns a list of all filaments as well as filament types and brands.

Note: Material information like density is not included in individual filament records in this endpoint's response. To get material information like density for filament types, use the Get Filament Types endpoint instead.

Request

GET /{id}/filament/GetFilament

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
showid boolean Whether to show filament id. (Frontend data)
is_kg boolean Whether to show filament in kg. (Frontend data)
brands object Filament brands.
brands.{brand} integer Number of filaments with {brand}.
types object Filament types such as PLA, ABS, PETG, etc.
types.{type} integer Number of filaments with {type}.
filament object Filament data where each key is a filament id.
filament.{id} object Filament data.
filament.{id}.id integer Filament id. (same as {id})
filament.{id}.uid string Four character code that is used to identify the filament. Refered to as filament id in the frontend.
filament.{id}.type object Filament type.
filament.{id}.type.id integer Filament type id.
filament.{id}.type.name string Filament type name.
filament.{id}.brand string Filament brand.
filament.{id}.colorName string Filament color name.
filament.{id}.colorHex string Filament color hex code.
filament.{id}.dia float Filament diameter.
filament.{id}.note string Custom note about the filament (null if empty).
filament.{id}.productionId string Production ID (null if empty).
filament.{id}.batchId string Batch ID (null if empty).
filament.{id}.cost float Cost of the filament.
filament.{id}.qrId string QR code ID (null if empty).
filament.{id}.nfcId string NFC ID (null if empty).
filament.{id}.recyclable boolean Whether the filament is recyclable.
filament.{id}.total integer Total filament length in mm.
filament.{id}.left integer Left filament length in mm.
filament.{id}.nozzle integer Which nozzle the filament is assigned to.
filament.{id}.extruder integer Which extruder the filament is assigned to.
filament.{id}.bought string ISO 8601 date string of when the filament was bought (null if not set).
filament.{id}.firstUsedDate integer Timestamp of when the filament was first used (null if not set).
filament.{id}.lastDriedDate integer Timestamp of when the filament was last dried (null if not set).
filament.{id}.created integer Timestamp of when the filament was created.
filament.{id}.printer integer Which printer the filament is assigned to (0 if not assigned).
filament.{id}.nfc integer Whether the filament has NFC (1 if yes, 0 if no).
filament.{id}.qr integer Whether the filament has QR (1 if yes, 0 if no).
filament.{id}.prodId string Filament product ID (same as productionId, kept for backwards compatibility).

Create or Update Existing Filament

curl https://api.simplyprint.io/{id}/filament/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"color_name": "Porcelain White", "color_hex": "#E5E5E5", "width": 1.75, "density": 1.24, "bought_at": "2022-12-24", "filament_type": "rPLA", "cost": 23, "brand": "lostboyslab", "slicing_settings": {"nozzle_temp": 200, "bed_temp": 60, "print_speed": 70}, "amount": 1, "total_length_type": "kg", "total_length": 1}'

Success response

{
  "status": true,
  "message": null,
  "filament_ids": [
    "NGGY"
  ],
  "qr_gen": 1
}

This endpoint can be used to create or update existing filament.

To update existing filament, you need to provide a fid query parameter, which is the filament id of the filament you want to update.

Required permissions
create_filament

Request

POST /{id}/filament/Create

Query Parameters

Parameter Type Required Description
fid string no Filament id of the filament you want to update.

Request Body

Parameter Type Required Description
color_name string yes Filament color name.
Max 64 characters
color_hex string yes Filament color hex code.
color_standard string no Filament color standard.
width float (enum) yes Filament width.
Value has to be one of [1.75, 2.85, 3.00]
density float yes Filament density.
bought_at string no Date of purchase.
Format: YYYY-MM-DD
filament_type string yes Filament type.
cost float no Cost of filament in your account-defined currency (changed in account settings).
custom_note string no Custom note.
Max 1000 characters
prod_id string no Filament product id.
brand string yes Filament brand.
brand_id integer no Filament brand id.
filgroup_id integer no Target SimplyPrint filament group id to insert filament into.
spool_id integer no Filament spool id.
slicing_settings object yes Slicing settings.
slicing_settings.nozzle_temp integer yes Nozzle temperature.
slicing_settings.nozzle_fl_temp integer yes Nozzle first layer temperature.
slicing_settings.bed_temp integer yes Bed temperature.
slicing_settings.bed_fl_temp integer yes Bed first layer temperature.
slicing_settings.print_speed integer yes Print speed.
slicing_settings.finish_rate float yes Finish rate.
slicing_settings.min_speed integer yes Minimum speed.
amount integer yes Amount of filament.
total_length_type string yes Total length type.
left_length_type string yes Left length type.
total_length float yes Total length.
length_used float yes Length used.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
filament_ids array Array of filament ids.
qr_gen integer Used for frontend, not important.

Delete Filament

curl https://api.simplyprint.io/{id}/filament/Delete?fid=4519 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

This endpoint deletes a filament specified by the fid parameter.

Required permissions
create_filament

Request

GET /{id}/filament/Delete

Parameter Type Required Description
fid integer yes Filament id

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Assign Filament(s) To Printer

curl https://api.simplyprint.io/{id}/filament/Assign?pid=5123&fid=21812,31253 \
  -X POST \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"extruder": {"21812": 0, "31253": 1}}'

Success response

{
  "status": true,
  "message": null
}

This endpoint assigns filament(s) to a printer.

Required permissions
change_filament

Request

POST /{id}/filament/Assign

The request has both query parameters and a request body.

Query parameters

Parameter Type Required Description
pid integer yes Printer id.
fid integer yes Filament id(s), comma separated.

Request body

Parameter Type Required Description
extruder object yes Which filament to assign to which extruder.
extruder.{fid} integer yes Which extruder id to assign {fid} to.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Unassign Filament From Printer

curl https://api.simplyprint.io/{id}/filament/Unassign?fid=21812 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

This endpoint unassigns a filament from a printer by filament id.

Required permissions
change_filament

Request

POST /{id}/filament/Unassign

Parameter Type Required Description
fid integer yes Filament id to unassign.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Get Filament Types

curl https://api.simplyprint.io/{id}/filament/type/Get \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 53970,
      "org_id": 2,
      "temps": {
        "nozzle": 250,
        "bed": 80,
        "margins": {
          "nozzle": 20,
          "bed": 20
        }
      },
      "profile_name": "PA-CF Carbonfiber nylon",
      "sort_order": 44,
      "material_type_name": "PA-CF",
      "generic": 0,
      "brand": {
        "id": 3,
        "name": "AzureFilm",
        "filament": {
          "id": 5,
          "name": "PA-CF Carbonfiber nylon"
        }
      },
      "density": 1.08,
      "deleted": 0,
      "cost": 24626,
      "filament_db_keep_updated": true,
      "DEPRECATION": "The following fields are deprecated and will be removed in the future: slicing, nozzle_temp, bed_temp, allowed_nozzle_temp_margin, allowed_bed_temp_margin, priority, filament_type_name, print_speed, finish_rate_factor, min_speed",
      "width": 1.75,
      "nozzle_temp": 250,
      "bed_temp": 80,
      "allowed_nozzle_temp_margin": 20,
      "allowed_bed_temp_margin": 20,
      "priority": 44,
      "filament_type_name": "PA-CF Carbonfiber nylon",
      "print_speed": 0,
      "finish_rate_factor": 1,
      "min_speed": 0,
      "slicing": {
        "printSpeed": 0,
        "finishRateFactor": 1,
        "minSpeed": 0
      }
    }
  ]
}

This endpoint returns a list of filament types available, including material information like density for each type.

Required permissions
see_filament_tab

Request

GET /{id}/filament/type/Get

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array Array of filament type objects.
data[].id integer Filament type ID.
data[].org_id integer Organization ID.
data[].temps object Temperature settings object.
data[].temps.nozzle integer Nozzle temperature in Celsius.
data[].temps.bed integer Bed temperature in Celsius.
data[].temps.margins object Temperature margin settings.
data[].temps.margins.nozzle integer Allowed nozzle temperature margin.
data[].temps.margins.bed integer Allowed bed temperature margin.
data[].profile_name string Profile name for the filament type.
data[].sort_order integer Sort order/priority for the filament type.
data[].material_type_name string Material type name (e.g., "PA-CF").
data[].generic integer Whether this is a generic filament type (0 = false, 1 = true).
data[].brand object Brand information object.
data[].brand.id integer Brand ID.
data[].brand.name string Brand name.
data[].brand.filament object Brand's filament information.
data[].brand.filament.id integer Brand's filament ID.
data[].brand.filament.name string Brand's filament name.
data[].density float Filament density in g/cm³.
data[].deleted integer Whether the filament type is deleted (0 = active, 1 = deleted).
data[].cost integer Cost of the filament type.
data[].filament_db_keep_updated boolean Whether to keep the filament database updated.
data[].DEPRECATION string Deprecation notice for legacy fields.
data[].width float Filament width/diameter in mm.
data[].nozzle_temp (deprecated) integer Deprecated - Use temps.nozzle instead.
data[].bed_temp (deprecated) integer Deprecated - Use temps.bed instead.
data[].allowed_nozzle_temp_margin (deprecated) integer Deprecated - Use temps.margins.nozzle instead.
data[].allowed_bed_temp_margin (deprecated) integer Deprecated - Use temps.margins.bed instead.
data[].priority (deprecated) integer Deprecated - Use sort_order instead.
data[].filament_type_name (deprecated) string Deprecated - Use profile_name instead.
data[].print_speed (deprecated) integer Deprecated - Use slicing.printSpeed instead.
data[].finish_rate_factor (deprecated) float Deprecated - Use slicing.finishRateFactor instead.
data[].min_speed (deprecated) integer Deprecated - Use slicing.minSpeed instead.
data[].slicing (deprecated) object Deprecated - Slicing settings object.
data[].slicing.printSpeed (deprecated) integer Deprecated - Print speed setting.
data[].slicing.finishRateFactor (deprecated) float Deprecated - Finish rate factor.
data[].slicing.minSpeed (deprecated) integer Deprecated - Minimum speed setting.

Print Jobs

Get print jobs

curl https://api.simplyprint.io/{id}/jobs/GetPaginatedPrintJobs \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "page": 1,
    "page_size": 10,
    "printer_ids": [
      385
    ],
    "status": [
      "cancelled",
      "finished"
    ],
    "start_date": "2023-02-28"
  }'

Success response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 549145,
      "uid": "7df103aa-b12c-4b33-8305-b55f91c11a4d",
      "status": "cancelled",
      "cancelReasonType": "5",
      "rating": -2,
      "filename": "Benchy.gcode",
      "startDate": "2023-02-28T21:05:50+00:00",
      "endDate": "2023-02-28T21:06:07+00:00",
      "user": 5933,
      "autoprint": false,
      "outsideSystem": false,
      "printer": 385,
      "filament": "{\"e0\": {\"usage\": 60}}",
      "filUsage": 60,
      "filUsageGram": 0,
      "currentPercentage": 48,
      "printTime": 17,
      "cost": {
        "estimate": false,
        "total_cost": 150,
        "lines": [
          {
            "id": 1,
            "label": "Material usage (account default)",
            "cost": 0.02
          },
          {
            "id": 2,
            "label": "Material markup",
            "cost": null
          },
          {
            "id": 3,
            "label": "Machine run time cost",
            "cost": null
          },
          {
            "id": 4,
            "label": "Energy cost",
            "cost": null
          },
          {
            "id": 5,
            "label": "Labor cost",
            "cost": 1000
          }
        ]
      },
      "queueItem": {
        "id": 1234,
        "user": 51,
        "queueNum": 3
      },
      "customFields": [
        {
          "id": "student_id",
          "value": {
            "string": "1234567890"
          }
        }
      ]
    },
    ...
  ],
  "page_amount": 1
}

Get paginated data about ongoing or finished print jobs.

Request

POST /{id}/jobs/GetPaginatedPrintJobs

Parameter Type Required Description
page integer yes The page number to get.
page_size integer yes The number of items per page. (Between 1 and 100)
printer_types[] integer[] no Array of printer type ids to filter on.
printer_ids[] integer[] no Array of printer ids to filter on.
user_ids[] integer[] no Array of user ids to filter on.
accepted_statuses[] string[] no Array of job statuses to filter on. One of ongoing, cancelled, failed, finished.
start_date string no The start date to filter on. In unix timestamp format. Can be set without end_date.
end_date string no The end date to filter on. In unix timestamp format. Can be set without start_date.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array The jobs.
data[].id integer The job id.
data[].uid string The job uid.
data[].status string The job status. One of ongoing, cancelled, failed, done. Note that done is the same as finished
data[].cancelReasonType string The job cancel reason type.
data[].rating integer The job rating.
data[].filename string The job filename. n
data[].startDate string The job start date.
data[].endDate string/null The job end date. Is null if the job is ongoing.
data[].user integer/null The user id of the user who started the job.
data[].autoprint boolean If the job was started automatically using the Auto-print feature
data[].outsideSystem boolean If the job was started outside SimplyPrint, via SD card, OctoPrint, Mailsail, Fluidd or else how
data[].printer integer The printer id that was used to print the job.
data[].filament string The filament usage. JSON encoded string with usage per extruder.
data[].filUsage integer The filament usage in mm.
data[].filUsageGram integer The filament usage in grams.
data[].currentPercentage integer The current percentage of the job.
data[].cost object/null Potential calculated cost of job.
data[].queueItem object/null The queue item that was used to start the job. Please note that this is only shown if you have access to view the Print Queue.
data[].queueItem.id integer The id of the queue item that was used to start the job.
data[].queueItem.user integer The user id of the user who created the queue item.
data[].queueItem.queueNum integer The queue number of the queue item.
page_amount integer The total number of pages for the given parameters.
total integer Total number of print jobs matching the filters.
users array (Optional) Array of user objects when ?getusers=1 is set.
users[].id integer User ID.
users[].first_name string User's first name.
users[].last_name string User's last name.

Get details

curl https://api.simplyprint.io/{id}/jobs/GetDetails?id=123 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "job": {
    "id": 123,
    "filament": [
      ...
    ],
    "pauses": [
      ...
    ],
    "currentTime": 1697040000,
    "pictures": [
      ...
    ],
    "notificationsSent": [
      ...
    ],
    "cost": 12.34,
    "customFields": {
      ...
    },
    "ended": 3600,
    "failedReason": "string",
    "cancelInfo": {
      "reason": "string",
      "comment": "string",
      "by": "string",
      "byOther": 1
    },
    "analysis": {
      ...
    },
    "notifications": {
      ...
    },
    "outsideSystem": true,
    "rating": 5,
    "started": 7200,
    "created": 10800,
    "state": "string",
    "file": "filename.gcode",
    "percentage": 50,
    "time": 1800,
    "canPreview": true,
    "layer": 10,
    "ai": [
      0.1,
      0.2,
      0.3
    ],
    "printer": {
      "id": 456,
      "name": "Printer Name",
      "extruders": 2,
      "image": "https://cdn.simplyprint.io/prints/images/printer_image.jpg",
      "deleted": 1
    },
    "spools": [
      ...
    ]
  }
}

GET /{id}/jobs/GetDetails?id={job_id}

Request Body

Parameter Type Description
id string The job UID.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
job object Details about the print job.
job.id integer Unique identifier for the job.
job.filament array Array of filament data.
job.pauses array Array of pause history.
job.currentTime integer Current timestamp.
job.pictures array Array of pictures related to the job.
job.notificationsSent array Array of notifications sent.
job.cost float Cost of the print job.
job.customFields object Custom fields for the job.
job.ended integer Time since the job ended.
job.failedReason string Reason for job failure, if any.
job.cancelInfo object Information about job cancellation.
job.analysis object G-code analysis data.
job.notifications object Notification data.
job.outsideSystem boolean true if the job is outside the system.
job.rating integer Rating of the job.
job.started integer Time since the job started.
job.created integer Time since the job was created.
job.state string Current state of the job.
job.file string Original filename of the job.
job.percentage integer Current completion percentage.
job.time integer Time left or time since the job ended.
job.canPreview boolean true if the job can be previewed.
job.layer integer Current layer of the print.
job.ai array Array of AI detection values.
job.printer object Details about the printer.
job.users object User information related to the job.
job.users.main object Main user who queued/owns the job.
job.users.main.id integer User ID of the main user.
job.users.main.name string Full name of the main user.
job.users.main.none boolean True if no user is associated with job.
job.users.startedBy object User who actually started the job.
job.users.startedBy.id integer User ID of the user who started the job.
job.users.startedBy.name string Full name of the user who started job.
job.timeline array Timeline of events that happened during the print job.
job.reprintable boolean Whether the job can be reprinted by current user.
job.canDownload boolean Whether the current user can download the file.
job.queued object Queue information if job was from queue.
job.autoprinted boolean Whether job was started automatically.
job.totalPrintTime integer Total print time in seconds (if completed).
job.archived boolean Whether the job is archived.
job.spools array Array of spool data.

API Files

The SimplyPrint Files API is what you use to get a file (gcode, 3mf, stl, etc.) into SimplyPrint from your own code. It is a small, dedicated service separate from the main API so that large uploads don't have to go through the same path as regular JSON calls.

Base URL: https://files.simplyprint.io/{id}/

What can I do with an uploaded file?

Uploading a file via Upload does not, by itself, add it to the queue, to a user's file list, or start a print. The upload just stores the file and returns a file.id. You then pass that id to another endpoint to actually use it:

Use case Endpoint to call after uploading Field to pass the id as
Add the file to the print queue Add item to queue on api.simplyprint.io fileId
Save it to the file system (user's files) Add an API File to files on api.simplyprint.io fileId
Start a print directly on a printer Start print / create job on api.simplyprint.io, with select_mode: "file_id" file_id

So the typical flow is:

  1. POST https://files.simplyprint.io/{id}/files/Upload — uploads the file, returns a file.id.
  2. POST https://api.simplyprint.io/{id}/... — pass that file.id to the endpoint that matches what you want to do (enqueue, save, or print).

Files uploaded here have an expiration (expires_at). If you don't reference them from one of the endpoints above before they expire, they are cleaned up.

Upload a file using the API

POST https://files.simplyprint.io/{id}/files/Upload

This endpoint uploads a file to SimplyPrint so it can later be used to add items to the print queue, saved into a user's file system, or used to start a print directly on a printer. On success it returns a file.id — that id is what you pass to the downstream endpoint of your choice. See What can I do with an uploaded file? for the full list of endpoints that accept this id.

Files larger than 100MB must be uploaded in multiple parts using a continueToken (see the multi-part example below). Files up to 100MB can be uploaded in a single request.

Example request to upload a file less than 100MB

curl -X POST "https://files.simplyprint.io/{id}/files/Upload" \
    -H 'accept: application/json' \
    -H "X-API-KEY: {API_KEY}" \
    -F "file=@/path/to/file.gcode"

Success response

{
  "status": true,
  "message": null,
  "file": {
    "id": "f568ead4bbc2d881efc8a9a05f3bd585334cd8c662347ba2dfad7250176b0abd",
    "name": "file.gcode",
    "size": 13439
  }
}

Multiple parts for a single file larger than 100MB. The first filename is the filename of the entire file.

curl -X POST "https://files.simplyprint.io/{id}/files/Upload" \
    -H 'accept: application/json' \
    -H "X-API-KEY: {API_KEY}" \
    -F "file=@/path/to/part1.3mf"
    -F "totalSize=3352316"

Success response with continueToken

{
  "status": true,
  "message": null,
  "continueToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJ0eXBlIjoiYWN0ao9uX3Rva2VuIiwiYWN0aW9uIjoiZmlsZV9jb250aW51ZV91cGxvYWQiLCJ1c2VyIjo2OTc2LCJjb21wYW55IjoyLCJkYXRhIja7ImJ1Y2tldEhhc2giOiI0MGQ2MzgwNmQwYWUxODhkNjc5YzY0NjA0M2RiYjUxMTc0NTViNTc1NjNlODEzZDc2MGRjMTJkMzVaYjdmY2Y0IiwidG90YWxTaXplIjoxNjc2MTU4NH0sImlhdCI6MTcyNTU2MjEzMywiZXhwIjoxNzI1NjQ4NTMzfQ.9qyNyx9A4Ox_6GrFSxXpxlpLcAKaSr8ln84X3yuWdhT_2O3L8-lGWaXAbQk9VvR-3pu1-a9p40amnt6Fghy49InjzCfNMRp-6-Ft_uMRf6PbmcCCrksvRxNP38ImoXy6"
}

Continue uploading the file (send next part with only the continueToken)

curl -X POST "https://files.simplyprint.io/{id}/files/Upload" \
    -H 'accept: application/json' \
    -H "X-API-KEY: {API_KEY}" \
    -F "continueToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJ0eXBlIjoiYWN0ao9uX3Rva2VuIiwiYWN0aW9uIjoiZmlsZV9jb250aW51ZV91cGxvYWQiLCJ1c2VyIjo2OTc2LCJjb21wYW55IjoyLCJkYXRhIja7ImJ1Y2tldEhhc2giOiI0MGQ2MzgwNmQwYWUxODhkNjc5YzY0NjA0M2RiYjUxMTc0NTViNTc1NjNlODEzZDc2MGRjMTJkMzVaYjdmY2Y0IiwidG90YWxTaXplIjoxNjc2MTU4NH0sImlhdCI6MTcyNTU2MjEzMywiZXhwIjoxNzI1NjQ4NTMzfQ.9qyNyx9A4Ox_6GrFSxXpxlpLcAKaSr8ln84X3yuWdhT_2O3L8-lGWaXAbQk9VvR-3pu1-a9p40amnt6Fghy49InjzCfNMRp-6-Ft_uMRf6PbmcCCrksvRxNP38ImoXy6" \
    -F "file=@/path/to/part2.3mf"

Sucessful final response as we ensured to only send exactly the total size of the file.

{
  "status": true,
  "message": null,
  "file": {
    "id": "f568ead4bbc2d881efc8a9a05f3bd585334cd8c662347ba2dfad7250176b0abd",
    "name": "part1.3mf",
    "size": 3352316
  }
}

Request

Parameter Type Required Description
file file yes Uploaded file (Max 100mb)
continueToken string no Optional token you'll get if you need to continue the upload for files greater than 100MB.
totalSize integer no Send this if you want a continueToken, by providing the total size of the entire file you want to upload

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
continueToken string For every subsequent request that still has some pending size based on the total size this will be returned instead of the file.
file.* object Final file object after entire file has been uploaded
file.id string The API File ID you'll need to use other SimplyPrint APIs
file.name string Name used to reference the file
file.size int Total size of uploaded file
file.uploaded_at string ISO timestamp when the file was uploaded.
file.expires_at string ISO timestamp when the file will expire.

List existing API files

GET https://files.simplyprint.io/{id}/files/ListExisting

Lists API files you've uploaded that haven't yet expired. Useful if you want to avoid re-uploading the same file or check whether a previous upload is still available to reference.

curl https://files.simplyprint.io/{id}/files/ListExisting \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "files": [
    {
      "id": "f568ead4bbc2d881efc8a9a05f3bd585334cd8c662347ba2dfad7250176b0abd",
      "name": "sample_file.gcode",
      "size": 13439,
      "uploaded": "2024-01-15T10:30:00Z",
      "expires": "2024-01-22T10:30:00Z"
    }
  ]
}

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
files array Array of existing API file objects.
files[].id string The API File ID.
files[].name string Name of the file.
files[].size integer Size of the file in bytes.
files[].uploaded_at string ISO timestamp when the file was uploaded.
files[].expires_at string ISO timestamp when the file will expire.

Queue

Add item to queue

curl https://api.simplyprint.io/{id}/queue/AddItem \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "filesystem": "1a077dd6296417fe75555bf806b68089",
    "amount": 5,
    "group": 0
  }'

Success response

{
  "status": true,
  "message": null,
  "created_id": 1337
}

This endpoint adds a file to the queue. The file can either be a file on the filesystem or an uploaded stl/3mf/obj/gcode/gco/nc/npg file.

Note: if you want to specify which printer/printer type/printer model the print job should be assigned, you can edit the print job after it has been added to the queue.

Request

POST /{id}/queue/AddItem

Parameter Type Required Description
filesystem string no The filesystem id of the file to add to the queue.
amount integer no The amount of prints to add to the queue.
Default: 1
group integer no If you have Queue Groups - ID of the group the item should be added to.
Default: 0 - required if you have Queue Groups
fileId string no Optional File ID from API File - use this to add a file uploaded via the API.
tags object no Tags to assign. Only send nozzle body, material body or custom body, without type, id or edited
for_printers array no An array of printer ids to assign the queue item to.
for_models array no An array of printer model ids to assign the queue item to.
for_groups array no An array of group ids to assign the queue item to.
custom_fields array no An array with custom fields to assign to the queue item. Each custom field consists of {customFieldId: string, value: <value>} where the <value> is a Custom Field Submission Value.
position string no Where in the group to insert. Accepts alphanumeric sort keys used by the panel (e.g. "top", "bottom").

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
created_id integer The id of the created queue item

Get next queue item

curl https://api.simplyprint.io/{id}/queue/GetNextItems?pid=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "settings": {
      "filament": false,
      "filamentTemps": false,
      "fit": true,
      "gcodeAnalysis": false,
      "printerTemps": false
    }
  }'

Success response

{
  "status": true,
  "message": null,
  "queue": {
    "total": 1,
    "printers": [
      48013
    ],
    "matches": [
      {
        "id": 430379,
        "name": "UM3E_calicat.gcode",
        "sort_order": 8,
        "left": 0,
        "printed": 1,
        "group": 213,
        "match": true,
        "printable_match": true,
        "model_match": false,
        "errors": null,
        "issues": null,
        "mapper": null,
        "gcodeAnalysis": {
          "v": 12,
          "printArea": {
            "maxX": 149.25,
            "maxY": 149.23,
            "maxZ": 37,
            "minX": 113.95,
            "minY": 106.77,
            "minZ": 0.2
          },
          "movement": {
            "eRelative": 0,
            "mRelative": 1
          },
          "temps": {
            "bed": 60,
            "tool": {
              "T0": 205
            },
            "maxTool": 205
          },
          "modelSize": {
            "x": 35.3,
            "y": 42.46,
            "z": 34.6
          },
          "materialData": null,
          "slicer": "Cura",
          "estimate": 2550,
          "filament": [
            997
          ],
          "nozzleSize": 0.4,
          "nozzles": [
            {
              "size": 0.4
            }
          ],
          "bedType": null,
          "gcodeFlavor": "Griffin",
          "layerHeight": null,
          "firstLayerHeight": null,
          "totalLayers": 175,
          "slicerVersion": null,
          "minDeltaRadius": 202.91,
          "forPrinterModel": null,
          "objects": null
        },
        "custom_fields": [],
        "cost": {
          "estimate": false,
          "currency": "USD",
          "total_cost": 1.21,
          "used_fallback_cost": true,
          "lines": [
            {
              "id": 1,
              "cost": 0.45,
              "label": "Material usage (account default)",
              "material": {
                "gram": 2.97,
                "extruder": 0,
                "fromPercent": null,
                "toPercent": null,
                "isEstimate": false,
                "usedFallbackCost": true
              }
            },
            {
              "id": 2,
              "cost": null,
              "label": "Material markup"
            }
          ]
        },
        "printer": 48013
      }
    ],
    "groups": [
      {
        "id": 213,
        "name": "Workshop A",
        "virtual": false,
        "extensions": null,
        "sort_order": 0,
        "items_count": 8,
        "for": {
          "printers": null,
          "models": null,
          "groups": null
        },
        "visibility": {
          "user_ranks": null
        },
        "approval": {
          "requires_approval": null,
          "required_ranks": [
            493,
            562
          ],
          "exempt_ranks": null
        }
      },
      {
        "id": 1774,
        "name": "John Doe",
        "virtual": false,
        "extensions": null,
        "sort_order": 1,
        "items_count": 0,
        "for": {
          "printers": [
            40131,
            43492
          ],
          "models": null,
          "groups": null
        },
        "visibility": {
          "user_ranks": null
        },
        "approval": {
          "requires_approval": null,
          "required_ranks": null,
          "exempt_ranks": null
        }
      }
    ]
  }
}

Failed response (Could not find any items that match the specified conditions)

{
  "status": true,
  "message": null,
  "queue": {
    "total": 15,
    "printers": [
      385
    ],
    "matches": [
      {
        "printer": 385,
        "match": false,
        "issues": [
          "size",
          "temps"
        ],
        "missed": 4
      }
    ]
  }
}

This endpoint gets the next item in the queue for the specified printer. The next item is the item that has the highest priority. The result will have skipped all items that do not meet the specified conditions.

Request

POST /{id}/queue/GetNextItems

Query parameters

Parameter Type Required Description
pid integer[] yes Comma separated list of printer ids to get the next items for.
deselects integer[] no Comma separated list of queue item ids to exclude from matching (e.g. items already chosen).

Request body

Parameter Type Required Description
settings object no Conditions that must be met for the next item.
settings.filament boolean no Must have enough filament.
Default: true
settings.filamentTemps boolean no Printer's filament temperature must match filament temperature of file.
Default: true
settings.fit boolean no Print must fit printer's bed.
Default: true
settings.gcodeAnalysis boolean no Must have gcode analysis.
Default: true
settings.printerTemps boolean no File must have a max temperature that is lower than the printer's max temperature.
Default: true
settings.tags boolean no Printer must match possible queue item tags (nozzle size, material data & custom tags).
Default: true
settings.nozzleSize boolean no Printer's loaded nozzle size must match the file's required nozzle size.
Default: true
settings.colorMatchLevel integer no How strict the material color match must be (0 disables, higher values require closer matches). Supersedes settings.materialColor.
sorting object no Sort order for candidate items, shaped like PrintQueueSort.
filters object[] no Additional filters applied per candidate, each shaped like PrintQueueFilter.
skippedQueueItems integer[] no Queue item ids to skip over when selecting the next item.
specificQueueGroups integer[] no Limit matching to only these queue group ids.
queueGroupsOrder integer[] no Override the queue group iteration order (by group id).

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
queue object The queue object.
queue.total integer The total amount of items in the queue.
queue.printers integer[] The printer ids that were requested.
queue.matches array The next items for each printer.
queue.matches[].id integer The id of the next item. Only present if match is true.
queue.matches[].index integer The index of the item in the queue. Only present if match is true.
queue.matches[].printer integer The id of the printer that the item is for.
queue.matches[].match boolean True if a match was found.
queue.matches[].issues string[] The issues that are present in the item. Can also have values if an item was matched but would have been catched by other settings.
queue.matches[].missed integer The amount of items that were skipped.
queue.matches[].name string The name of the item. Only present if match is true.
queue.matches[].printed integer The amount of completed prints of this item (from print queue). Only present if match is true.
queue.matches[].left integer The amount of prints left (from print queue). Only present if match is true.

Inspect printer

Required permissions
print_queue
curl https://api.simplyprint.io/{id}/queue/InspectPrinter?p=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "inspector": {
    "matches": [
      {
        "id": 430379,
        "filename": "UM3E_calicat.gcode",
        "note": null,
        "model": false,
        "printable": true,
        "type": "printable",
        "zipPrintable": false,
        "zipNoModel": false,
        "left": 1,
        "printed": 0,
        "filesystem_id": "40dc8db415fb454492e6796cbc96d4f7",
        "for": {
          "printers": null,
          "models": null,
          "groups": null
        },
        "tags": {
          "nozzleData": [
            {
              "size": 0.4,
              "i": 0,
              "nozzleIndex": 0
            }
          ]
        },
        "group": 213,
        "analysis": {
          "v": 12,
          "printArea": {
            "maxX": 149.25,
            "maxY": 149.23,
            "maxZ": 37,
            "minX": 113.95,
            "minY": 106.77,
            "minZ": 0.2
          },
          "movement": {
            "eRelative": 0,
            "mRelative": 1
          },
          "temps": {
            "bed": 60,
            "tool": {
              "T0": 205
            },
            "maxTool": 205
          },
          "modelSize": {
            "x": 35.3,
            "y": 42.46,
            "z": 34.6
          },
          "materialData": null,
          "slicer": "Cura",
          "estimate": 2550,
          "filament": [
            997
          ],
          "nozzleSize": 0.4,
          "nozzles": [
            {
              "size": 0.4
            }
          ],
          "bedType": null,
          "gcodeFlavor": "Griffin",
          "layerHeight": null,
          "firstLayerHeight": null,
          "totalLayers": 175,
          "slicerVersion": null,
          "minDeltaRadius": 202.91,
          "forPrinterModel": null,
          "objects": null
        },
        "added": "2026-04-13T16:32:44+00:00",
        "size": 0,
        "index": null,
        "cost": {
          "estimate": false,
          "currency": "USD",
          "total_cost": 1.21,
          "used_fallback_cost": true,
          "lines": [
            {
              "id": 1,
              "cost": 0.45,
              "label": "Material usage (account default)",
              "material": {
                "gram": 2.97,
                "extruder": 0,
                "fromPercent": null,
                "toPercent": null,
                "isEstimate": false,
                "usedFallbackCost": true
              }
            },
            {
              "id": 2,
              "cost": null,
              "label": "Material markup"
            }
          ]
        },
        "sort_order": 7,
        "user": "Test Email",
        "user_id": 78013,
        "custom_fields": [],
        "approval": {
          "status": "approved",
          "approved_by": 43343,
          "approved_by_name": "Frida Rosenaa",
          "approved_at": "2026-04-13T16:34:01+00:00"
        },
        "quota_warnings": {
          "over_quota": false,
          "insufficient_balance": false,
          "would_exceed": [],
          "details": []
        },
        "mapper": null,
        "match": true,
        "issues": []
      }
    ],
    "misses": [
      {
        "id": 430365,
        "filename": "farmloop_Cube.3mf",
        "note": null,
        "model": false,
        "printable": true,
        "type": "printable",
        "zipPrintable": true,
        "zipNoModel": true,
        "left": 7,
        "printed": 2,
        "filesystem_id": null,
        "for": {
          "printers": null,
          "models": null,
          "groups": null
        },
        "tags": {
          "nozzleData": [
            {
              "volumeType": "standard",
              "size": 0.4,
              "i": 0,
              "nozzleIndex": 0
            }
          ],
          "material": [
            {
              "type": 122941,
              "color": "Blue",
              "hex": "#2196F3",
              "ext": 4,
              "width": 1.75
            }
          ],
          "bedType": {
            "type": "bambu_textured_pei_plate"
          }
        },
        "group": 213,
        "analysis": {
          "v": 12,
          "printArea": {
            "maxX": 131.79,
            "maxY": 131.79,
            "maxZ": 83.98,
            "minX": 124.21,
            "minY": 124.21,
            "minZ": 0.2
          },
          "movement": {
            "eRelative": 1,
            "mRelative": 1
          },
          "temps": {
            "bed": 60,
            "tool": {
              "T4": 220
            },
            "maxTool": 220
          },
          "modelSize": {
            "x": 7.58,
            "y": 7.58,
            "z": 7.76
          },
          "materialData": [
            {},
            {}
          ],
          "slicer": "BambuStudio",
          "estimate": 504,
          "filament": [
            0,
            0
          ],
          "nozzleSize": 0.4,
          "nozzles": [
            {
              "size": 0.4,
              "type": "hardened_steel",
              "volumeType": "Standard"
            }
          ],
          "bedType": "Textured PEI Plate",
          "gcodeFlavor": "Marlin",
          "layerHeight": 0.08,
          "firstLayerHeight": null,
          "totalLayers": 98,
          "slicerVersion": "02.05.00.66",
          "minDeltaRadius": 186.34,
          "forPrinterModel": "Bambu Lab P2S",
          "objects": null
        },
        "added": "2026-03-24T20:08:46+00:00",
        "size": 45636,
        "index": null,
        "cost": {
          "estimate": false,
          "currency": "USD",
          "total_cost": 0.22,
          "used_fallback_cost": true,
          "lines": [
            {
              "id": 1,
              "cost": 0.06,
              "label": "Material usage (account default)",
              "material": {
                "gram": 0.39,
                "extruder": 4,
                "fromPercent": null,
                "toPercent": null,
                "isEstimate": false,
                "usedFallbackCost": true
              }
            },
            {
              "id": 2,
              "cost": null,
              "label": "Material markup"
            }
          ]
        },
        "sort_order": 0,
        "user": "John Doe ",
        "user_id": 1234,
        "custom_fields": [],
        "quota_warnings": {
          "over_quota": false,
          "insufficient_balance": false,
          "would_exceed": [],
          "details": []
        },
        "mapper": null,
        "match": false,
        "issues": [
          "printer_file_unsupported"
        ],
        "errors": [
          "Printer does not support this file type"
        ]
      },
      {
        "id": 430372,
        "filename": "Sphere.3mf",
        "note": null,
        "model": false,
        "printable": true,
        "type": "printable",
        "zipPrintable": true,
        "zipNoModel": true,
        "left": 9,
        "printed": 0,
        "filesystem_id": null,
        "for": {
          "printers": null,
          "models": [
            582
          ],
          "groups": null
        },
        "tags": {
          "nozzleData": [
            {
              "volumeType": "standard",
              "size": 0.4,
              "i": 1,
              "nozzleIndex": 1
            }
          ],
          "material": [
            {
              "type": 51822,
              "color": "Red",
              "hex": "#C12E1F",
              "nozzle": 1,
              "ext": 3,
              "width": 1.75,
              "spoolId": 78372
            }
          ],
          "bedType": {
            "type": "bambu_smooth_pei_plate"
          }
        },
        "group": 1838,
        "analysis": {
          "v": 12,
          "printArea": {
            "maxX": 184.78,
            "maxY": 169.79,
            "maxZ": 110,
            "minX": 165.23,
            "minY": 150.21,
            "minZ": 0.2
          },
          "movement": {
            "eRelative": 0,
            "mRelative": 0
          },
          "temps": {
            "bed": 55,
            "tool": {
              "T4": 220
            },
            "maxTool": 220
          },
          "modelSize": {
            "x": 19.55,
            "y": 19.58,
            "z": 19.8
          },
          "materialData": [
            {},
            {
              "nozzle": 1
            }
          ],
          "slicer": "BambuStudio",
          "estimate": 759,
          "filament": [
            0,
            0
          ],
          "nozzleSize": 0.4,
          "nozzles": [
            {
              "size": 0.4,
              "type": "hardened_steel",
              "volumeType": "Standard"
            },
            {
              "size": 0.4,
              "type": "hardened_steel",
              "volumeType": "Standard"
            }
          ],
          "bedType": "High Temp Plate",
          "gcodeFlavor": "Marlin",
          "layerHeight": 0.12,
          "firstLayerHeight": null,
          "totalLayers": 166,
          "slicerVersion": "02.05.02.51",
          "minDeltaRadius": 246.81,
          "forPrinterModel": "Bambu Lab H2D",
          "objects": null
        },
        "added": "2026-04-11T12:05:41+00:00",
        "size": 312308,
        "index": null,
        "cost": {
          "estimate": true,
          "currency": "USD",
          "total_cost": 0.55,
          "used_fallback_cost": true,
          "lines": [
            {
              "id": 1,
              "cost": 0.32,
              "label": "Material usage (account default)",
              "material": {
                "gram": 2.11,
                "extruder": 4,
                "fromPercent": null,
                "toPercent": null,
                "isEstimate": true,
                "usedFallbackCost": true
              }
            },
            {
              "id": 2,
              "cost": null,
              "label": "Material markup"
            }
          ]
        },
        "sort_order": 0,
        "user": "John Doe ",
        "user_id": 1234,
        "custom_fields": [],
        "quota_warnings": {
          "over_quota": false,
          "insufficient_balance": false,
          "would_exceed": [],
          "details": []
        },
        "mapper": null,
        "match": false,
        "issues": [
          "not_assigned_model"
        ],
        "errors": [
          "Item is not for this printer model"
        ]
      }
    ],
    "groups": [
      {
        "id": 213,
        "name": "Workshop A",
        "virtual": false,
        "extensions": null,
        "sort_order": 0,
        "items_count": 8,
        "for": {
          "printers": null,
          "models": null,
          "groups": null
        },
        "visibility": {
          "user_ranks": null
        },
        "approval": {
          "requires_approval": null,
          "required_ranks": [
            493,
            562
          ],
          "exempt_ranks": null
        }
      },
      {
        "id": 1838,
        "name": "Workshop A",
        "virtual": false,
        "extensions": null,
        "sort_order": 2,
        "items_count": 1,
        "for": {
          "printers": null,
          "models": null,
          "groups": null
        },
        "visibility": {
          "user_ranks": null
        },
        "approval": {
          "requires_approval": null,
          "required_ranks": null,
          "exempt_ranks": null
        }
      }
    ],
    "issues": {
      "printer_file_unsupported": 1,
      "not_assigned_model": 6,
      "not_assigned_printer": 1
    },
    "criteria": {
      "gcodeAnalysis": false,
      "fit": true,
      "bedType": true,
      "printerTemps": false,
      "filament": true,
      "filamentTemps": true,
      "tags": true,
      "nozzleSize": true,
      "nozzleType": false,
      "nozzleVolume": false,
      "colorMatchLevel": 5,
      "materialType": false,
      "materialTypeStrict": true
    },
    "other_criteria": {
      "gcodeAnalysis": false,
      "fit": true,
      "bedType": true,
      "printerTemps": false,
      "filament": true,
      "filamentTemps": true,
      "tags": true,
      "nozzleSize": true,
      "nozzleType": false,
      "nozzleVolume": false,
      "colorMatchLevel": 5,
      "materialType": false,
      "materialTypeStrict": true
    },
    "mode": "queue"
  }
}

Returns the queue items the given printer could pull next, split into matches (items that fit the printer) and misses (items in range that failed one or more checks like filament type, nozzle size, or bed fit). Use this to diagnose why a specific printer is idle when the queue is not empty.

Request

GET /{id}/queue/InspectPrinter

Parameter Type Required Description
p integer yes Printer id to inspect.
mode string no Restrict the inspection context. Accepted values: autoprint.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
inspector.matches array Queue items that match the printer. Shape matches queue items elsewhere.
inspector.misses array Queue items considered but rejected, each annotated with the failing conditions.

Get queue item

curl https://api.simplyprint.io/{id}/queue/GetItem?id=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "item": {
    "id": 430372,
    "filename": "Sphere.3mf",
    "note": null,
    "model": false,
    "printable": true,
    "type": "printable",
    "zipPrintable": true,
    "zipNoModel": true,
    "left": 9,
    "printed": 0,
    "filesystem_id": null,
    "for": {
      "printers": null,
      "models": [
        582
      ],
      "groups": null
    },
    "tags": {
      "nozzleData": [
        {
          "volumeType": "standard",
          "size": 0.4,
          "i": 1,
          "nozzleIndex": 1
        }
      ],
      "material": [
        {
          "type": 51822,
          "color": "Red",
          "hex": "#C12E1F",
          "nozzle": 1,
          "ext": 3,
          "width": 1.75,
          "spoolId": 78372
        }
      ],
      "bedType": {
        "type": "bambu_smooth_pei_plate"
      }
    },
    "group": 1838,
    "analysis": {
      "v": 12,
      "printArea": {
        "maxX": 184.78,
        "maxY": 169.79,
        "maxZ": 110,
        "minX": 165.23,
        "minY": 150.21,
        "minZ": 0.2
      },
      "movement": {
        "eRelative": 0,
        "mRelative": 0
      },
      "temps": {
        "bed": 55,
        "tool": {
          "T4": 220
        },
        "maxTool": 220
      },
      "modelSize": {
        "x": 19.55,
        "y": 19.58,
        "z": 19.8
      },
      "materialData": [
        {},
        {
          "nozzle": 1
        }
      ],
      "slicer": "BambuStudio",
      "estimate": 759,
      "filament": [
        0,
        0
      ],
      "nozzleSize": 0.4,
      "nozzles": [
        {
          "size": 0.4,
          "type": "hardened_steel",
          "volumeType": "Standard"
        },
        {
          "size": 0.4,
          "type": "hardened_steel",
          "volumeType": "Standard"
        }
      ],
      "bedType": "High Temp Plate",
      "gcodeFlavor": "Marlin",
      "layerHeight": 0.12,
      "firstLayerHeight": null,
      "totalLayers": 166,
      "slicerVersion": "02.05.02.51",
      "minDeltaRadius": 246.81,
      "forPrinterModel": "Bambu Lab H2D",
      "objects": null
    },
    "added": "2026-04-11T12:05:41+00:00",
    "size": 312308,
    "index": null,
    "cost": {
      "estimate": true,
      "currency": "USD",
      "total_cost": 0.55,
      "used_fallback_cost": true,
      "lines": [
        {
          "id": 1,
          "cost": 0.32,
          "label": "Material usage (account default)",
          "material": {
            "gram": 2.11,
            "extruder": 4,
            "fromPercent": null,
            "toPercent": null,
            "isEstimate": true,
            "usedFallbackCost": true
          }
        },
        {
          "id": 2,
          "cost": null,
          "label": "Material markup"
        }
      ]
    },
    "sort_order": 0,
    "user": "John Doe",
    "user_id": 1234,
    "custom_fields": [],
    "quota_warnings": {
      "over_quota": false,
      "insufficient_balance": false,
      "would_exceed": [],
      "details": []
    }
  }
}
Required permissions
print_queue

This endpoint returns the queue item with the specified id.

Request

GET /{id}/queue/GetItem

Parameter Type Required Description
id integer yes The queue item id to get details for.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
item object The queue item object.

Get queue items

curl https://api.simplyprint.io/{id}/queue/GetItems?pid=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "queue": [
    {
      "id": 430365,
      "filename": "farmloop_Cube.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 7,
      "printed": 2,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": null,
        "groups": null
      },
      "tags": {
        "nozzleData": [
          {
            "volumeType": "standard",
            "size": 0.4,
            "i": 0,
            "nozzleIndex": 0
          }
        ],
        "material": [
          {
            "type": 122941,
            "color": "Blue",
            "hex": "#2196F3",
            "ext": 4,
            "width": 1.75
          }
        ],
        "bedType": {
          "type": "bambu_textured_pei_plate"
        }
      },
      "group": 213,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 131.79,
          "maxY": 131.79,
          "maxZ": 83.98,
          "minX": 124.21,
          "minY": 124.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 1,
          "mRelative": 1
        },
        "temps": {
          "bed": 60,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 7.58,
          "y": 7.58,
          "z": 7.76
        },
        "materialData": [
          {},
          {}
        ],
        "slicer": "BambuStudio",
        "estimate": 504,
        "filament": [
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "Textured PEI Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.08,
        "firstLayerHeight": null,
        "totalLayers": 98,
        "slicerVersion": "02.05.00.66",
        "minDeltaRadius": 186.34,
        "forPrinterModel": "Bambu Lab P2S",
        "objects": null
      },
      "added": "2026-03-24T20:08:46+00:00",
      "size": 45636,
      "index": 0,
      "cost": {
        "estimate": false,
        "currency": "USD",
        "total_cost": 0.22,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.06,
            "label": "Material usage (account default)",
            "material": {
              "gram": 0.39,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": false,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe ",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": {
        "nozzleData": [
          {
            "volumeType": "standard",
            "size": 0.4,
            "i": 1,
            "nozzleIndex": 1
          }
        ],
        "material": [
          {
            "type": 51822,
            "color": "Red",
            "hex": "#C12E1F",
            "nozzle": 1,
            "ext": 3,
            "width": 1.75,
            "spoolId": 78372
          }
        ],
        "bedType": {
          "type": "bambu_smooth_pei_plate"
        }
      },
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": 1,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe ",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    }
  ],
  "users": true,
  "printers_count": 61,
  "delete_all": true,
  "custom_fields": null,
  "queue_approval_enabled": true
}
Required permissions
print_queue

This endpoint returns the queue for the specified or all printers.

Request

GET /{id}/queue/GetItems

Parameter Type Required Description
p integer no The printer id to get the queue for. If not specified, the queue for all printers will be returned.
pf integer no A printer filter id (printer id) to restrict the queue view to. Similar to p but used by the panel to filter by "for printer" in addition to the primary selection.
groups boolean no Attaches a list of print queue groups to the response. Note: this argument does not take a value.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
queue object The queue object.
queue.fits boolean Whether any items in the queue can be printed on the printer. (due to space, temperature)
queue.items array An array of queue item objects.
queue.items[].id integer The queue item id.
queue.items[].index integer The queue item index.
queue.items[].filename string The queue item filename.
queue.items[].note string/null Optional note text.
queue.items[].model boolean True if the queue item is a model.
queue.items[].printable boolean True if the queue is printable.
queue.items[].left integer The amount of prints left to print.
queue.items[].printed integer The amount of prints that have been printed.
queue.items[].filesystem_id string/null File id if print is from SimplyPrint filesystem.
queue.items[].group integer Possible ID of Queue Group.
queue.items[].for object For which printers, models and groups this queue item is for.
queue.items[].for.printers array An array of printer ids.
queue.items[].for.models array An array of printer model ids.
queue.items[].for.groups array An array of group ids.
queue.items[].analysis object The analysis object.
queue.items[].analysis.slicer string The slicer used to slice the file.
queue.items[].analysis.filament array An array of filament lengths.
queue.items[].analysis.estimate integer The estimated print time in seconds.
queue.items[].analysis.movement object The movement object.
queue.items[].analysis.temps object The temperatures object.
queue.items[].analysis.temps.tool object Temperature for each tool (extruder).
queue.items[].analysis.temps.bed integer Temperature for the bed.
queue.items[].analysis.modelSize object The model size object. Represented as x, y and z values in millimeters.
queue.items[].analysis.printArea object The print area object. Represented as maxX, minX, maxY, minY, maxZ and minZ values in millimeters.
queue.items[].analysis.minDeltaRadius float Minimum radius for delta printers.
queue.items[].analysis.v integer The analysis version.
queue.items[].user string The user name of who added the queue item.
queue.items[].user_id integer The user id of who added the queue item.
queue.items[].tags object/null Tags for queue item; custom tags, static material data & nozzle size
queue.done_items array If groups GET is set, an array of done queue items, or ones where the last remaining item is being printed includes all the same fields as queue items, with a few extra;.
queue.done_items[].... Fields inherited from regular queue items.
queue.done_items[].size integer Byte-size used by this item - 0 if the file is from the filesystem.
queue.done_items[].ongoing boolean If the item is currently ongoing.
queue.done_items[].done UTC date/null UTC date that the item was finished.
queue.done_items[].expires UTC date/null UTC date that the item expires and is removed from the platform.
groups array If groups GET is set, an array of print queue groups.
groups[].id integer The group id.
groups[].name string The group name.
groups[].virtual boolean Whether the group is a virtual queue group.
groups[].extensions array/null An array of file extensions that are allowed in the group.
groups[].sort_order integer The sort index of the group.

Update queue item

curl https://api.simplyprint.io/{id}/queue/UpdateItem?job=1234 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "for_groups": [
      1234
    ],
    "for_models": [
      1234
    ],
    "for_printers": [
      1234
    ]
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
print_queue

This endpoint updates the queue item with the specified id.

Request

POST /{id}/queue/UpdateItem

Query parameters

Parameter Type Required Description
job integer yes The queue item id to update.

Request body

Parameter Type Required Description
for_groups array no An array of group ids to assign the queue item to.
for_models array no An array of printer model ids to assign the queue item to.
for_printers array no An array of printer ids to assign the queue item to.
amount integer no The new total amount to print.
printed integer no Override the amount of prints already completed for this item.
note string no Free-text note (max 255 chars). Pass null to clear the note.
time integer no Override the estimated print time (seconds).
material_usage number no Override the material usage (grams).

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Delete queue item

curl 'https://api.simplyprint.io/{id}/queue/DeleteItem?job=1234' \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}
Required permissions
print_queue

This endpoint deletes the queue item with the specified id.

Request

GET /{id}/queue/DeleteItem

Pass one of job or jobs.

Parameter Type Required Description
job integer yes (or jobs) The queue item id to delete.
jobs integer[] yes (or job) Comma separated list of queue item ids to delete in a single call.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Change queue order

curl https://api.simplyprint.io/{id}/queue/SetOrder?queue_item=1234&to=1 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "success": true,
  "message": null
}
Required permissions
print_queue
reorder_queue
queue_see_others

This endpoint changes the order of the queue items by moving the queue item with the specified id.

Request

GET /{id}/queue/SetOrder

Parameter Type Required Description
queue_item integer yes The queue item id to move.
from integer yes Deprecated. Must be a positive integer; the server no longer uses the value. Kept for backwards compatibility.
to integer yes The new position of the queue item.

Response

Parameter Type Description
success boolean True if the request was successful.
message string Success message or error message if success is false.

Move queue items

curl 'https://api.simplyprint.io/{id}/queue/MoveItem?jobs=1234,1235&moveTo=42' \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}
Required permissions
print_queue
queue_move_items
Required OAuth scopes
queue.write

Moves one or more queue items into a different queue group. Use this when you want to relocate items across groups (e.g. moving from an "Incoming" group to a "Ready to print" group). To reorder within a group, use Change queue order instead.

Request

GET /{id}/queue/MoveItem

Parameter Type Required Description
jobs integer[] yes Comma separated list of queue item ids to move.
moveTo integer yes The id of the queue group to move the items into.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Empty queue

curl https://api.simplyprint.io/{id}/queue/EmptyQueue \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"group": 213}'

Success response

{
  "status": true,
  "message": null
}
Required Permissions
print_queue
print_queue_remove_all

This endpoint empties the queue.

Request

POST /{id}/queue/EmptyQueue

Parameter Type Required Description
group integer no ID of Queue Group to empty.
Default: 0 - required if you have Queue Groups
done_items boolean no If true, clear the "done items" (completed) history instead of the active queue.
Default: false

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Revive item

Required permissions
print_queue
queue_revive_done_items
curl https://api.simplyprint.io/{id}/queue/ReviveItem?job=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \

Success response

{
  "status": true,
  "message": null
}

POST /{id}/queue/ReviveItem

Request Parameters

Parameter Type Description
job integer The ID of the job to revive.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Get groups

Required permissions
print_queue
curl https://api.simplyprint.io/{id}/queue/groups/Get \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "list": [
    {
      "id": 213,
      "name": "Workshop A",
      "virtual": false,
      "extensions": null,
      "sort_order": 0,
      "items_count": 8,
      "for": {
        "printers": null,
        "models": null,
        "groups": null
      },
      "visibility": {
        "user_ranks": null
      },
      "approval": {
        "requires_approval": null,
        "required_ranks": [
          493,
          562
        ],
        "exempt_ranks": null,
        "user_needs_approval": false
      }
    },
    {
      "id": 1774,
      "name": "John Doe",
      "virtual": false,
      "extensions": null,
      "sort_order": 1,
      "items_count": 0,
      "for": {
        "printers": [
          40131,
          43492
        ],
        "models": null,
        "groups": null
      },
      "visibility": {
        "user_ranks": null
      },
      "approval": {
        "requires_approval": null,
        "required_ranks": null,
        "exempt_ranks": null,
        "user_needs_approval": false
      }
    }
  ],
  "groups_exist": true,
  "total_queue_count": 9,
  "queue_approval_enabled": true,
  "queue_approval_show_approver_name": true
}

GET /{id}/queue/groups/Get

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
list array Array of print queue groups.
list[].id integer Unique identifier for the group.
list[].name string Name of the group.
list[].virtual boolean Whether the group is a virtual queue group.
list[].extensions array An array of file extensions that are allowed in the group. (without punctuation)
list[].sort_order integer The sort order of the group.
list[].for object For which printers, models and groups this queue item is for.

Save group

Required permissions
print_queue
queue_groups
curl https://api.simplyprint.io/{id}/queue/groups/Save \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "id": 123,
    "name": "New Queue Group",
    "accepted_extensions": ["gcode", "bgcode"],
    "virtual_only": false,
    "for_printers": "1,2,3",
    "for_models": "4,5,6",
    "for_groups": "7,8,9"
  }'

Success response

{
  "status": true,
  "message": null
}

POST /{id}/queue/groups/Save

Request Body

Parameter Type Description
id integer The ID of the group to update (optional for creating a new group).
name string The name of the queue group.
accepted_extensions array List of accepted file extensions.
virtual_only boolean Whether the group is virtual only.
for_printers string Comma-separated list of printer IDs.
for_models string Comma-separated list of printer model IDs.
for_groups string Comma-separated list of printer group IDs.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Delete group

Required permissions
print_queue
queue_groups
curl https://api.simplyprint.io/{id}/queue/groups/Delete?id=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \

Success response

{
  "status": true,
  "message": null
}

POST /{id}/queue/groups/Delete

Request Parameters

Parameter Type Description
id integer The ID of the group to delete.

Request Body

Parameter Type Description
move_to integer The ID of the group to move items to. Defaults to any other group.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Set group order

Required permissions
queue_groups
reorder_queue
curl https://api.simplyprint.io/{id}/queue/groups/SetOrder?queue_group=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "from": 1,
    "to": 2
  }'

Success response

{
  "status": true,
  "message": null
}

POST /{id}/queue/groups/SetOrder

Request Parameters

Parameter Type Description
queue_group integer The ID of the queue group.

Request Body

Parameter Type Description
to integer The new sorting order of the group.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Get pending approval items

Required permissions
print_queue
curl https://api.simplyprint.io/{id}/queue/approval/GetPendingItems \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "items": [],
  "total": 0,
  "page": 1,
  "per_page": 50
}

Lists queue items that are waiting for approval before they can print. Approval is an opt-in gate used on School accounts so that a teacher or manager reviews submissions before they reach a printer.

Request

GET /{id}/queue/approval/GetPendingItems

Parameter Type Required Description
status string no Filter by approval status. Omit to return all pending items.
page integer no 1-based page index for paginated results.
per_page integer no Items per page.
Default: 50, max: 100

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
items array Pending queue items awaiting approval.
total integer Total number of pending items across all pages.
page integer The page returned.
per_page integer Items per page.

Approve queue item

Required permissions
queue_approve
curl 'https://api.simplyprint.io/{id}/queue/approval/ApproveItem?job=1234' \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"comment": "Looks good, approved."}'

Success response

{
  "status": true,
  "message": null
}

Approves one or more pending queue items so they enter the active queue and become eligible for printing. Optionally attach a comment visible to the submitter.

Request

POST /{id}/queue/approval/ApproveItem

One of job or jobs is required.

Query parameters

Parameter Type Required Description
job integer yes (or jobs) A single queue item id to approve.
jobs integer[] yes (or job) Comma separated list of queue item ids to approve.

Request body

Parameter Type Required Description
comment string no Optional approval note (max 2000 chars). Stored as a comment on the item.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Deny queue item

Required permissions
queue_approve
curl 'https://api.simplyprint.io/{id}/queue/approval/DenyItem?job=1234' \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "comment": "Please rescale the part and resubmit.",
    "remove": false
  }'

Success response

{
  "status": true,
  "message": null
}

Denies one or more pending queue items. By default the item stays in the approval list with status denied so the submitter can revise and resubmit. Pass remove: true to delete the item entirely instead.

Request

POST /{id}/queue/approval/DenyItem

One of job or jobs is required.

Query parameters

Parameter Type Required Description
job integer yes (or jobs) A single queue item id to deny.
jobs integer[] yes (or job) Comma separated list of queue item ids to deny.

Request body

Parameter Type Required Description
comment string no Reason for denial (max 2000 chars). Posted as a comment the submitter can see.
remove boolean no If true, delete the item immediately. If false (default), keep it in the denied state so the submitter can request changes.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Send queue item back for revision

Required permissions
queue_approve
curl 'https://api.simplyprint.io/{id}/queue/approval/SendBack?job=1234' \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"comment": "Revoking approval - please update the slice settings."}'

Success response

{
  "status": true,
  "message": null
}

Revokes an already-approved queue item and sends it back to the submitter for revision. The item's approval status becomes revision and it is parked outside the active sort until it is resubmitted and re-approved.

Request

POST /{id}/queue/approval/SendBack

Query parameters

Parameter Type Required Description
job integer yes The queue item id to send back.

Request body

Parameter Type Required Description
comment string no Reason for revoking approval (max 2000 chars).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Resubmit queue item

Required permissions
print_queue
curl 'https://api.simplyprint.io/{id}/queue/approval/ResubmitItem?job=1234' \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"comment": "Rescaled model and re-sliced at 0.2mm layer height."}'

Success response

{
  "status": true,
  "message": null
}

Resubmits a denied or sent-back queue item back into the approval pipeline. The item's status returns to pending and reviewers see it again in Get pending approval items. Replacing the underlying file via this endpoint is not supported through the API; resubmit with an updated comment only.

Request

POST /{id}/queue/approval/ResubmitItem

Query parameters

Parameter Type Required Description
job integer yes The queue item id to resubmit.

Request body

Parameter Type Required Description
comment string no Note explaining what changed in the revision (max 2000 chars).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Get approval comments

Required permissions
print_queue
curl 'https://api.simplyprint.io/{id}/queue/approval/GetComments?item_id=1234' \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "comments": []
}

Returns the reviewer/submitter comment thread attached to a queue item pending approval. Pass either item_id for an existing queue item or file_id for a file not yet enqueued.

Request

GET /{id}/queue/approval/GetComments

One of item_id or file_id is required.

Parameter Type Required Description
item_id integer yes (or file_id) Queue item to fetch comments for.
file_id string yes (or item_id) File id (for items not yet in the queue).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
comments array Chronological comment thread for the item.

Add approval comment

Required permissions
print_queue
curl https://api.simplyprint.io/{id}/queue/approval/AddComment \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "item_id": 1234,
    "type": "general",
    "comment": "Please switch to PETG for the flexible hinge."
  }'

Success response

{
  "status": true,
  "message": null,
  "comment": {
    "id": 143,
    "comment": "API docs capture test comment",
    "type": "general",
    "user": {
      "id": 1234,
      "name": "John Doe"
    },
    "attachments": null,
    "print_queue_item_id": 430379,
    "user_file_id": null,
    "created_at": "2026-04-20T09:37:26+00:00",
    "updated_at": "2026-04-20T09:37:26+00:00"
  }
}

Adds a comment to a queue item (via item_id) or an uploaded file that is not yet enqueued (via file_id). Comments are part of the approval thread and visible to both reviewers and the submitter. Either comment text, file_ids attachments, or both must be provided.

Request

POST /{id}/queue/approval/AddComment

One of item_id or file_id is required.

Parameter Type Required Description
item_id integer yes (or file_id) Queue item id to attach the comment to.
file_id string yes (or item_id) File id (for comments on files not yet enqueued).
comment string no Comment text (max 5000 chars). Required if no file_ids are attached.
type string no Comment type: general or feedback.
Default: general
file_ids integer[] no Ids of previously uploaded attachments (via Upload comment attachment) to associate with this comment.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
comment object The created comment.
comment.id integer Comment id - pass this to update / delete endpoints.
comment.comment string Comment text.
comment.type string general or feedback.
comment.user object Author of the comment ({id, name}).
comment.attachments array / null Attached files, if any.
comment.print_queue_item_id integer / null Attached queue item id (when posted via item_id).
comment.user_file_id string / null Attached file id (when posted via file_id).
comment.created_at string ISO 8601 creation timestamp.
comment.updated_at string ISO 8601 last-modified timestamp.

Update approval comment

Required permissions
print_queue
curl https://api.simplyprint.io/{id}/queue/approval/UpdateComment \
  -X POST \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {OAUTH_TOKEN}' \
  -d '{
    "id": 143,
    "comment": "Updated: please switch to PETG and add a 1mm chamfer."
  }'

Success response

{
  "status": true,
  "message": null
}

Updates the text of a comment you authored. Users can only edit their own comments.

Request

POST /{id}/queue/approval/UpdateComment

Parameter Type Required Description
id integer yes The comment id to update.
comment string yes New comment text (1 to 5000 chars).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Delete approval comment

Required permissions
print_queue
queue_delete_others_comments*

* queue_delete_others_comments is only required when deleting another user's comment. Users can always delete their own.

curl https://api.simplyprint.io/{id}/queue/approval/DeleteComment \
  -X POST \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {OAUTH_TOKEN}' \
  -d '{"id": 143}'

Success response

{
  "status": true,
  "message": null
}

Deletes a comment. Users can delete their own comments. Deleting someone else's comment requires the queue_delete_others_comments permission.

Request

POST /{id}/queue/approval/DeleteComment

Parameter Type Required Description
id integer yes The comment id to delete.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Upload comment attachment

Required permissions
print_queue
curl https://api.simplyprint.io/{id}/queue/approval/UploadCommentFile \
  -X POST \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {OAUTH_TOKEN}' \
  -F 'file=@./annotated_part.png'

Success response

{
  "status": true,
  "message": null,
  "file": {
    "file_id": 987,
    "url": "https://cdn.simplyprint.io/path/to/file.png"
  }
}

Uploads an image or PDF attachment to be referenced by one or more approval comments. Pass the returned file.file_id in the file_ids array when calling Add approval comment.

Accepted file types: images (PNG, JPG, GIF, WebP, SVG) and PDF. Maximum size: 10 MB.

Request

POST /{id}/queue/approval/UploadCommentFile (multipart/form-data)

Parameter Type Required Description
file file yes The attachment to upload (image or PDF, <= 10MB).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
file object The uploaded file.
file.file_id integer Id of the uploaded attachment. Pass to file_ids when adding a comment.
file.url string Public CDN URL where the attachment is served.

Printer Groups

Printer groups organize printers on the panel dashboard into named, ordered buckets. A printer belongs to at most one group; anything else lives in "No group" (represented as group: null on the printer row). All endpoints here are API-key only (OAuth disabled).

Get groups

curl https://api.simplyprint.io/{id}/groups/Get \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "groups": [
    {
      "id": 1375,
      "name": "Workshop A"
    },
    {
      "id": 99,
      "name": "Printers"
    }
  ]
}

List every printer group on the account in sort order.

GET /{id}/groups/Get

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
groups array Printer groups, in sort order.
groups[].id integer Unique identifier for the group.
groups[].name string Display name for the group.

Create group

curl https://api.simplyprint.io/{id}/groups/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{"name": "New Group Name"}'

Success response

{
  "status": true,
  "message": null,
  "id": 2048
}

Create a new printer group with the given name. Names must be unique within the account.

Required permission
printer_group_manage

Request Body

Parameter Type Required Description
name string yes Unique display name. 1-128 characters.

Response

Parameter Type Description
status boolean true if the group was created.
message string Error message (e.g. "Group name is not unique").
id integer ID of the newly-created group.
second_id integer Only present when this call created the first-ever group; id of the auto-created second group.

Update group

curl https://api.simplyprint.io/{id}/groups/Update?group=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{"name": "Updated Group Name"}'

Success response

{
  "status": true,
  "message": null
}

Rename an existing printer group. Names stay globally unique within the account; a rename collision returns an error rather than overwriting.

POST /{id}/groups/Update

Required permission
printer_group_manage

Query parameters

Parameter Type Required Description
group integer yes The ID of the group to update.

Request Body

Parameter Type Required Description
name string yes New name for the group. 1-128 characters.

Response

Parameter Type Description
status boolean true if the rename succeeded.
message string Error message (e.g. "Group doesn't exist or doesn't belong to you" returns HTTP 404; also "Group name is not unique").

Delete group

curl https://api.simplyprint.io/{id}/groups/Delete?group=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

Delete a printer group. Printers in the group are automatically moved:

The move preserves each printer's relative order from the deleted group.

POST /{id}/groups/Delete

Required permission
printer_group_manage

Query parameters

Parameter Type Required Description
group integer yes The ID of the group to delete.

Response

Parameter Type Description
status boolean true if the group was deleted and printers were re-homed.
message string Error message. Common values: "Group doesn't exist or doesn't belong to you" (HTTP 404), "Failed to move printer to new group", "Failed to delete printer group".

Arrange printers and groups

# Move multiple printers and groups in a single request
curl https://api.simplyprint.io/{id}/groups/ArrangeMultiple \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "group": [
      {"id": 123, "position": 1},
      {"id": 456, "position": 0}
    ],
    "printer": [
      {"id": 1234, "group": 123, "position": 0},
      {"id": 1235, "position": 2},
      {"id": 1236, "group": 456}
    ]
  }'

Success response

{
  "status": true,
  "message": null
}

The preferred way to reorder printers and groups: one request, atomic. Use this for drag-and-drop UI, bulk CSV imports, and any time you're changing more than one thing at a time.

The endpoint accepts two optional arrays:

  1. group[]: move printer groups to new sort positions. Each entry {id, position} sets the group's sortPosition to position (0-indexed).
  2. printer[]: move printers. Each entry {id, group?, position?} can:
    • Move a printer into a new group (set group to the new group's id).
    • Reorder a printer inside its current group (set position to the new index).
    • Do both at once (new group and new position).

At least one of group or printer must be non-empty. When a printer moves into a new group, omitting position places it at the end of the destination group.

POST /{id}/groups/ArrangeMultiple

Required permission
printer_group_manage

Request Body

Parameter Type Required Description
group array no Groups to move. Empty or absent = no group changes.
group[].id integer yes Group id to move.
group[].position integer yes New sortPosition for the group (0-indexed).
printer array no Printers to move. Empty or absent = no printer changes.
printer[].id integer yes Printer id to move.
printer[].group integer no Destination group id. Omit to keep the printer in its current group.
printer[].position integer no New position inside the (possibly new) group, 0-indexed. Omit to append to the end of the destination group.

Response

Parameter Type Description
status boolean true if the arrangement completed.
message string Error message. Common values: "Some printers or groups do not exist", "No printers or groups specified".

Arrange individual printer or group (deprecated)

# Move a printer's position within its current group
curl https://api.simplyprint.io/{id}/groups/Arrange?pid=1234&group=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{"from": 1, "to": 2}'
# Move a printer to a different group (pass from: null)
curl https://api.simplyprint.io/{id}/groups/Arrange?pid=1234&group=456 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{"from": null, "to": 2}'
# Reorder a group (no pid, pass the new position as "to")
curl https://api.simplyprint.io/{id}/groups/Arrange?group=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{"from": 1, "to": 3}'

Success response

{
  "status": true,
  "message": null
}

Three distinct operations in one endpoint:

POST /{id}/groups/Arrange

Required permission
printer_group_manage

Query parameters

Parameter Type Required Description
pid integer no Printer to move. Omit when reordering the group itself.
group integer yes For printer moves: destination group id. For group reorders: the group being moved.

Request Body

Parameter Type Required Description
from integer/null yes Current 0-indexed position. Set to null when moving a printer across groups.
to integer yes New 0-indexed position (within the destination group, or as the group's sort position).

Response

Parameter Type Description
status boolean true if the move succeeded.
message string Error message. Common values: "Group not found" (HTTP 404), "Printer not found" (HTTP 404), "No printer or group specified", "Failed to update sort order".

Files

Add an API File to files

POST {id}/files/Upload?folder={folder}

Parameter Type Required Description
folder (GET) integer no Folder ID to get files for. Defaults to 0 (root folder)
fileId (POST) string yes File ID from API Files

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
id string User file ID of newly added file
curl -X POST https://api.simplyprint.io/{id}/files/Upload?folder=5290 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -F 'fileId=43aaad56548c959f655d0524027b726a7514493ec8436f4942f876bb07eab731'

Success Response

{
  "status": true,
  "message": null,
  "id": "6f7d79212f384c6b8eae2811c37d9338"
}

List Files and Folders

curl https://api.simplyprint.io/{id}/files/GetFiles?f=123&search=benchy \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "files": [
    {
      "id": "d82ab9e1cc3c20850d94d5cf539390c0",
      "name": "3DBenchy",
      "ext": "stl",
      "type": "model",
      "size": 11285384,
      "created": "December 23, 2022, 17:35",
      "createdint": 1671813336,
      "printData": {
        "printsDone": 0,
        "printsCancelled": 0,
        "printsFailed": 0,
        "timesSliced": 0
      },
      "user_id": 123,
      "thumbnail": 1,
      "folder": 0,
      "user": 123
    },
    {
      "id": "e82ab9e1cc3c20850d94d5cf539390c0",
      "name": "3DBenchy",
      "ext": "gcode",
      "type": "printable",
      "size": 1285384,
      "created": "December 23, 2022, 18:00",
      "createdint": 1671813330,
      "printData": {
        "printsDone": 10,
        "printsCancelled": 5,
        "printsFailed": 0,
        "timesSliced": 0
      },
      "user_id": 123,
      "thumbnail": 1,
      "folder": 0,
      "user": 123,
      "forPrinters": [
        // list of printers IDs selected for file; key not present if no printers are selected 
        1,
        2,
        3
      ],
      "tags": {
        "nozzle": 0.6,
        "material": [
          {
            "ext": 0,
            "type": 123,
            "color": "Green",
            "hex": "#4CAF50"
          }
        ],
        "custom": [
          1,
          2,
          3
        ]
      },
      "cost": {
        "estimate": false,
        "total_cost": 150,
        "lines": [
          {
            "id": 1,
            "label": "Material usage (account default)",
            "cost": 0.02
          },
          {
            "id": 2,
            "label": "Material markup",
            "cost": null
          },
          {
            "id": 3,
            "label": "Machine run time cost",
            "cost": null
          },
          {
            "id": 4,
            "label": "Energy cost",
            "cost": null
          },
          {
            "id": 5,
            "label": "Labor cost",
            "cost": 1000
          }
        ]
      }
    }
  ],
  "customFields": [
    {
      "id": "student_id",
      "value": {
        "string": "1234567890"
      }
    }
  ],
  "folders": [
    {
      "id": 5290,
      "name": "random_folder_called_benchy",
      "items": {
        "files": 0,
        "folders": 0
      },
      "created": "December 23, 2022",
      "createdInt": 1671814215,
      "parent_folder_id": 0,
      "depth": 0
    }
  ],
  "path": [
    [
      "Your search...",
      0
    ]
  ],
  "sort_type": "",
  "space": 10000000000,
  "space_used": 131446609
}

This endpoint returns a list of files and folders in a given folder. If no folder is specified, the root folder is used.

Request

GET /{id}/files/GetFiles

Parameter Type Required Description
f integer no Folder ID to get files for. Defaults to 0 (root folder)
search string no Search string to filter files by.
global_search boolean no If true, search all files in the account, not just the folder specified by f.
pid integer no For print cost calculation, if you want the files to use the material of a printer, request with the ID of the printer - don't include the pid argument otherwise

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
files array Array of file objects.
folders array Array of folder objects.
path array Array of arrays containing the path to the current folder.
sort_type string Sort type from user's settings.
space integer The total space available in bytes.
space_used integer The total space used in bytes.

Move File(s) to Folder

curl https://api.simplyprint.io/{id}/files/MoveFiles?files=d82ab9e1cc3c20850d94d5cf539390c0&folder=5290 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": "Moved 1 files"
}

This endpoint moves one or more files to a given folder.

Request

GET /{id}/files/MoveFiles

Parameter Type Required Description
files array yes Array of file IDs to move. Separate multiple IDs with a comma.
folder integer yes Folder ID to move files to.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Get Folder Details

curl https://api.simplyprint.io/{id}/files/GetFolder?id=5290 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "folder": {
    "id": 5290,
    "name": "org_folder_called_benchy",
    "org": true,
    "permissions": {
      "view": [
        112,
        151
      ],
      "upload": [
        112
      ],
      "modify": [
        112
      ]
    }
  }
}

This endpoint returns details about a given folder.

Request

GET /{id}/files/GetFolder

Parameter Type Required Description
id integer yes Folder ID to get details for.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
folder object Folder object.
folder.id integer Folder ID.
folder.name string Folder name.
folder.org boolean True if the folder is an organization folder.
Requires Print Farm plan
folder.permissions object/null Folder permissions.
folder.permissions.view array Array of group IDs that can view the folder.
folder.permissions.upload array Array of group IDs that can upload files to the folder.
folder.permissions.modify array Array of group IDs that can modify the folder.

Move Folder

curl https://api.simplyprint.io/{id}/files/MoveFolder?folder=5290&target=5291 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": "Moved folder 5298 to folder 5297"
}

This endpoint moves a folder to a given folder.

Please note that the root folder cannot be moved, but folders can be moved into the root folder by setting target=0. Also, folders cannot be moved into themselves.

Request

GET /{id}/files/MoveFolder

Parameter Type Required Description
folder integer yes Folder ID to move.
target integer yes Folder ID to move to.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Delete File(s)

curl https://api.simplyprint.io/{id}/files/DeleteFile?file=abc123,def456 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "deleted": 2
}

Partial failure response (some files deleted, some failed)

{
  "status": false,
  "message": "One or more files failed to be deleted",
  "errors": [
    "File abc123 doesn't exist or doesn't belong to you"
  ],
  "deleted": 1
}

Failure response: no file IDs specified

{
  "status": false,
  "message": "No file ID(s) specified"
}

Failure response: no matching files found

{
  "status": false,
  "message": "No file(s) with ID(s) exist"
}

This endpoint deletes one or more files. Each file ID must belong to the requesting user and be modifiable; if any file cannot be deleted (e.g., due to missing permission or nonexistence), the call fails with error details.

Request

GET /{id}/files/DeleteFile

Parameter Type Required Description
file string yes Comma-separated list of file IDs to delete.

Response

Parameter Type Description
status boolean True if the request succeeded (all specified deletions succeeded).
message string/null Error message if something went wrong.
deleted integer Number of files actually deleted.
errors string[] (Optional) Array of error strings explaining why specific file deletions failed.

Delete Folder(s)

curl https://api.simplyprint.io/{id}/files/DeleteFolder?folder=123,456 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "deleted": 2
}

Partial failure response (some folders deleted, some failed during removal)

{
  "status": false,
  "message": "One or more folders failed to be deleted",
  "deleted": 1,
  "errors": [
    "Failed to remove folder with ID 456: underlying exception message"
  ]
}

Failure response: no folder IDs specified

{
  "status": false,
  "message": "No file ID(s) specified"
}

Failure response: folder does not exist or not modifiable (either because it’s missing or the user lacks permission)

{
  "status": false,
  "message": "One or more folders do not exist"
}

This endpoint deletes one or more folders. All specified folder IDs must exist and be modifiable by the requesting user; if existence or permission validation fails up front, the request fails immediately. If some deletions fail during removal, those errors are returned while successful deletions are counted.

Request

GET /{id}/files/DeleteFolder

Parameter Type Required Description
folder string yes Comma-separated list of folder IDs to delete.

Response

Parameter Type Description
status boolean True if the request succeeded (all specified deletions succeeded).
message string/null null on full success; error message if something went wrong.
deleted integer Number of folders actually deleted.
errors string[] (Optional) Array of error strings explaining failures during deletion (partial failure).

Account

Create company groups

curl https://api.simplyprint.io/{id}/account/settings/groups/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "ranks": [
      {
        "title": "name of group",
        "description": "group description",
        "sort_order": 3,
        "permissions": {
          "view_news": true,
          "org_admin": true
        }
      }
    ]
  }'

Success response

{
  "status": true,
  "message": null,
  "data": [
    {
      "title": "name of group",
      "description": "group description",
      "company_id": 2,
      "company_type": 2,
      "sort_order": 3,
      "permissions": {
        "view_news": true,
        "org_admin": true,
        "panel_printing": true,
        "printer_restart": true,
        "printer_edit": true,
        "bed_leveling": true,
        "gcode_profiles": true,
        "printer_settings": true,
        "filament_settings": true,
        "change_filament": true,
        "create_filament": true,
        "see_filament_tab": true,
        "view_users": true,
        "change_user_rank": true,
        "manual_user_email_confirm": true,
        "invite_users": true,
        "delete_user": true,
        "org_user_registration_settings": true,
        "org_hub_settings": true,
        "org_rank_management": true,
        "org_view_statistics": true,
        "refill_quota": true,
        "custom_slicer_profiles": true,
        "org_profiles": true,
        "all_slicer_modes": true,
        "queue_remove_all": true,
        "org_api": true,
        "create_org_folder": true,
        "cancel_others": true,
        "see_who_printed": true,
        "max_print_size": [],
        "default_slicer_mode": 2
      },
      "id": 319
    }
  ]
}
Required permissions
org_rank_management

This endpoint creates a new group in the company.

Request

POST /{id}/account/settings/groups/Create

Parameter Type Required Description
ranks array yes Array of groups to create.
ranks[].title string yes The name of the group.
ranks[].description string no The description of the group.
ranks[].sort_order integer yes The sort index of the group.
ranks[].permissions object yes Object containing permissions for the group. Use permission strings from the Permissions table as keys with boolean values.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array Array of the created groups.

Update company groups

curl https://api.simplyprint.io/{id}/account/settings/groups/Update \
  -X POST \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "ranks": [
      {
        "id": 319,
        "title": "TITLE",
        "description": "DESCRIPTION",
        "permissions": {
          "view_news": true,
          "org_admin": true
        },
        "sort_order": 3
      }
    ]
  }'

Success repsonse

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 319,
      "title": "NAME",
      "description": "DESCRIPTION",
      "company_id": 2,
      "company_type": 2,
      "permissions": {
        "view_news": true,
        "org_admin": true,
        "panel_printing": true,
        "printer_restart": true,
        "printer_edit": true,
        "bed_leveling": true,
        "gcode_profiles": true,
        "printer_settings": true,
        "filament_settings": true,
        "change_filament": true,
        "create_filament": true,
        "see_filament_tab": true,
        "view_users": true,
        "change_user_rank": true,
        "manual_user_email_confirm": true,
        "invite_users": true,
        "delete_user": true,
        "org_user_registration_settings": true,
        "org_hub_settings": true,
        "org_rank_management": true,
        "org_view_statistics": true,
        "refill_quota": true,
        "custom_slicer_profiles": true,
        "org_profiles": true,
        "all_slicer_modes": true,
        "queue_remove_all": true,
        "org_api": true,
        "create_org_folder": true,
        "cancel_others": true,
        "see_who_printed": true,
      },
      "sort_order": 3,
      "created": "2023-01-03 14:35:28"
    }
  ]
}
Required permissions
org_rank_management

This endpoint updates the groups in the company.

Request

POST /{id}/account/settings/groups/Update

Parameter Type Required Description
ranks array yes Array of groups to update.
ranks[].id integer yes The id of the group to update.
ranks[].title string no The name of the group.
ranks[].description string no The description of the group.
ranks[].permissions object no Object containing permissions for the group. Use permission strings from the Permissions table as keys with boolean values.
ranks[].sort_order integer no The sort index of the group.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array Array of the updated groups.
data[].id integer The id of the group.
data[].title string The name of the group.
data[].description string The description of the group.
data[].company_id integer The id of the company.
data[].company_type integer The type of the company.
data[].permissions object Object containing permissions for the group. Use permission strings from the Permissions table as keys with boolean values.
data[].sort_order integer The sort order of the group.
data[].created string The date and time the group was created.

Get company groups

curl https://api.simplyprint.io/{id}/account/GetGroups \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "groups": [
    {
      "id": 112,
      "name": "Administrator"
    },
    {
      "id": 151,
      "name": "Manager"
    },
    {
      "id": 153,
      "name": "User"
    }
  ]
}
Required permissions
org_rank_management

This endpoint returns a list of groups that exist in the company.

Request

GET /{id}/account/GetGroups

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
groups array Array of group objects.
groups[].id integer Group ID.
groups[].name string Group name.
groups[].description string Group description.

Delete company group

curl https://api.simplyprint.io/{id}/account/settings/groups/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"id": 112, "replacementRankId": 151}'

Success response

{
  "status": true,
  "message": null
}
Required permissions
org_rank_management

Request

POST /{id}/account/settings/groups/Delete

Parameter Type Required Description
id integer yes The id of the group to delete.
replacementRankId integer maybe The id of the group to replace the deleted group with.
This is only required if the group has users.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Get statistics

curl https://api.simplyprint.io/{id}/account/GetStatistics \
  -X POST \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"users": [1234, 1235, 1945], "printers": [1234, 1235, 1945], "start_date": "1677629786", "end_date": "1677629786"}'

Success response

{
  "status": true,
  "message": null,
  "data": {
    "total_print_seconds": 1234,
    "total_filament_usage_gram": 1241.1231231,
    "print_job_count": 123,
    "regretted_print_jobs": 123,
    "failed_print_jobs": 123,
    "printer_error_print_jobs": 123,
    "done_print_jobs": 123,
    "date_range": {
      "from": "2023-02-22",
      "to": "2023-03-02",
      "general": false
    },
    "printers": {
      "3104": {
        "name": "Printer 1",
        "done": 0,
        "failed": 0,
        "printer_error": 0,
        "regretted": 0,
        "filament_usage_gram": 0
      },
      ...
    },
    "print_jobs": [
      {
        "date": "2023-02-27",
        "started": "2023-02-27 11:39:34",
        "ended": "2023-02-27 11:56:18",
        "cancelled": 1,
        "failed": 0,
        "cancel_reason_type": 5,
        "print_seconds": 1004,
        "filament_usage_gram": 0.03758012402132279
      },
      ...
    ]
  }
}

This endpoint returns statistics for the user / company.

Request

POST /{id}/account/GetStatistics

Parameter Type Required Description
users array no Array of user ids to get statistics for. Don't include this parameter to get statistics for all users.
printers array no Array of printer ids to get statistics for. Don't include this parameter to get statistics for all printers.
start_date string no The start date of the statistics. Provide a unix timestamp in seconds.
end_date string no The end date of the statistics. Provide a unix timestamp in seconds.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data object Statistics object.
data.total_print_seconds integer Total print seconds.
data.total_filament_usage_gram float Total filament usage in grams.
data.print_job_count integer Total print job count.
data.regretted_print_jobs integer Total regretted print job count.
data.failed_print_jobs integer Total failed print job count.
data.printer_error_print_jobs integer Total printer error print job count.
data.done_print_jobs integer Total successful print job count.
data.date_range object Date range object.
data.date_range.from string Start date of the statistics.
data.date_range.to string End date of the statistics.
data.date_range.general boolean True if the date range is general.
data.printers object Object of printer statistics.
data.printers.{id} object Printer statistics object.
data.printers.{id}.name string Printer name.
data.printers.{id}.done integer Successful print job count.
data.printers.{id}.failed integer Failed print job count.
data.printers.{id}.printer_error integer Printer error print job count.
data.printers.{id}.regretted integer Regretted print job count.
data.printers.{id}.filament_usage_gram float Filament usage in grams.
data.print_jobs array Array of print job statistics.
data.print_jobs[].date string Date of the print job.
data.print_jobs[].started string Start time of the print job.
data.print_jobs[].ended string End time of the print job.
data.print_jobs[].cancelled integer True if the print job was cancelled.
data.print_jobs[].failed integer True if the print job failed.
data.print_jobs[].cancel_reason_type integer The reason for cancelling the print job.
data.print_jobs[].print_seconds integer Print seconds.
data.print_jobs[].filament_usage_gram float Filament usage in grams.

User Management

Get Company Users

curl https://api.simplyprint.io/{id}/users/GetPaginatedUsers \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "page": 1,
    "page_size": 10,
    "approved": true,
    "search": "John Doe",
    "sort_id": 1,
    "sort_dir": "asc"
  }'

Success response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 1234,
      "relation_id": 4321,
      "name": "John Doe",
      "email_confirmed": true,
      "email": "johndoe@example.com",
      "phone": "",
      "relation_created_at": "2022-07-28 23:30:14",
      "last_online": "2023-03-02 15:44:44",
      "approved_at": "2022-07-29 11:14:52",
      "org_account": false,
      "total_prints": 68,
      "rank": 185,
      "teacher": false,
      "classes": [
        1234,
        5678
      ]
    }
  ],
  "page_amount": 1
}
Required permissions
view_users

Request

POST /{id}/users/GetPaginatedUsers

Parameter Type Required Description
page integer yes The page number to retrieve.
page_size integer yes The number of users to retrieve per page.
approved boolean no If true, only approved users will be returned. If false, only pending users will be returned.
Defaults to true
search string no A search string to filter the users by. Searches for name, email and phone number.
sort_id string no Which field to sort by. Options: name, contact, rank, lastOnline, added, totalPrints.
sort_dir string no The sort direction. Either asc or desc.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
page_amount integer The total number of pages.
data array An array of users.
data[].id integer The id of the user.
data[].relation_id integer The id of the user-company relation.
data[].name string The name of the user.
data[].email_confirmed boolean True if the user has confirmed their email address.
data[].email string The email address of the user.
data[].phone string The phone number of the user.
data[].relation_created_at string The date and time the user joined the company.
data[].sso boolean True if the user was created via SSO.
Approved users only
data[].last_online string The date and time the user was last online.
data[].approved_at string The date and time the user was approved.
data[].org_account boolean True if the user is an organization account.
data[].total_prints integer The total number of prints the user has made on this company.
data[].rank integer The id of the rank of the user.
Schools only
data[].teacher boolean True if the user is a teacher.
data[].classes array An array of class IDs the user is a member of.
curl https://api.simplyprint.io/{id}/users/CreateInvitationLink \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "maxUses": 10
  }'

Success response

{
  "status": true,
  "message": null,
  "link": "https://simplyprint.io/accept_invitation/b3d9b5a0-5b5b-11e9-8d7c-2d3b9e84aafd"
}
Required permissions
invite_users

This endpoint creates an invitation link that can be used to invite new users to the company. Please note that links with unlimited uses expire at the end of the day.

Request

POST /{id}/users/CreateInvitationLink

Parameter Type Required Description
maxUses integer no The maximum number of times the link can be used. Specify 0 for unlimited uses.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
link string The invitation link.

Invite Users By Email

curl https://api.simplyprint.io/{id}/users/InviteSpecificUser \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "emails": [
      "test@example.com",
      "test2@example.com"
    ],
    "rank": 192,
    "lang": "en"
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
invite_users

This endpoint invites one or more users to the company by email.

Request

POST /{id}/users/InviteSpecificUser

Parameter Type Required Description
emails string[] yes The emails of the users to invite.
rank integer no The rank id that the users should be assigned.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Accept or Deny Pending User

curl https://api.simplyprint.io/{id}/users/SetPendingUserState \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "relation_id": 1234,
    "approve": true,
    "notify": true
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
invite_users

Request

POST /{id}/users/SetPendingUserState

Parameter Type Required Description
relation_id integer yes The id of the pending user-company relation.
approve boolean yes True to approve the user, false to deny.
notify boolean yes True to notify the user of the decision. Will send an email if the user has an email address.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Change User Rank

curl https://api.simplyprint.io/{id}/users/ChangeUserRank \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "relation_id": 1234,
    "rank_id": 192
  }'

Success response

{
  "status": true,
  "message": null
}

Request

POST /{id}/users/ChangeUserRank

Parameter Type Required Description
relation_id integer yes The id of the user-company relation.
rank_id integer yes The id of the rank to assign to the user.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Delete User

curl https://api.simplyprint.io/{id}/users/DeleteUser \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "user_id": 1234
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
delete_user

This endpoint deletes a user from the company. Use this endpoint with caution.

Request

POST /{id}/users/DeleteUser

Parameter Type Required Description
user_id integer yes The id of the user to delete.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Set Teacher

POST /{id}/users/SetIsTeacher

Example request

curl -X POST \
https://api.simplyprint.io/{id}/users/SetIsTeacher \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: {API_KEY}' \
-d '{"relation_id": 123, "is_teacher": true}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
relation_id integer yes The ID of the company-user relation to update.
is_teacher boolean yes Set to true to mark the user as a teacher or false otherwise.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Schools

List classes

GET /{id}/account/settings/school/classes/GetClasses

Example request

curl https://api.simplyprint.io/{id}/account/settings/school/classes/GetClasses \
-H 'accept: application/json' \
-H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "objects": {
    "classes": [
      {
        "id": 1,
        "name": "Class A",
        "endMonthDay": "06-30",
        "fullStartDate": "2024-09-01",
        "fullEndDate": "2025-06-30",
        "nextClass": 2,
        "deleteUserAfterClassEnd": false,
        "autoNextClass": true,
        "googleClassroomLink": "https://classroom.google.com/c/...",
        "ssoGroupId": "group_id",
        "lastSsoSync": "2024-09-01T12:00:00Z",
        "updatedAt": "2024-09-07T08:30:00Z",
        "createdAt": "2024-08-30T08:30:00Z",
        "sortPosition": 1
      }
    ],
    "settings": {
      "defaultClass": 1,
      "maxClasses": 5,
      "userCanAddClasses": true
    }
  }
}

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
objects object The main object containing the response data.
objects.classes array An array of classes.
objects.classes[].id integer The unique ID of the class.
objects.classes[].name string The name of the class.
objects.classes[].endMonthDay string The end month and day of the class (MM-DD format).
objects.classes[].fullStartDate string The full start date of the class (YYYY-MM-DD format).
objects.classes[].fullEndDate string The full end date of the class (YYYY-MM-DD format).
objects.classes[].nextClass integer The ID of the next class, if any.
objects.classes[].deleteUserAfterClassEnd boolean Whether to delete the user after the class ends.
objects.classes[].autoNextClass boolean Whether to automatically enroll in the next class.
objects.classes[].googleClassroomLink string The Google Classroom link associated with the class.
objects.classes[].ssoGroupId string The SSO group ID associated with the class.
objects.classes[].lastSsoSync string The timestamp of the last SSO sync, or null if never synced.
objects.classes[].updatedAt string The timestamp of the last update (UTC).
objects.classes[].createdAt string The timestamp of when the class was created (UTC).
objects.classes[].sortPosition integer The sort position of the class.
objects.settings object The settings related to school classes.
objects.settings.defaultClass integer The ID of the default class.
objects.settings.maxClasses integer The maximum number of classes per user, or null if unlimited.
objects.settings.userCanAddClasses boolean Whether the user has permission to add new classes.

Create or update a class

Required permissions
org_school_settings_manage

POST /{id}/account/settings/school/classes/SaveClass

Example Request

{
  "id": 1,
  "name": "Physics 101",
  "endMonthDay": "12-31",
  "fullStartDate": "2024-01-01",
  "fullEndDate": "2024-12-31",
  "autoNextClass": true,
  "nextClass": 2,
  "deleteUserAfterClassEnd": false,
  "googleClassroomLink": "https://classroom.google.com/c/abc123",
  "ssoGroupId": "group1"
}

Request Parameters

Parameter Type Required Description
id integer No The unique ID of the class. If provided, the endpoint updates the existing class; otherwise, a new class is created.
name string Yes The name of the class (maximum length: 16 characters).
endMonthDay string No The end month and day of the class in MM-DD format.
fullStartDate string No The full start date of the class in YYYY-MM-DD format.
fullEndDate string No The full end date of the class in YYYY-MM-DD format.
autoNextClass boolean No Indicates if users should be automatically enrolled in the next class.
nextClass integer No The ID of the next class, if autoNextClass is true.
deleteUserAfterClassEnd boolean No Indicates if the user should be deleted after the class ends.
googleClassroomLink string No The URL to the Google Classroom link associated with the class. Must be a valid HTTPS URL.
ssoGroupId string No The SSO group ID associated with the class.

Response

Parameter Type Description
objects object The main object containing the response data.
objects.class object The saved class object.
objects.class.id integer The unique ID of the class.
objects.class.name string The name of the class.
objects.class.endMonthDay string The end month and day of the class (MM-DD format).
objects.class.fullStartDate string The full start date of the class (YYYY-MM-DD format).
objects.class.fullEndDate string The full end date of the class (YYYY-MM-DD format).
objects.class.autoNextClass boolean Indicates if users are automatically enrolled in the next class.
objects.class.nextClass integer The ID of the next class, if applicable.
objects.class.deleteUserAfterClassEnd boolean Indicates if users should be deleted after the class ends.
objects.class.googleClassroomLink string The Google Classroom link associated with the class.
objects.class.ssoGroupId string The SSO group ID associated with the class.
objects.class.lastSsoSync string The date and time of the last SSO synchronization in UTC format, or null if none.
objects.class.updatedAt string The date and time when the class was last updated in UTC format, or null if none.
objects.class.createdAt string The date and time when the class was created in UTC format, or null if none.
objects.class.sortPosition integer The sort position of the class.

Slicer

List Slicer Profiles

curl https://api.simplyprint.io/{id}/slicer/ListProfiles \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "profiles": [
    {
      "id": 785,
      "name": "Prusa profile",
      "for_printers": null,
      "org": true
    }
  ]
}

This endpoint returns a list overview of slicer profiles that the user has access to. Includes personal and company profiles.

Request

GET /{id}/slicer/ListProfiles

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.
profiles array An array of profile objects.
profiles.*.id integer The ID of the profile.
profiles.*.name string The name of the profile.
profiles.*.for_printers array The printers ids that this profile is made for.
profiles.*.org boolean True if this profile is owned by the company, and not by the user.

Get Slicer Profile

curl https://api.simplyprint.io/{id}/slicer/Get?id=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "profile": {
    "id": 785,
    "name": "Prusa profile",
    "settings": {
      "sliceHeight": 0.2,
      "sliceFillSparse": 30,
      "sliceShells": 2,
      "sliceShellOrder": "in-out",
      "sliceTopLayers": 3,
      "sliceSolidLayers": 2,
      "sliceBottomLayers": 2,
      "outputFillMult": 1.1,
      "sliceFillAngle": 45,
      "outputShellMult": 1,
      "outputCoastDist": 0,
      "sliceSolidMinArea": 5,
      "sliceMinHeight": 0,
      "sliceLayerStart": "center",
      "sliceFillType": "hex",
      "sliceFillRate": 130,
      "outputSparseMult": 1.1,
      "sliceFillOverlap": 35,
      "firstSliceHeight": 0.2,
      "firstLayerLineMult": 100,
      "firstLayerFillRate": 35,
      "firstLayerRate": 10,
      "firstLayerPrintMult": 1,
      "firstLayerFanSpeed": 0,
      "sliceSupportOutline": 1,
      "sliceSupportAngle": 1,
      "sliceSupportDensity": 25,
      "sliceSupportSize": 6,
      "sliceSupportOffset": 0.4,
      "sliceSupportGap": 0,
      "sliceSupportSpan": 5,
      "sliceSupportArea": 0.25,
      "sliceSupportExtra": 0,
      "outputBrimCount": 0,
      "outputBrimOffset": 2,
      "outputRaftSpacing": 0.3,
      "outputSeekrate": 150,
      "outputFanLayer": 2,
      "fanSpeed": 100,
      "outputRetractDist": 1,
      "outputRetractSpeed": 100,
      "outputRetractDwell": 0,
      "outputRetractWipe": 2,
      "outputShortPoly": 50,
      "zHopDistance": 0,
      "antiBacklash": 0,
      "gcodePause": 0,
      "newLayerGcode": "",
      "firstLayerBeltLead": 0,
      "firstLayerBeltBump": 0,
      "firstLayerFlatten": 0,
      "firstLayerBrimIn": 0,
      "sliceSupportEnable": 0,
      "outputRaft": 0,
      "outputLayerRetract": 0
    },
    "for_printers": null,
    "org": true
  }
}

This endpoint can be used to get a slicer profile by its ID. This includes the settings of the profile.

Request

GET /{id}/printers/Delete

Parameter Type Required Description
id integer yes The id of the profile to fetch.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.
profile object The profile object.
profile.id integer The ID of the profile.
profile.name string The name of the profile.
profile.settings object The settings of the profile.
profile.for_printers array The printers ids that this profile is made for.
profile.org boolean True if this profile is owned by the company, and not by the user.

Save or Create Slicer Profile

curl https://api.simplyprint.io/{id}/slicer/SaveProfile?id=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

TODO

Delete Slicer Profile

curl https://api.simplyprint.io/{id}/slicer/DeleteProfile?id=1234 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}
Required permissions Description
slicer_org_profiles If the profile is owned by the company.

This endpoint can be used to delete a slicer profile by its ID.

Request

GET /{id}/printers/Delete

Parameter Type Required Description
id integer yes The id of the profile to delete.

Response

Field Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Tags

Tags describe what a printer, printer group, file, or queue item is set up for. SimplyPrint treats five things as tags: nozzle size / type, material, bed type, and custom tags (free-form labels you create). The queue matcher uses these to decide which queue items can print on which printers, so they are worth setting accurately on both sides.

All tags are assigned through the single Assign tags endpoint. The four tag kinds each have their own payload shape, documented below.

Custom tags and custom bed types are created and listed through dedicated endpoints; stock bed types and material types come from built-in enums (bed type enum reference).

Create or update custom tag

curl https://api.simplyprint.io/{id}/tags/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "name": "Nighttime only",
    "badge": "info"
  }'

Success response

{
  "status": true,
  "message": null,
  "id": 993,
  "tags": [
    {
      "id": 30,
      "name": "Tag 1",
      "badge": "light",
      "used_by": {
        "printers": 0,
        "printer_groups": 0,
        "files": 7,
        "queue_items": 6
      }
    },
    {
      "id": 31,
      "name": "Tag 2",
      "badge": "dark",
      "used_by": {
        "printers": 0,
        "printer_groups": 0,
        "files": 5,
        "queue_items": 1
      }
    }
  ]
}
Required permissions
edit_tags
Required OAuth scopes
tags.write

Creates a new custom tag, or updates an existing one when id is provided. Tag names must be unique per account.

Request

POST /{id}/tags/Create

Parameter Type Required Description
id integer no ID of the tag to update. Omit to create a new tag.
name string yes Tag name (max 32 chars).
badge string yes Badge color. One of the values in the colors reference.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
id integer ID of the created or updated tag.
tags array Full list of custom tags on the account after the write.
tags[].id integer Tag id.
tags[].name string Tag name.
tags[].badge string Badge color of the tag.
tags[].used_by object Reference counts. Only present when the tag is attached to at least one subject.
tags[].used_by.printers integer Number of printers the tag is attached to.
tags[].used_by.printer_groups integer Number of printer groups the tag is attached to.
tags[].used_by.files integer Number of files the tag is attached to.
tags[].used_by.queue_items integer Number of queue items the tag is attached to.

Get custom tag(s)

curl https://api.simplyprint.io/{id}/tags/Get \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

All tags

{
  "status": true,
  "message": null,
  "tags": [
    {
      "id": 136,
      "name": "jobox2",
      "badge": "light",
      "used_by": {
        "printers": 1,
        "printer_groups": 0,
        "files": 0,
        "queue_items": 3
      }
    },
    {
      "id": 130,
      "name": "jobox",
      "badge": "light",
      "used_by": {
        "printers": 1,
        "printer_groups": 0,
        "files": 0,
        "queue_items": 8
      }
    }
  ]
}
curl 'https://api.simplyprint.io/{id}/tags/Get?id=130' \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

A single tag

{
  "status": true,
  "message": null,
  "tag": {
    "id": 130,
    "name": "jobox",
    "badge": "light",
    "used_by": {
      "printers": 1,
      "printer_groups": 0,
      "files": 5,
      "queue_items": 8
    }
  }
}
Required OAuth scopes
tags.read

Returns all custom tags on the account, or a single tag when id is supplied. Only custom tags are returned - built-in tag kinds (nozzle, material, bed type) come from enums instead.

Request

GET /{id}/tags/Get

Parameter Type Required Description
id integer no Tag id to fetch. Omit to return the full list.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
tag object Present only when id was supplied. Same shape as tags[] entries.
tags array Present only when id was omitted. Array of tag objects (same shape as tags[] above).

Delete custom tag

curl 'https://api.simplyprint.io/{id}/tags/Delete?id=993' \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "tags": [
    {
      "id": 30,
      "name": "Tag 1",
      "badge": "light",
      "used_by": {
        "printers": 0,
        "printer_groups": 0,
        "files": 7,
        "queue_items": 6
      }
    },
    {
      "id": 31,
      "name": "Tag 2",
      "badge": "dark",
      "used_by": {
        "printers": 0,
        "printer_groups": 0,
        "files": 5,
        "queue_items": 1
      }
    }
  ]
}
Required permissions
edit_tags
Required OAuth scopes
tags.write

Deletes a custom tag and detaches it from every subject it was attached to.

Request

GET /{id}/tags/Delete

Parameter Type Required Description
id integer yes Tag id to delete.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
tags array Full list of remaining custom tags after the delete.

Create or update custom bed type

curl https://api.simplyprint.io/{id}/bed_types/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "name": "Shop-floor garolite",
    "generic_bed_type": "high_temp_plate",
    "brands": ["Bambu Lab"]
  }'

Success response

{
  "status": true,
  "message": null,
  "id": 2,
  "custom_bed_types": [
    {
      "id": 2,
      "type": "custom",
      "genericBedType": "smooth_pei_plate",
      "fullName": "Shop-floor garolite",
      "shortName": "Shop-floor garolite",
      "brands": [
        "Bambu Lab"
      ],
      "printerModels": null,
      "buyLink": null,
      "coldBed": false,
      "childOf": null,
      "image": null,
      "minTemperature": null,
      "maxTemperature": null,
      "isOfficialFromBrand": null,
      "isAftermarket": false,
      "deprecated": false,
      "notes": null,
      "description": null,
      "gcodeIdentifiers": null,
      "slicing": {
        "orcaslicer": {
          "settingsKey": "curr_bed_type",
          "value": "High Temp Plate",
          "default": true
        },
        "bambustudio": {
          "settingsKey": "curr_bed_type",
          "value": "High Temp Plate",
          "default": true
        }
      },
      "custom": true
    }
  ]
}
Required permissions
edit_tags
Required OAuth scopes
tags.write

Creates a new custom bed type (build plate), or updates an existing one when id is set. Use custom bed types to represent aftermarket or in-house plates that aren't covered by the built-in bed type enum.

Bed type images are not uploadable through the API - create the record here, then upload an image through the SimplyPrint panel.

Request

POST /{id}/bed_types/Create

Parameter Type Required Description
id integer no ID of an existing custom bed type to update. Omit to create a new one.
name string yes Display name (max 64 chars). Must be unique per account.
generic_bed_type string no Slicer mapping: one of smooth_cool_plate, engineering_plate, smooth_high_temp_plate, high_temp_plate, textured_pei_plate, smooth_pei_plate, textured_cool_plate, textured_high_temp_plate, supertack_plate, glass_plate, pp_plate. Determines which stock slicer profile is used for this custom plate.
brands string[] no Brand names the bed type is intended for (e.g. ["Prusa", "Elegoo"]).

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
id integer ID of the created or updated custom bed type.
custom_bed_types array Full list of custom bed types on the account after the write.
custom_bed_types[].id integer Custom bed type id.
custom_bed_types[].type string Always "custom".
custom_bed_types[].genericBedType string / null The generic_bed_type mapping, if set.
custom_bed_types[].fullName string Display name.
custom_bed_types[].shortName string Short name (currently same as fullName).
custom_bed_types[].brands string[]/null Brands the plate is intended for.
custom_bed_types[].image string / null Public CDN URL of the bed type image, when one has been uploaded through the panel.
custom_bed_types[].slicing object Slicer-specific settings to emit when slicing with this plate. Keyed by slicer (orcaslicer, bambustudio).
custom_bed_types[].custom boolean Always true for custom bed types.

Delete custom bed type

curl 'https://api.simplyprint.io/{id}/bed_types/Delete?id=2' \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "custom_bed_types": []
}
Required permissions
edit_tags
Required OAuth scopes
tags.write

Deletes a custom bed type. Any printer or queue item that had this bed type attached falls back to no bed type set.

Request

GET /{id}/bed_types/Delete

Parameter Type Required Description
id integer yes Custom bed type id to delete.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.
custom_bed_types array Full list of remaining custom bed types after the delete.

Assign tags overview

All four tag kinds (nozzle, material, custom, bed type) go through the same tags/Assign endpoint. The parameters fall into two groups: subject fields (what to tag) and payload fields (which tags to set).

The detailed sections below show the payload shape for each tag kind. You can combine multiple kinds in a single call (e.g. set nozzleData + material + bedType together).

Request

POST /{id}/tags/Assign

Subject (shared across all tag kinds)

Parameter Type Required Description
type integer yes Subject kind: 1 = printer, 2 = printer group, 3 = file, 4 = queue item.
id integer/string yes (or ids) Subject id.
ids array yes (or id) Array of subject ids for bulk assign.
edited string no Which aspect is being changed: nozzle, material, custom, or bedType. Only used for the audit log entry; the endpoint applies whatever payload fields are present.
override boolean no When using ids (bulk), if true each subject's existing tags are cleared before the new ones are applied.
detach_tag_ids integer[] no Custom tag ids to detach in the same call.

Permissions and OAuth scope per subject type

The permission and OAuth scope required depend on the subject type:

Subject type Permission OAuth scope
1 printer edit_printer printers.write
2 printer group edit_printer_group printers.write
3 file edit_file files.write
4 queue item print_queue queue.write

Assigning a custom tag additionally requires the edit_tags permission. Using custom bed types additionally requires the Print Farm plan; custom tags themselves require the Print Farm plan too. Stock bed types (from the bed type enum), nozzle size, and material are available on all plans.

Response

All four assignments return the same envelope:

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Assign nozzle size tag

curl https://api.simplyprint.io/{id}/tags/Assign \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "type": 1,
    "id": 48013,
    "edited": "nozzle",
    "nozzleData": [
      {"size": 0.4, "i": 0, "type": "hardened_steel", "volumeType": "standard"}
    ]
  }'

Success response

{
  "status": true,
  "message": null
}

Sets the nozzle(s) currently installed on a printer (or the nozzle a file was sliced for). Multi-nozzle machines send one entry per nozzle, indexed by i.

Payload

Parameter Type Required Description
nozzleData array yes One entry per nozzle.
nozzleData[].size number yes Nozzle diameter in mm (0 to 100).
nozzleData[].i integer no Nozzle index (0-based). Default: 0. Required on multi-nozzle machines.
nozzleData[].type string no Nozzle material: standard, plated_brass, hardened_steel, stainless_steel, tungsten_carbide, ruby_tipped, hemispherical.
nozzleData[].volumeType string no Volume class: standard, high_flow.
nozzle number no Deprecated - single-nozzle shorthand. Pass nozzleData instead.

To clear the nozzle(s), send nozzleData: [].

Assign material tag

curl https://api.simplyprint.io/{id}/tags/Assign \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "type": 1,
    "id": 48013,
    "edited": "material",
    "material": [
      {"ext": 0, "type": 1, "hex": "#ff3547", "color": "Red"}
    ]
  }'

Success response

{
  "status": true,
  "message": null
}

Sets the material(s) currently loaded on a printer (or the material a file was sliced for). Multi-material setups send one entry per extruder, indexed by ext.

Payload

Parameter Type Required Description
material array yes One entry per extruder.
material[].ext integer yes Extruder index (0-based, 0 to 1000).
material[].type integer no Filament profile id (from filament_profiles). A null/omitted type means "unknown material, color only".
material[].color string no Color display name (max 32 chars, e.g. "Red", "Matte Black").
material[].hex string no Color hex code (e.g. "#ff3547"). Max 9 chars (supports #RRGGBBAA).

To clear the materials, send material: [].

Assign custom tag

curl https://api.simplyprint.io/{id}/tags/Assign \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "type": 1,
    "id": 48013,
    "edited": "custom",
    "tag_id": 993,
    "custom": [993, 994]
  }'

Success response

{
  "status": true,
  "message": null
}

Attaches one or more custom tags (created through Create or update custom tag) to a subject.

Payload

Parameter Type Required Description
tag_id integer yes when edited=custom Primary custom tag id being attached. Required by the validator; for multi-tag assignment, pass the first id here and the full list in custom.
custom integer[] no Full list of custom tag ids to set on the subject. Replaces the subject's existing custom tags.
tag_ids integer[] no Alias for custom (accepted for backwards compatibility; use custom in new code).

To detach custom tags, either call Detach custom tag, or send custom: [] alongside tag_id set to the id being detached last.

Assign bed type tag

curl https://api.simplyprint.io/{id}/tags/Assign \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "type": 1,
    "id": 48013,
    "edited": "bedType",
    "bedType": {"type": "bambu_textured_pei_plate"}
  }'
curl https://api.simplyprint.io/{id}/tags/Assign \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "type": 1,
    "id": 48013,
    "edited": "bedType",
    "bedType": {"type": "custom", "custom": 2}
  }'

Success response

{
  "status": true,
  "message": null
}

Sets the bed type (build plate) currently installed on a printer, or the plate a file was sliced for. Pass either a built-in bed type from the enum reference, or type: "custom" with a custom bed type id from Create or update custom bed type.

Payload

Parameter Type Required Description
bedType object / null yes Bed type object. Pass null to clear the bed type.
bedType.type string yes A value from the bed type enum, or the literal string "custom" when using a custom plate.
bedType.custom integer only when bedType.type = "custom" Custom bed type id (from Create or update custom bed type).

Detach custom tag

curl https://api.simplyprint.io/{id}/tags/Detach \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "type": 1,
    "id": 48013,
    "tag_id": 993
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
edit_tags

Removes a single custom tag from a printer, printer group, file, or queue item. To clear other tag kinds (nozzle, material, bed type), use Assign tags with an empty payload for that kind.

Request

POST /{id}/tags/Detach

Parameter Type Required Description
type integer yes Subject kind: 1 = printer, 2 = printer group, 3 = file, 4 = queue item.
id integer/string yes Subject id.
tag_id integer yes Custom tag id to detach.

The OAuth scope required depends on type: printers.write for printer / printer group, files.write for file, queue.write for queue item.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Success message or error message if status is false.

Colors

Custom tag badges use one of these named colors.

Color Name Preview
Blue primary Primary
Purple secondary Secondary
Green success Success
Red danger Danger
Yellow warning Warning
Turquoise info Info
Light grey light Light
Dark dark Dark

Bed type enum reference

Use these string values for bedType.type in Assign bed type tag. Custom plates created through Create or update custom bed type use type: "custom" plus custom: <id>.

Brand Values
Prusa prusa_smooth_sheet, prusa_textured_sheet, prusa_satin_sheet, prusa_nylon_sheet, prusa_pp_sheet
Bambu Lab bambu_cool_plate, bambu_cool_plate_supertack, bambu_engineering_plate, bambu_smooth_pei_plate, bambu_textured_pei_plate, bambu_3d_effect_plate, bambu_galaxy_surface_plate, bambu_starry_surface_plate, bambu_diamond_effect_plate, bambu_carbon_fiber_effect_plate
BIQU Panda biqu_panda_designer_honeycomb, biqu_panda_build_plate_designer_houndstooth, biqu_panda_cryogrip_frostbite, biqu_panda_cryogrip_glacier, biqu_panda_cryogrip_textured_steel_sheet, biqu_cryogrip_frostbite_snapmaker, biqu_cryogrip_glacier_snapmaker
Snapmaker snapmaker_textured_pei_sheet, snapmaker_smooth_pei_sheet
Elegoo elegoo_textured_pei_surface, elegoo_smooth_pei_surface, elegoo_starry_surface, elegoo_diamond_surface, elegoo_carbon_fiber_surface, elegoo_cool_plate_surface
Creality creality_hi_epoxy_resin_plate, creality_hi_textured_pei_plate, creality_k1_textured_pei_plate, creality_k1_smooth_pei_plate, creality_k1max_textured_pei_plate, creality_k1max_smooth_pei_plate, creality_k2plus_epoxy_resin_plate, creality_k2plus_pei_frosted_plate, creality_k2_pei_frosted_plate
Darkmoon 3D darkmoon_g10_garolite, darkmoon_satin, darkmoon_ice, darkmoon_cfx, darkmoon_lux
Generic generic_flexible_pei_sheet, generic_garolite_g10_plate, generic_glass_plate, generic_pp_sheet, aftermarket_pei_sheet
Custom custom (paired with bedType.custom = <id>)

Custom Fields

Custom Fields allow you to add your own data-fields inside SimplyPrint.

Read more about Custom Fields on our Helpdesk

List custom fields

Required permissions
custom_fields_manage

POST /{id}/custom_fields/Get

Example request

curl -X POST https://api.simplyprint.io/{id}/custom_fields/Get \
    -H 'accept: application/json' \
    -H "X-API-KEY: {API_KEY}" \
    -F "page=1" -F "page_size=10"

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 7,
      "fieldId": "student_id",
      "fieldLabel": "Student ID",
      "fieldDescription": "",
      "fieldPlaceholder": null,
      "fieldType": "text",
      "fieldOptions": null,
      "category": "print",
      "subCategory": [
        "user_file",
        "print_queue",
        "print_job"
      ],
      "required": false,
      "enabled": true,
      "defaultValue": null,
      "visibleRequiredPermissions": null,
      "editRequiredPermissions": null,
      "visibleToGroups": [],
      "editableByGroups": [],
      "validation": null,
      "createdByUser": -1,
      "user": "John Doe",
      "forPrinters": [],
      "forModels": [],
      "forGroups": [],
      "showOnRegistration": null,
      "showBeforeStartPrint": null,
      "position": 0,
      "created": "2024-09-07T13:46:59+00:00",
      "updated": "2024-09-07T13:46:59+00:00"
    }
  ],
  "page_amount": 1,
  "total": 1
}

Request

Parameter Type Required Description
page integer yes Which page to show
page_size integer yes Amount of items per page (1-100)
search string no The search filter to apply
sort_id string no What key to sort on (id, fieldId, fieldLabel, fieldDescription, fieldType, category, enabled, created, updated)
sort_dir string no Sort direction (asc, desc)

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array List of custom fields.

Create or update a custom field

Required permissions
custom_fields_manage

POST /{id}/custom_fields/Save

Example request

curl -X POST https://api.simplyprint.io/{id}/custom_fields/Save \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"category":"print","subCategory":["user_file","print_queue","print_job"],"fieldType":"text","fieldId":"student_id","fieldLabel":"Student ID","required":false,"enabled":true}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer no If you want to update an existing custom field, specify this
category string yes One of print, user, printer, filament
subCategory array no Array of subcategories. Valid subcategories: print_queue, print_job, user_file
fieldId string yes ID of the field
fieldType string yes One of boolean, text, longtext, number, date, datetime, phone, email, url, select, multiselect, radio, checkbox
fieldLabel string yes Label of the field
fieldOptions object no Field options. An object with one entry, options, whose value is an array of {label: string, value: string}
FieldDescription string no Description of the field
fieldPlaceholder string no Placeholder text for the field
required boolean yes Whether the field is required
defaultValue object no Default value of the field. Object key should be either string, number, boolean, date, options, with the appropriate value type
validation object no Validation rules for the field. Object keys can be any of stringRegex, stringMinLength, stringMaxLength, numberAllowDecimals, numberMinValue, numberMaxValue, validationMessage
forPrinters array no Array of printer IDs the field should be visible for
forModels array no Array of model IDs the field should be visible for
forGroups array no Array of group IDs the field should be visible for
showOnRegistration boolean no Whether the field should be shown on registration
showBeforeStartPrint boolean no Whether the field should be shown before starting a print

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Enable or disable a custom field

Required permissions
custom_fields_manage

POST /{id}/custom_fields/SetEnabled

Example request

curl -X POST https://api.simplyprint.io/{id}/custom_fields/SetEnabled \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"id": 123, "enabled": true}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes ID of the custom field to enable or disable
enabled boolean yes Whether the custom field should be enabled (true) or disabled (false)

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Delete custom fields

Required permissions
custom_fields_manage

POST /{id}/custom_fields/Delete

Example request

curl https://api.simplyprint.io/{id}/custom_fields/Delete?id=123 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example request with multiple IDs

curl https://api.simplyprint.io/{id}/custom_fields/Delete?ids=123,124,125 \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes (if ids is not provided) The ID of the custom field to delete.
ids string yes (if id is not provided) A comma-separated list of custom field IDs to delete. Valid if multiple fields need to be removed.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Custom field submission

POST /{id}/custom_fields/SubmitValues

Example request

curl -X POST https://api.simplyprint.io/{id}/custom_fields/SubmitValues \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{"category": "printer", "subCategory": "print_job", entityIds: [1234], "values": [{customFieldId: "student_id", value: {"string": "1234567890"}}]}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
category string yes One of print, user, printer, filament
subCategory string yes One of print_queue, print_job, user_file
entityIds array yes Array of entity IDs to submit values for
values array yes Array of custom field values to submit. Each value looks like {customFieldId: string, value: CustomFieldValue}

Custom field submission value

The value of a custom field when submitted via the API is an object with a key corresponding to the field type. See the examples to the right for the different field types.

A text field would have a value like this:

{
  "string": "1234567890"
}

A number field would have a value like this:

{
  "number": 1234567890
}

A date field would have a value like this:

{
  "date": "2024-09-07"
}

A select field would have a value like this:

{
  "string": "Selected option"
}

A multi-select field would have a value like this:

{
  "options": [
    "Option 1",
    "Option 2"
  ]
}

Webhooks

Webhooks allow you to build or set up integrations that subscribe to certain events on SimplyPrint. When one of those events is triggered, we'll send an HTTP POST payload to the webhook's configured URL.

List webhooks

Required permissions
webhooks_manage

GET /{id}/webhooks/Get

Example request

curl "https://api.simplyprint.io/{id}/webhooks/Get" \
    -H 'accept: application/json' \
    -H "X-API-KEY: {API_KEY}"

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 11,
      "created_by": {
        "id": 12640,
        "first_name": "John",
        "last_name": "Doe",
        "avatar": "https://example.com/avatar.jpg"
      },
      "name": "Example Webhook",
      "url": "https:\/\/actions.nasa.gov\/print_events",
      "format": 0,
      "events": [
        "job.started",
        "job.paused",
        "job.resumed",
        "job.cancelled",
        "job.done",
        "job.failed",
        "job.bed_cleared",
        "printer.nozzle_size_changed"
      ],
      "secret": null,
      "enabled": true,
      "oauth_client_id": null,
      "created_at": "2024-09-07T18:16:51+00:00",
      "updated_at": "2024-09-07T18:16:51+00:00"
    }
  ],
  "oauth_clients": []
}

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array Array of webhooks.
oauth_clients array OAuth clients referenced by returned webhooks, keyed by client ID.

Create or update a webhook

Required permissions
webhooks_manage

POST /{id}/webhooks/Create

Example request

curl -X POST \
https://api.simplyprint.io/{id}/webhooks/Create \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: {API_KEY}' \
-d '{ "name": "Printer updates", "url": "https://example.com/webhook", "secret": "mysecret", "enabled": true, "events": ["printer.nozzle_size_changed", "filament.update"] }'

Example response

{
  "status": true,
  "message": null,
  "webhook": {
    "id": 123,
    "created_by": {
      "id": 12640,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://example.com/avatar.jpg"
    },
    "name": "Printer updates",
    "url": "https://example.com/webhook",
    "format": 0,
    "events": [
      "printer.nozzle_size_changed",
      "filament.update"
    ],
    "secret": "mysecret",
    "enabled": true,
    "oauth_client_id": null,
    "created_at": "2024-09-07T18:16:51+00:00",
    "updated_at": "2024-09-07T18:16:51+00:00"
  }
}

Request

Parameter Type Required Description
id integer no The ID of the webhook. Required if updating an existing webhook.
name string yes The name of the webhook.
description string no A description of the webhook.
url string yes The URL where the webhook will send requests. Must be a valid URL.
secret string no A secret key sent with each webhook delivery in the X-SP-Secret header. Use this to verify that requests originate from SimplyPrint.
enabled boolean no Whether the webhook is enabled or not. Defaults to true for new webhooks.
events array yes A list of events that the webhook will listen to. Must be at least one. Each event should match a valid WebhookEvent.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
webhook object Details of the created or updated webhook. Contains fields like id, created_by, name, url, format, events, and timestamps.

Delete a webhook

Required permissions
webhooks_manage

POST /{id}/webhooks/Delete

Example request

curl -X POST \
https://api.simplyprint.io/{id}/webhooks/Delete \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: {API_KEY}' \
-d '{"id": 123}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes The ID of the webhook to delete.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Enable or disable a webhook

Required permissions
webhooks_manage

POST /{id}/webhooks/SetEnabled

Example request

curl -X POST \
https://api.simplyprint.io/{id}/webhooks/SetEnabled \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: {API_KEY}' \
-d '{"id": 123, "enabled": true}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes The ID of the webhook to enable or disable.
enabled boolean yes Set to true to enable or false to disable.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Manually trigger webhook

The event type will be test.

This endpoint only checks that the Webhooks feature is available for the company and that the webhook belongs to the current company.

POST /{id}/webhooks/TriggerTestWebhook

Example request

curl -X POST \
https://api.simplyprint.io/{id}/webhooks/TriggerTestWebhook \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: {API_KEY}' \
-d '{"id": 123}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes The ID of the webhook to trigger.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.

Get webhook logs

Required permissions
webhooks_manage

POST /{id}/webhooks/GetLogs

Example request

curl -X POST \
https://api.simplyprint.io/{id}/webhooks/GetLogs \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: {API_KEY}' \
-d '{"webhook_id": 123, "page": 1, "page_size": 10, "sort_id": "createdAt", "sort_dir": "desc"}'

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 456,
      "webhook_id": 123,
      "succeeded": true,
      "url": "https://example.com/webhook",
      "status_code": 200,
      "duration_ms": 154,
      "request": "{\"webhook_id\":123,\"event\":\"printer.nozzle_size_changed\",\"timestamp\":1725733011,\"data\":{...}}",
      "attempts": 1,
      "reported": true,
      "receipt_received_at": "2024-09-07T18:16:52+00:00",
      "created_at": "2024-09-07T18:16:51+00:00"
    }
  ],
  "page_amount": 1,
  "total": 1
}

Request

Parameter Type Required Description
webhook_id integer yes The webhook ID to fetch logs for.
page integer yes 1-based page number.
page_size integer yes Number of log rows per page. Must be between 1 and 100.
sort_id string no Column to sort by. Common values are createdAt, statusCode, durationMs, or attempts.
sort_dir string no Sort direction. Must be asc or desc.
start_date string no Start of date range filter in UTC or a supported user-input date format.
end_date string no End of date range filter in UTC or a supported user-input date format.

Response

Parameter Type Description
status boolean True if the request was successful.
message string Error message if status is false.
data array Paginated webhook log entries.
page_amount integer Total number of available pages.
total integer Total number of matching log entries.

WebhookEvent

Event Name Description
job.started Triggered when a job is started.
job.paused Triggered when a job is paused.
job.resumed Triggered when a job is resumed.
job.cancelled Triggered when a job is cancelled.
job.done Triggered when a job is done.
job.failed Triggered when a job has failed.
job.bed_cleared Triggered when the bed is cleared.
job.objects_skipped Triggered when objects are skipped in a print job.
printer.autoprint_state_changed Triggered when the autoprint state of a printer is changed.
printer.nozzle_size_changed Triggered when the nozzle size of a printer is changed.
printer.material_changed Triggered when the material of a printer is changed.
printer.custom_tag_assigned Triggered when a custom tag is assigned to a printer.
printer.custom_tag_detached Triggered when a custom tag is detached from a printer.
printer.out_of_order_state_changed Triggered when a printer enters or leaves out-of-order state.
company.autoprint_state_changed Triggered when the autoprint state of a company is changed.
queue.add_item Triggered when a queue item is added.
queue.delete_item Triggered when a queue item is deleted.
queue.empty_queue Triggered when a queue is emptied.
queue.move_item Triggered when a queue item is moved.
queue.revive_item Triggered when a done queue item is revived.
queue.item_pending_approval Triggered when a queue item requires approval.
queue.item_approved Triggered when a queue item is approved.
queue.item_denied Triggered when a queue item is denied.
filament.create Triggered when filament is created.
filament.update Triggered when filament is updated.
filament.delete Triggered when filament is deleted.
filament.assigned Triggered when filament is assigned to a printer.
filament.unassigned Triggered when filament is unassigned from a printer.
printer.ai_state_changed Triggered when a printer AI state changes.
organization.user_signup Triggered when a user signs up to an organization.
organization.user_pending Triggered when a user is pending approval for an organization.
printer.ai_failure_detected Triggered when AI detects a potential print failure.
printer.ai_failure_false_positive Triggered when a detected AI failure is resolved as a false positive.
printer.autoprint_max_cycles Triggered when a printer reaches its configured autoprint max cycles.
balance.charged Triggered when balance is charged.
balance.refunded Triggered when balance is refunded.
balance.topped_up Triggered when balance is topped up.
balance.adjusted Triggered when balance is adjusted.
quota.request_new Triggered when a new quota request is created.
quota.request_resolved Triggered when a quota request is resolved.
quota.adjusted Triggered when quota is adjusted.
quota.reset Triggered when quota is reset.
maintenance.job_created Triggered when a maintenance job is created.
maintenance.job_started Triggered when a maintenance job is started.
maintenance.job_completed Triggered when a maintenance job is completed.
maintenance.job_cancelled Triggered when a maintenance job is cancelled.
maintenance.job_overdue Triggered when a maintenance job becomes overdue.
maintenance.job_reopened Triggered when a maintenance job is reopened.
maintenance.problem_reported Triggered when a maintenance problem is reported.
maintenance.problem_resolved Triggered when a maintenance problem is resolved.
maintenance.low_stock Triggered when a maintenance spare part reaches low stock.
maintenance.task_completed Triggered when a maintenance task is completed.
maintenance.task_skipped Triggered when a maintenance task is skipped.
maintenance.schedule_created Triggered when a maintenance schedule is created.
maintenance.schedule_updated Triggered when a maintenance schedule is updated.
maintenance.schedule_deleted Triggered when a maintenance schedule is deleted.
maintenance.job_updated Triggered when a maintenance job is updated.
maintenance.job_deleted Triggered when a maintenance job is deleted.
maintenance.spare_part_created Triggered when a maintenance spare part is created.
maintenance.spare_part_updated Triggered when a maintenance spare part is updated.
maintenance.spare_part_deleted Triggered when a maintenance spare part is deleted.
maintenance.stock_adjusted Triggered when maintenance spare part stock is adjusted.

Webhook payloads

Every webhook delivery shares the same envelope:

Field Type Description
webhook_id integer The ID of the webhook that produced this delivery.
event string One of the WebhookEvent strings.
timestamp integer Unix timestamp (seconds) when the event was emitted.
data object Event-specific body. See the sections below.

If the webhook has a secret configured, the same value is sent in the X-SP-Secret header on every delivery. Compare it against your stored secret to confirm the request came from SimplyPrint.

The examples below are real payloads captured from the test environment with IDs and user names replaced with documentation placeholders (user.id = 1234, printer.id = 385, company_id = 5152, etc.). Your deliveries will carry your own IDs and names.

test

Fires when an operator clicks "Trigger test" on a webhook. The payload identifies only the company.

Example payload

{
  "webhook_id": 25,
  "event": "test",
  "timestamp": 1776691249,
  "data": {
    "company_id": 5152
  }
}

job.started

Fires when a print begins. Includes the job, its owner (user), and the SimplyPrint user who started it (started_by, which is null when the print is started outside SimplyPrint or auto-started).

Example payload

{
  "webhook_id": 25,
  "event": "job.started",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084938,
      "uid": "82f20947-ac56-41f6-a843-2a217a0116f9",
      "panel_url": "https://simplyprint.io/panel/jobs/82f20947-ac56-41f6-a843-2a217a0116f9",
      "printer_id": 385,
      "state": "done",
      "file": "calicat.stl.3mf",
      "percentage": 100,
      "time_left": null,
      "current_layer": 173,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 189.06,
          "maxY": 174.04,
          "maxZ": 117.3,
          "minX": 160.94,
          "minY": 145.96,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T1": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 28.12,
          "y": 28.08,
          "z": 34.4
        },
        "materialData": [
          {},
          {
            "type": "PLA",
            "color": "#E8DBB7",
            "density": 1.32,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA01",
            "settingId": "Bambu PLA Matte @BBL H2D",
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 1038,
        "filament": [
          0,
          2153,
          0,
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.2,
        "firstLayerHeight": null,
        "totalLayers": 173,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 251.95,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "started": 1775836843,
      "ended": 1775838301,
      "ai": {
        "timeline": [
          {
            "timestamp": 1775837414,
            "score": {
              "overall": 0.07
            }
          },
          {
            "timestamp": 1775837445,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837475,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837508,
            "score": {
              "overall": 0.08,
              "per_class": {
                "spaghetti": 0.05
              }
            }
          },
          {
            "timestamp": 1775837538,
            "score": {
              "overall": 0.09,
              "per_class": {
                "spaghetti": 0.37
              }
            }
          }
        ],
        "ai_model": "amnet_v9",
        "model_version": null,
        "run_time": 1374,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 1.01,
            "label": "Material usage (account default)",
            "material": {
              "gram": 6.71,
              "extruder": 1,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.4,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.02,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 1.45,
        "used_fallback_cost": true
      },
      "duration": 1457,
      "skippedObjects": null
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "started_by": null
  }
}

job.paused

Fires when a running job is paused, either manually by a user or automatically by a filament sensor.

Example payload

{
  "webhook_id": 25,
  "event": "job.paused",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084938,
      "uid": "82f20947-ac56-41f6-a843-2a217a0116f9",
      "panel_url": "https://simplyprint.io/panel/jobs/82f20947-ac56-41f6-a843-2a217a0116f9",
      "printer_id": 385,
      "state": "done",
      "file": "calicat.stl.3mf",
      "percentage": 100,
      "time_left": null,
      "current_layer": 173,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 189.06,
          "maxY": 174.04,
          "maxZ": 117.3,
          "minX": 160.94,
          "minY": 145.96,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T1": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 28.12,
          "y": 28.08,
          "z": 34.4
        },
        "materialData": [
          {},
          {
            "type": "PLA",
            "color": "#E8DBB7",
            "density": 1.32,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA01",
            "settingId": "Bambu PLA Matte @BBL H2D",
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 1038,
        "filament": [
          0,
          2153,
          0,
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.2,
        "firstLayerHeight": null,
        "totalLayers": 173,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 251.95,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "started": 1775836843,
      "ended": 1775838301,
      "ai": {
        "timeline": [
          {
            "timestamp": 1775837414,
            "score": {
              "overall": 0.07
            }
          },
          {
            "timestamp": 1775837445,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837475,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837508,
            "score": {
              "overall": 0.08,
              "per_class": {
                "spaghetti": 0.05
              }
            }
          },
          {
            "timestamp": 1775837538,
            "score": {
              "overall": 0.09,
              "per_class": {
                "spaghetti": 0.37
              }
            }
          }
        ],
        "ai_model": "amnet_v9",
        "model_version": null,
        "run_time": 1374,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 1.01,
            "label": "Material usage (account default)",
            "material": {
              "gram": 6.71,
              "extruder": 1,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.4,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.02,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 1.45,
        "used_fallback_cost": true
      },
      "duration": 1457,
      "skippedObjects": null
    }
  }
}

job.resumed

Fires when a paused job is resumed and printing continues.

Example payload

{
  "webhook_id": 25,
  "event": "job.resumed",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084938,
      "uid": "82f20947-ac56-41f6-a843-2a217a0116f9",
      "panel_url": "https://simplyprint.io/panel/jobs/82f20947-ac56-41f6-a843-2a217a0116f9",
      "printer_id": 385,
      "state": "done",
      "file": "calicat.stl.3mf",
      "percentage": 100,
      "time_left": null,
      "current_layer": 173,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 189.06,
          "maxY": 174.04,
          "maxZ": 117.3,
          "minX": 160.94,
          "minY": 145.96,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T1": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 28.12,
          "y": 28.08,
          "z": 34.4
        },
        "materialData": [
          {},
          {
            "type": "PLA",
            "color": "#E8DBB7",
            "density": 1.32,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA01",
            "settingId": "Bambu PLA Matte @BBL H2D",
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 1038,
        "filament": [
          0,
          2153,
          0,
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.2,
        "firstLayerHeight": null,
        "totalLayers": 173,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 251.95,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "started": 1775836843,
      "ended": 1775838301,
      "ai": {
        "timeline": [
          {
            "timestamp": 1775837414,
            "score": {
              "overall": 0.07
            }
          },
          {
            "timestamp": 1775837445,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837475,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837508,
            "score": {
              "overall": 0.08,
              "per_class": {
                "spaghetti": 0.05
              }
            }
          },
          {
            "timestamp": 1775837538,
            "score": {
              "overall": 0.09,
              "per_class": {
                "spaghetti": 0.37
              }
            }
          }
        ],
        "ai_model": "amnet_v9",
        "model_version": null,
        "run_time": 1374,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 1.01,
            "label": "Material usage (account default)",
            "material": {
              "gram": 6.71,
              "extruder": 1,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.4,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.02,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 1.45,
        "used_fallback_cost": true
      },
      "duration": 1457,
      "skippedObjects": null
    }
  }
}

job.cancelled

Fires when a job is cancelled. The user field identifies whoever cancelled the job, and may be null if the cancellation was triggered by the system rather than a person.

Example payload

{
  "webhook_id": 25,
  "event": "job.cancelled",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084950,
      "uid": "73654847-a885-46df-b50f-9b4dfdf47220",
      "panel_url": "https://simplyprint.io/panel/jobs/73654847-a885-46df-b50f-9b4dfdf47220",
      "printer_id": 385,
      "state": "cancelled",
      "file": "UM3E_calicat.gcode",
      "percentage": 0,
      "time_left": null,
      "current_layer": null,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 149.25,
          "maxY": 149.23,
          "maxZ": 37,
          "minX": 113.95,
          "minY": 106.77,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 1
        },
        "temps": {
          "bed": 60,
          "tool": {
            "T0": 205
          },
          "maxTool": 205
        },
        "modelSize": {
          "x": 35.3,
          "y": 42.46,
          "z": 34.6
        },
        "materialData": null,
        "slicer": "Cura",
        "estimate": 2550,
        "filament": [
          997
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4
          }
        ],
        "bedType": null,
        "gcodeFlavor": "Griffin",
        "layerHeight": null,
        "firstLayerHeight": null,
        "totalLayers": 175,
        "slicerVersion": null,
        "minDeltaRadius": 202.91,
        "forPrinterModel": null,
        "objects": null
      },
      "started": 1776189868,
      "ended": 1776189888,
      "ai": {
        "timeline": [],
        "ai_model": null,
        "model_version": null,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 0.33,
            "label": "Bambu Lab Blue, Bambu Lab PLA Basic Material usage",
            "material": {
              "gram": 2.97,
              "extruder": 0,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": false
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.01,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 0.35,
        "used_fallback_cost": false
      },
      "duration": 20,
      "skippedObjects": null,
      "queue": {
        "num": 1,
        "total": 1
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

job.done

Fires when a print completes successfully.

Example payload

{
  "webhook_id": 25,
  "event": "job.done",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084938,
      "uid": "82f20947-ac56-41f6-a843-2a217a0116f9",
      "panel_url": "https://simplyprint.io/panel/jobs/82f20947-ac56-41f6-a843-2a217a0116f9",
      "printer_id": 385,
      "state": "done",
      "file": "calicat.stl.3mf",
      "percentage": 100,
      "time_left": null,
      "current_layer": 173,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 189.06,
          "maxY": 174.04,
          "maxZ": 117.3,
          "minX": 160.94,
          "minY": 145.96,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T1": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 28.12,
          "y": 28.08,
          "z": 34.4
        },
        "materialData": [
          {},
          {
            "type": "PLA",
            "color": "#E8DBB7",
            "density": 1.32,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA01",
            "settingId": "Bambu PLA Matte @BBL H2D",
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 1038,
        "filament": [
          0,
          2153,
          0,
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.2,
        "firstLayerHeight": null,
        "totalLayers": 173,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 251.95,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "started": 1775836843,
      "ended": 1775838301,
      "ai": {
        "timeline": [
          {
            "timestamp": 1775837414,
            "score": {
              "overall": 0.07
            }
          },
          {
            "timestamp": 1775837445,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837475,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837508,
            "score": {
              "overall": 0.08,
              "per_class": {
                "spaghetti": 0.05
              }
            }
          },
          {
            "timestamp": 1775837538,
            "score": {
              "overall": 0.09,
              "per_class": {
                "spaghetti": 0.37
              }
            }
          }
        ],
        "ai_model": "amnet_v9",
        "model_version": null,
        "run_time": 1374,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 1.01,
            "label": "Material usage (account default)",
            "material": {
              "gram": 6.71,
              "extruder": 1,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.4,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.02,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 1.45,
        "used_fallback_cost": true
      },
      "duration": 1457,
      "skippedObjects": null
    }
  }
}

job.failed

Fires when a print is marked as failed.

Example payload

{
  "webhook_id": 25,
  "event": "job.failed",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084822,
      "uid": "d64a25b0-3cf1-4965-8157-5688f5c10a76",
      "panel_url": "https://simplyprint.io/panel/jobs/d64a25b0-3cf1-4965-8157-5688f5c10a76",
      "printer_id": 385,
      "state": "failed",
      "file": "stacktocat_PLA_0.2_28m58s.gcode",
      "percentage": 11,
      "time_left": null,
      "current_layer": 9,
      "analysis": null,
      "started": 1774450814,
      "ended": 1774447278,
      "ai": {
        "timeline": [],
        "ai_model": null,
        "model_version": null,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Printers"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.02,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 0.04,
        "used_fallback_cost": false
      },
      "duration": 3536,
      "skippedObjects": null
    }
  }
}

job.bed_cleared

Fires when the print bed is cleared after a job, signalling that the printer is ready for the next print.

Example payload

{
  "webhook_id": 25,
  "event": "job.bed_cleared",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084938,
      "uid": "82f20947-ac56-41f6-a843-2a217a0116f9",
      "panel_url": "https://simplyprint.io/panel/jobs/82f20947-ac56-41f6-a843-2a217a0116f9",
      "printer_id": 385,
      "state": "done",
      "file": "calicat.stl.3mf",
      "percentage": 100,
      "time_left": null,
      "current_layer": 173,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 189.06,
          "maxY": 174.04,
          "maxZ": 117.3,
          "minX": 160.94,
          "minY": 145.96,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T1": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 28.12,
          "y": 28.08,
          "z": 34.4
        },
        "materialData": [
          {},
          {
            "type": "PLA",
            "color": "#E8DBB7",
            "density": 1.32,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA01",
            "settingId": "Bambu PLA Matte @BBL H2D",
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 1038,
        "filament": [
          0,
          2153,
          0,
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.2,
        "firstLayerHeight": null,
        "totalLayers": 173,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 251.95,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "started": 1775836843,
      "ended": 1775838301,
      "ai": {
        "timeline": [
          {
            "timestamp": 1775837414,
            "score": {
              "overall": 0.07
            }
          },
          {
            "timestamp": 1775837445,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837475,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837508,
            "score": {
              "overall": 0.08,
              "per_class": {
                "spaghetti": 0.05
              }
            }
          },
          {
            "timestamp": 1775837538,
            "score": {
              "overall": 0.09,
              "per_class": {
                "spaghetti": 0.37
              }
            }
          }
        ],
        "ai_model": "amnet_v9",
        "model_version": null,
        "run_time": 1374,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 1.01,
            "label": "Material usage (account default)",
            "material": {
              "gram": 6.71,
              "extruder": 1,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.4,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.02,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 1.45,
        "used_fallback_cost": true
      },
      "duration": 1457,
      "skippedObjects": null
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

job.objects_skipped

Fires when one or more objects are skipped mid-print. skipped_object_ids lists the skipped object indices as they appear in the sliced file.

Example payload

{
  "webhook_id": 25,
  "event": "job.objects_skipped",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 5084938,
      "uid": "82f20947-ac56-41f6-a843-2a217a0116f9",
      "panel_url": "https://simplyprint.io/panel/jobs/82f20947-ac56-41f6-a843-2a217a0116f9",
      "printer_id": 385,
      "state": "done",
      "file": "calicat.stl.3mf",
      "percentage": 100,
      "time_left": null,
      "current_layer": 173,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 189.06,
          "maxY": 174.04,
          "maxZ": 117.3,
          "minX": 160.94,
          "minY": 145.96,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T1": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 28.12,
          "y": 28.08,
          "z": 34.4
        },
        "materialData": [
          {},
          {
            "type": "PLA",
            "color": "#E8DBB7",
            "density": 1.32,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA01",
            "settingId": "Bambu PLA Matte @BBL H2D",
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 1038,
        "filament": [
          0,
          2153,
          0,
          0,
          0
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.2,
        "firstLayerHeight": null,
        "totalLayers": 173,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 251.95,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "started": 1775836843,
      "ended": 1775838301,
      "ai": {
        "timeline": [
          {
            "timestamp": 1775837414,
            "score": {
              "overall": 0.07
            }
          },
          {
            "timestamp": 1775837445,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837475,
            "score": {
              "overall": 0.08
            }
          },
          {
            "timestamp": 1775837508,
            "score": {
              "overall": 0.08,
              "per_class": {
                "spaghetti": 0.05
              }
            }
          },
          {
            "timestamp": 1775837538,
            "score": {
              "overall": 0.09,
              "per_class": {
                "spaghetti": 0.37
              }
            }
          }
        ],
        "ai_model": "amnet_v9",
        "model_version": null,
        "run_time": 1374,
        "bed_check": null
      },
      "autoprint": false,
      "printer": {
        "id": 385,
        "name": "Workshop Printer",
        "group": {
          "id": 99,
          "name": "Workshop A"
        }
      },
      "cost": {
        "lines": [
          {
            "id": 1,
            "cost": 1.01,
            "label": "Material usage (account default)",
            "material": {
              "gram": 6.71,
              "extruder": 1,
              "toPercent": null,
              "isEstimate": false,
              "fromPercent": null,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.4,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.02,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ],
        "currency": "USD",
        "estimate": false,
        "total_cost": 1.45,
        "used_fallback_cost": true
      },
      "duration": 1457,
      "skippedObjects": null
    },
    "skipped_object_ids": [
      1,
      3
    ],
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

printer.autoprint_state_changed

AutoPrint was enabled or disabled on this printer. enabled reflects the new state.

Example payload

{
  "webhook_id": 25,
  "event": "printer.autoprint_state_changed",
  "timestamp": 1776691249,
  "data": {
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "enabled": true
  }
}

printer.nozzle_size_changed

The printer's nozzle configuration changed. nozzleSize is the size for extruder 0; nozzleData has the full per-nozzle details.

Example payload

{
  "webhook_id": 25,
  "event": "printer.nozzle_size_changed",
  "timestamp": 1776691249,
  "data": {
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "nozzleSize": 0.4,
    "nozzleData": [
      {
        "type": null,
        "volumeType": null,
        "size": 0.4,
        "i": 0
      }
    ]
  }
}

printer.material_changed

Assigned material on the printer changed. material is keyed by extruder index.

Example payload

{
  "webhook_id": 25,
  "event": "printer.material_changed",
  "timestamp": 1776691249,
  "data": {
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "material": {
      "0": {
        "id": 14817,
        "uid": "NBCU",
        "type": {
          "id": 281,
          "name": "PLA"
        },
        "colorName": "White",
        "colorHex": "#FFFFFF",
        "brand": "DevilDesign",
        "nozzle": 0,
        "extruder": 0,
        "printer": 44844,
        "total": 670567,
        "left": 670567,
        "dia": 1.75,
        "customFields": []
      }
    }
  }
}

printer.custom_tag_assigned

A tag was attached to the printer.

Example payload

{
  "webhook_id": 25,
  "event": "printer.custom_tag_assigned",
  "timestamp": 1776691249,
  "data": {
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "tag": {
      "id": 30,
      "name": "Tag 1",
      "badge": "light",
      "used_by": {
        "printers": 0,
        "printer_groups": 0,
        "files": 7,
        "queue_items": 6
      }
    }
  }
}

printer.custom_tag_detached

A tag was removed from the printer.

Example payload

{
  "webhook_id": 25,
  "event": "printer.custom_tag_detached",
  "timestamp": 1776691249,
  "data": {
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "tag": {
      "id": 30,
      "name": "Tag 1",
      "badge": "light",
      "used_by": {
        "printers": 0,
        "printer_groups": 0,
        "files": 7,
        "queue_items": 6
      }
    }
  }
}

printer.out_of_order_state_changed

Printer's out-of-order state was toggled. out_of_order reflects the new state.

Example payload

{
  "webhook_id": 25,
  "event": "printer.out_of_order_state_changed",
  "timestamp": 1776691249,
  "data": {
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "out_of_order": true
  }
}

printer.ai_state_changed

AI monitoring was enabled or disabled on the printer. The printer object contains the full printer state snapshot including model, filament, and capabilities; enabled reflects the new AI state.

Example payload

{
  "webhook_id": 25,
  "event": "printer.ai_state_changed",
  "timestamp": 1776691249,
  "data": {
    "printer": {
      "id": 385,
      "sort_order": 3,
      "printer": {
        "name": "Workshop Printer",
        "state": "offline",
        "group": 1377,
        "position": 3,
        "api": "Moonraker",
        "ui": "fluidd",
        "ip": "10.78.16.68",
        "machine": null,
        "online": false,
        "region": null,
        "firmware": "Klipper",
        "firmwareVersion": "1.1.0.105_20260124180406",
        "spVersion": "0.0.1",
        "temps": {
          "ambient": 25,
          "current": {
            "tool": [
              25
            ],
            "bed": 23
          },
          "target": {
            "tool": [
              0
            ],
            "bed": 0
          },
          "targetTemperatures": false
        },
        "tags": {
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ]
        },
        "activeExtruder": 0,
        "activeNozzle": 0,
        "activeTools": [
          0
        ],
        "hasPSU": 0,
        "psuOn": false,
        "hasFilSensor": false,
        "filSensor": false,
        "model": {
          "id": 647,
          "name": "U1",
          "brand": "Snapmaker",
          "bedSize": [
            270,
            270
          ],
          "bedType": "square",
          "maxHeight": 270,
          "image": "https://cdn.simplyprint.io/i/printer_types/snapmaker/u1/product_photo_md.png",
          "hasHeatedBed": true,
          "coolPlate": false,
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ],
          "nozzles": 1,
          "extruders": 1,
          "extruderSettings": null,
          "maxToolTemp": 300,
          "maxBedTemp": 100,
          "probeToolTemp": 0,
          "filamentWidth": 1.75,
          "nozzleDia": 0.4,
          "directDrive": 1,
          "hasAbl": 1,
          "ablOnPrint": 1,
          "axes": {
            "x": {
              "speed": 100,
              "inverted": false
            },
            "y": {
              "speed": 100,
              "inverted": false
            },
            "z": {
              "speed": 3.5,
              "inverted": false
            },
            "e": {
              "speed": 5,
              "inverted": false
            }
          },
          "screwOffset": 35,
          "filamentRetraction": 60,
          "customBoundingBox": null,
          "probingGcode": [
            "G28 ; home all axes",
            "@BEDLEVELVISUALIZER ; tell the plugin to watch for reported mesh",
            "BED_MESH_OUTPUT ; report the bed leveling mesh points."
          ],
          "probingFirmware": "klipper",
          "heatedChamber": 0,
          "canM117": false,
          "extrudeAbs": 0,
          "originCenter": 0,
          "bedBelt": 0,
          "fwRetract": 0,
          "extrusionType": 1,
          "noControl": false,
          "mms": null,
          "startOptions": null,
          "peripheralsDefinition": null,
          "zipPrinting": false,
          "slicerSupport": false,
          "specialExtensions": null,
          "pluginsToInstall": ""
        },
        "hasCam": 0,
        "hasQueue": {
          "items": 1,
          "fits": true
        },
        "locked": 0,
        "lockReason": null,
        "health": {
          "usage": 43,
          "temp": 46,
          "memory": 55
        },
        "unsupported": 0,
        "latency": null,
        "autoprint": false,
        "currentAutoprintJobs": 0,
        "autoprintMaxJobs": null,
        "aiEnabled": false,
        "aiSettings": null,
        "autoprintDetails": {
          "method": null
        },
        "integration": "Moonraker",
        "capabilities": {
          "supported": [
            "layer.progress",
            "time.left"
          ],
          "unsupported": [
            "print.start.predownload"
          ]
        },
        "peripheralsDefinition": null,
        "peripheralsState": null,
        "nopi": 0,
        "licensed": false,
        "serial_number_id": null,
        "outOfOrder": 0
      },
      "filament": {
        "0": {
          "id": 14817,
          "uid": "NBCU",
          "type": {
            "id": 281,
            "name": "PLA"
          },
          "colorName": "White",
          "colorHex": "#FFFFFF",
          "brand": "DevilDesign",
          "nozzle": 0,
          "extruder": 0,
          "printer": 44844,
          "total": 670567,
          "left": 670567,
          "dia": 1.75,
          "customFields": []
        }
      },
      "job": null
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "enabled": true
  }
}

printer.ai_failure_detected

AI spotted a potential print failure. image links to the frame; failures scores each class.

Example payload

{
  "webhook_id": 25,
  "event": "printer.ai_failure_detected",
  "timestamp": 1776691249,
  "data": {
    "job": null,
    "image": "https://cdn.simplyprint.io/ai/sample.jpg",
    "failures": []
  }
}

printer.ai_failure_false_positive

A previously-detected AI failure was marked a false positive by a user.

Example payload

{
  "webhook_id": 25,
  "event": "printer.ai_failure_false_positive",
  "timestamp": 1776691249,
  "data": {
    "job": null,
    "image": "https://cdn.simplyprint.io/ai/sample.jpg"
  }
}

printer.autoprint_max_cycles

Printer stopped AutoPrint because it reached its configured max cycle count. The printer object contains the full printer state snapshot at the time of the stop.

Example payload

{
  "webhook_id": 25,
  "event": "printer.autoprint_max_cycles",
  "timestamp": 1776691249,
  "data": {
    "printer": {
      "id": 385,
      "sort_order": 3,
      "printer": {
        "name": "Workshop Printer",
        "state": "offline",
        "group": 1377,
        "position": 3,
        "api": "Moonraker",
        "ui": "fluidd",
        "ip": "10.78.16.68",
        "machine": null,
        "online": false,
        "region": null,
        "firmware": "Klipper",
        "firmwareVersion": "1.1.0.105_20260124180406",
        "spVersion": "0.0.1",
        "temps": {
          "ambient": 25,
          "current": {
            "tool": [
              25
            ],
            "bed": 23
          },
          "target": {
            "tool": [
              0
            ],
            "bed": 0
          },
          "targetTemperatures": false
        },
        "tags": {
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ]
        },
        "activeExtruder": 0,
        "activeNozzle": 0,
        "activeTools": [
          0
        ],
        "hasPSU": 0,
        "psuOn": false,
        "hasFilSensor": false,
        "filSensor": false,
        "model": {
          "id": 647,
          "name": "U1",
          "brand": "Snapmaker",
          "bedSize": [
            270,
            270
          ],
          "bedType": "square",
          "maxHeight": 270,
          "image": "https://cdn.simplyprint.io/i/printer_types/snapmaker/u1/product_photo_md.png",
          "hasHeatedBed": true,
          "coolPlate": false,
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ],
          "nozzles": 1,
          "extruders": 1,
          "extruderSettings": null,
          "maxToolTemp": 300,
          "maxBedTemp": 100,
          "probeToolTemp": 0,
          "filamentWidth": 1.75,
          "nozzleDia": 0.4,
          "directDrive": 1,
          "hasAbl": 1,
          "ablOnPrint": 1,
          "axes": {
            "x": {
              "speed": 100,
              "inverted": false
            },
            "y": {
              "speed": 100,
              "inverted": false
            },
            "z": {
              "speed": 3.5,
              "inverted": false
            },
            "e": {
              "speed": 5,
              "inverted": false
            }
          },
          "screwOffset": 35,
          "filamentRetraction": 60,
          "customBoundingBox": null,
          "probingGcode": [
            "G28 ; home all axes",
            "@BEDLEVELVISUALIZER ; tell the plugin to watch for reported mesh",
            "BED_MESH_OUTPUT ; report the bed leveling mesh points."
          ],
          "probingFirmware": "klipper",
          "heatedChamber": 0,
          "canM117": false,
          "extrudeAbs": 0,
          "originCenter": 0,
          "bedBelt": 0,
          "fwRetract": 0,
          "extrusionType": 1,
          "noControl": false,
          "mms": null,
          "startOptions": null,
          "peripheralsDefinition": null,
          "zipPrinting": false,
          "slicerSupport": false,
          "specialExtensions": null,
          "pluginsToInstall": ""
        },
        "hasCam": 0,
        "hasQueue": {
          "items": 1,
          "fits": true
        },
        "locked": 0,
        "lockReason": null,
        "health": {
          "usage": 43,
          "temp": 46,
          "memory": 55
        },
        "unsupported": 0,
        "latency": null,
        "autoprint": false,
        "currentAutoprintJobs": 0,
        "autoprintMaxJobs": null,
        "aiEnabled": false,
        "aiSettings": null,
        "autoprintDetails": {
          "method": null
        },
        "integration": "Moonraker",
        "capabilities": {
          "supported": [
            "layer.progress",
            "time.left"
          ],
          "unsupported": [
            "print.start.predownload"
          ]
        },
        "peripheralsDefinition": null,
        "peripheralsState": null,
        "nopi": 0,
        "licensed": false,
        "serial_number_id": null,
        "outOfOrder": 0
      },
      "filament": {
        "0": {
          "id": 14817,
          "uid": "NBCU",
          "type": {
            "id": 281,
            "name": "PLA"
          },
          "colorName": "White",
          "colorHex": "#FFFFFF",
          "brand": "DevilDesign",
          "nozzle": 0,
          "extruder": 0,
          "printer": 44844,
          "total": 670567,
          "left": 670567,
          "dia": 1.75,
          "customFields": []
        }
      },
      "job": null
    }
  }
}

company.autoprint_state_changed

Company-wide AutoPrint setting was toggled.

Example payload

{
  "webhook_id": 25,
  "event": "company.autoprint_state_changed",
  "timestamp": 1776691249,
  "data": {
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "enabled": true
  }
}

organization.user_signup

A user joined the organization.

Example payload

{
  "webhook_id": 25,
  "event": "organization.user_signup",
  "timestamp": 1776691249,
  "data": {
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "approved": true
  }
}

organization.user_pending

A user submitted a signup request that needs admin approval.

Example payload

{
  "webhook_id": 25,
  "event": "organization.user_pending",
  "timestamp": 1776691249,
  "data": {
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.add_item

A new queue item was added. user is who submitted it.

Example payload

{
  "webhook_id": 25,
  "event": "queue.add_item",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.delete_item

A queue item was removed before printing.

Example payload

{
  "webhook_id": 25,
  "event": "queue.delete_item",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.empty_queue

A queue group (or all groups, if group is null) was emptied. done_items is true when only completed items were cleared.

Example payload

{
  "webhook_id": 25,
  "event": "queue.empty_queue",
  "timestamp": 1776691249,
  "data": {
    "group": {
      "id": 99,
      "name": "Workshop A",
      "virtual": false,
      "extensions": null,
      "sort_order": 0,
      "items_count": 8,
      "for": {
        "printers": null,
        "models": null,
        "groups": null
      },
      "visibility": {
        "user_ranks": null
      },
      "approval": {
        "requires_approval": null,
        "required_ranks": [
          493,
          562
        ],
        "exempt_ranks": null
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.move_item

A queue item moved between groups. Both old_group and new_group are included.

Example payload

{
  "webhook_id": 25,
  "event": "queue.move_item",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "old_group": {
      "id": 213,
      "name": "Workshop A",
      "virtual": false,
      "extensions": null,
      "sort_order": 0,
      "items_count": 8,
      "for": {
        "printers": null,
        "models": null,
        "groups": null
      },
      "visibility": {
        "user_ranks": null
      },
      "approval": {
        "requires_approval": null,
        "required_ranks": [
          493,
          562
        ],
        "exempt_ranks": null
      }
    },
    "new_group": {
      "id": 1838,
      "name": "Workshop A",
      "virtual": false,
      "extensions": null,
      "sort_order": 2,
      "items_count": 1,
      "for": {
        "printers": null,
        "models": null,
        "groups": null
      },
      "visibility": {
        "user_ranks": null
      },
      "approval": {
        "requires_approval": null,
        "required_ranks": null,
        "exempt_ranks": null
      }
    }
  }
}

queue.revive_item

A done item was brought back into the active queue.

Example payload

{
  "webhook_id": 25,
  "event": "queue.revive_item",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.item_pending_approval

A queue item was submitted and needs approval before it can print.

Example payload

{
  "webhook_id": 25,
  "event": "queue.item_pending_approval",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.item_approved

A pending queue item was approved by a reviewer.

Example payload

{
  "webhook_id": 25,
  "event": "queue.item_approved",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "approved_by": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

queue.item_denied

A pending queue item was rejected. reason is the operator's note; removed is true if the item was also deleted.

Example payload

{
  "webhook_id": 25,
  "event": "queue.item_denied",
  "timestamp": 1776691249,
  "data": {
    "queue_item": {
      "id": 430372,
      "filename": "Sphere.3mf",
      "note": null,
      "model": false,
      "printable": true,
      "type": "printable",
      "zipPrintable": true,
      "zipNoModel": true,
      "left": 9,
      "printed": 0,
      "filesystem_id": null,
      "for": {
        "printers": null,
        "models": [
          582
        ],
        "groups": null
      },
      "tags": null,
      "group": 1838,
      "analysis": {
        "v": 12,
        "printArea": {
          "maxX": 184.78,
          "maxY": 169.79,
          "maxZ": 110,
          "minX": 165.23,
          "minY": 150.21,
          "minZ": 0.2
        },
        "movement": {
          "eRelative": 0,
          "mRelative": 0
        },
        "temps": {
          "bed": 55,
          "tool": {
            "T4": 220
          },
          "maxTool": 220
        },
        "modelSize": {
          "x": 19.55,
          "y": 19.58,
          "z": 19.8
        },
        "materialData": [
          {},
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "nozzle": 1
          },
          {
            "type": "PLA",
            "color": "#C12E1F",
            "density": 1.26,
            "diameter": 1.75,
            "vendor": "Bambu Lab",
            "filamentId": "GFA00",
            "settingId": "Bambu PLA Basic @BBL H2D",
            "nozzle": 1
          }
        ],
        "slicer": "BambuStudio",
        "estimate": 759,
        "filament": [
          0,
          0,
          0,
          0,
          707
        ],
        "nozzleSize": 0.4,
        "nozzles": [
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          },
          {
            "size": 0.4,
            "type": "hardened_steel",
            "volumeType": "Standard"
          }
        ],
        "bedType": "High Temp Plate",
        "gcodeFlavor": "Marlin",
        "layerHeight": 0.12,
        "firstLayerHeight": null,
        "totalLayers": 166,
        "slicerVersion": "02.05.02.51",
        "minDeltaRadius": 246.81,
        "forPrinterModel": "Bambu Lab H2D",
        "objects": null
      },
      "added": "2026-04-11T12:05:41+00:00",
      "size": 312308,
      "index": null,
      "cost": {
        "estimate": true,
        "currency": "USD",
        "total_cost": 0.55,
        "used_fallback_cost": true,
        "lines": [
          {
            "id": 1,
            "cost": 0.32,
            "label": "Material usage (account default)",
            "material": {
              "gram": 2.11,
              "extruder": 4,
              "fromPercent": null,
              "toPercent": null,
              "isEstimate": true,
              "usedFallbackCost": true
            }
          },
          {
            "id": 2,
            "cost": null,
            "label": "Material markup"
          },
          {
            "id": 3,
            "cost": 0.21,
            "label": "Machine run time cost"
          },
          {
            "id": 4,
            "cost": 0.01,
            "label": "Energy cost"
          },
          {
            "id": 5,
            "cost": 0.02,
            "label": "Labor cost"
          }
        ]
      },
      "sort_order": 0,
      "user": "John Doe",
      "user_id": 1234,
      "custom_fields": [],
      "quota_warnings": {
        "over_quota": false,
        "insufficient_balance": false,
        "would_exceed": [],
        "details": []
      }
    },
    "denied_by": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "reason": "Rejected by operator",
    "removed": false
  }
}

filament.create

A new filament spool was registered. is_new indicates whether it's brand new or was restored from history.

Example payload

{
  "webhook_id": 25,
  "event": "filament.create",
  "timestamp": 1776691249,
  "data": {
    "filament": {
      "id": 20024,
      "uid": "T93W",
      "type": {
        "id": 100,
        "name": "PLA"
      },
      "brand": "lostboyslab",
      "brandId": null,
      "brandFilamentId": null,
      "brandColorId": null,
      "brandVariantId": null,
      "colorName": "Green",
      "colorHex": "#E4DBCF",
      "dia": 1.75,
      "note": null,
      "productionId": null,
      "batchId": null,
      "cost": 150,
      "storeName": null,
      "storeId": null,
      "qrId": null,
      "nfcId": null,
      "recyclable": true,
      "total": 335284,
      "left": 335284,
      "nozzle": null,
      "extruder": null,
      "printer": null,
      "bought": "2023-12-01T23:00:00+00:00",
      "firstUsedDate": null,
      "lastUsedDate": null,
      "lastDriedDate": null,
      "created": "2023-12-02T16:09:14+00:00",
      "locationId": 48,
      "locationPath": "Storage room #1",
      "locationBeforeAssign": null,
      "emptiedAt": null,
      "emptiedByAuto": false,
      "deleted": false,
      "deletedAt": null,
      "trashReason": null,
      "isNearEmpty": false,
      "autoTrashAt": null,
      "importedFrom": null,
      "importedFromLabel": null,
      "customFields": []
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "is_new": true
  }
}

filament.update

A spool's metadata (cost, notes, remaining length, etc.) was changed.

Example payload

{
  "webhook_id": 25,
  "event": "filament.update",
  "timestamp": 1776691249,
  "data": {
    "filament": {
      "id": 14817,
      "uid": "NBCU",
      "type": {
        "id": 281,
        "name": "PLA"
      },
      "brand": "DevilDesign",
      "brandId": null,
      "brandFilamentId": null,
      "brandColorId": null,
      "brandVariantId": null,
      "colorName": "White",
      "colorHex": "#FFFFFF",
      "dia": 1.75,
      "note": null,
      "productionId": null,
      "batchId": null,
      "cost": 250,
      "storeName": null,
      "storeId": null,
      "qrId": null,
      "nfcId": null,
      "recyclable": false,
      "total": 670567,
      "left": 670567,
      "nozzle": 0,
      "extruder": 0,
      "printer": 44844,
      "bought": "2023-04-08T22:00:00+00:00",
      "firstUsedDate": null,
      "lastUsedDate": null,
      "lastDriedDate": null,
      "created": "2023-04-09T22:08:21+00:00",
      "locationId": null,
      "locationPath": null,
      "locationBeforeAssign": 48,
      "emptiedAt": null,
      "emptiedByAuto": false,
      "deleted": false,
      "deletedAt": null,
      "trashReason": null,
      "isNearEmpty": false,
      "autoTrashAt": null,
      "importedFrom": null,
      "importedFromLabel": null,
      "customFields": []
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

filament.delete

A spool was deleted.

Example payload

{
  "webhook_id": 25,
  "event": "filament.delete",
  "timestamp": 1776691249,
  "data": {
    "filament": {
      "id": 20024,
      "uid": "T93W",
      "type": {
        "id": 100,
        "name": "PLA"
      },
      "brand": "lostboyslab",
      "brandId": null,
      "brandFilamentId": null,
      "brandColorId": null,
      "brandVariantId": null,
      "colorName": "Green",
      "colorHex": "#E4DBCF",
      "dia": 1.75,
      "note": null,
      "productionId": null,
      "batchId": null,
      "cost": 150,
      "storeName": null,
      "storeId": null,
      "qrId": null,
      "nfcId": null,
      "recyclable": true,
      "total": 335284,
      "left": 335284,
      "nozzle": null,
      "extruder": null,
      "printer": null,
      "bought": "2023-12-01T23:00:00+00:00",
      "firstUsedDate": null,
      "lastUsedDate": null,
      "lastDriedDate": null,
      "created": "2023-12-02T16:09:14+00:00",
      "locationId": 48,
      "locationPath": "Storage room #1",
      "locationBeforeAssign": null,
      "emptiedAt": null,
      "emptiedByAuto": false,
      "deleted": false,
      "deletedAt": null,
      "trashReason": null,
      "isNearEmpty": false,
      "autoTrashAt": null,
      "importedFrom": null,
      "importedFromLabel": null,
      "customFields": []
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

filament.assigned

A spool was assigned to a printer slot. replaced_spool is included if it replaced a previously assigned spool.

Example payload

{
  "webhook_id": 25,
  "event": "filament.assigned",
  "timestamp": 1776691249,
  "data": {
    "filament": {
      "id": 14817,
      "uid": "NBCU",
      "type": {
        "id": 281,
        "name": "PLA"
      },
      "brand": "DevilDesign",
      "brandId": null,
      "brandFilamentId": null,
      "brandColorId": null,
      "brandVariantId": null,
      "colorName": "White",
      "colorHex": "#FFFFFF",
      "dia": 1.75,
      "note": null,
      "productionId": null,
      "batchId": null,
      "cost": 250,
      "storeName": null,
      "storeId": null,
      "qrId": null,
      "nfcId": null,
      "recyclable": false,
      "total": 670567,
      "left": 670567,
      "nozzle": 0,
      "extruder": 0,
      "printer": 44844,
      "bought": "2023-04-08T22:00:00+00:00",
      "firstUsedDate": null,
      "lastUsedDate": null,
      "lastDriedDate": null,
      "created": "2023-04-09T22:08:21+00:00",
      "locationId": null,
      "locationPath": null,
      "locationBeforeAssign": 48,
      "emptiedAt": null,
      "emptiedByAuto": false,
      "deleted": false,
      "deletedAt": null,
      "trashReason": null,
      "isNearEmpty": false,
      "autoTrashAt": null,
      "importedFrom": null,
      "importedFromLabel": null,
      "customFields": []
    },
    "printer": {
      "id": 385,
      "sort_order": 3,
      "printer": {
        "name": "Workshop Printer",
        "state": "offline",
        "group": 1377,
        "position": 3,
        "api": "Moonraker",
        "ui": "fluidd",
        "ip": "10.78.16.68",
        "machine": null,
        "online": false,
        "region": null,
        "firmware": "Klipper",
        "firmwareVersion": "1.1.0.105_20260124180406",
        "spVersion": "0.0.1",
        "temps": {
          "ambient": 25,
          "current": {
            "tool": [
              25
            ],
            "bed": 23
          },
          "target": {
            "tool": [
              0
            ],
            "bed": 0
          },
          "targetTemperatures": false
        },
        "tags": {
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ]
        },
        "activeExtruder": 0,
        "activeNozzle": 0,
        "activeTools": [
          0
        ],
        "hasPSU": 0,
        "psuOn": false,
        "hasFilSensor": false,
        "filSensor": false,
        "model": {
          "id": 647,
          "name": "U1",
          "brand": "Snapmaker",
          "bedSize": [
            270,
            270
          ],
          "bedType": "square",
          "maxHeight": 270,
          "image": "https://cdn.simplyprint.io/i/printer_types/snapmaker/u1/product_photo_md.png",
          "hasHeatedBed": true,
          "coolPlate": false,
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ],
          "nozzles": 1,
          "extruders": 1,
          "extruderSettings": null,
          "maxToolTemp": 300,
          "maxBedTemp": 100,
          "probeToolTemp": 0,
          "filamentWidth": 1.75,
          "nozzleDia": 0.4,
          "directDrive": 1,
          "hasAbl": 1,
          "ablOnPrint": 1,
          "axes": {
            "x": {
              "speed": 100,
              "inverted": false
            },
            "y": {
              "speed": 100,
              "inverted": false
            },
            "z": {
              "speed": 3.5,
              "inverted": false
            },
            "e": {
              "speed": 5,
              "inverted": false
            }
          },
          "screwOffset": 35,
          "filamentRetraction": 60,
          "customBoundingBox": null,
          "probingGcode": [
            "G28 ; home all axes",
            "@BEDLEVELVISUALIZER ; tell the plugin to watch for reported mesh",
            "BED_MESH_OUTPUT ; report the bed leveling mesh points."
          ],
          "probingFirmware": "klipper",
          "heatedChamber": 0,
          "canM117": false,
          "extrudeAbs": 0,
          "originCenter": 0,
          "bedBelt": 0,
          "fwRetract": 0,
          "extrusionType": 1,
          "noControl": false,
          "mms": null,
          "startOptions": null,
          "peripheralsDefinition": null,
          "zipPrinting": false,
          "slicerSupport": false,
          "specialExtensions": null,
          "pluginsToInstall": ""
        },
        "hasCam": 0,
        "hasQueue": {
          "items": 1,
          "fits": true
        },
        "locked": 0,
        "lockReason": null,
        "health": {
          "usage": 43,
          "temp": 46,
          "memory": 55
        },
        "unsupported": 0,
        "latency": null,
        "autoprint": false,
        "currentAutoprintJobs": 0,
        "autoprintMaxJobs": null,
        "aiEnabled": false,
        "aiSettings": null,
        "autoprintDetails": {
          "method": null
        },
        "integration": "Moonraker",
        "capabilities": {
          "supported": [
            "layer.progress",
            "time.left"
          ],
          "unsupported": [
            "print.start.predownload"
          ]
        },
        "peripheralsDefinition": null,
        "peripheralsState": null,
        "nopi": 0,
        "licensed": false,
        "serial_number_id": null,
        "outOfOrder": 0
      },
      "filament": {
        "0": {
          "id": 14817,
          "uid": "NBCU",
          "type": {
            "id": 281,
            "name": "PLA"
          },
          "colorName": "White",
          "colorHex": "#FFFFFF",
          "brand": "DevilDesign",
          "nozzle": 0,
          "extruder": 0,
          "printer": 44844,
          "total": 670567,
          "left": 670567,
          "dia": 1.75,
          "customFields": []
        }
      },
      "job": null
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "replaced_spool": null
  }
}

filament.unassigned

A spool was removed from a printer slot.

Example payload

{
  "webhook_id": 25,
  "event": "filament.unassigned",
  "timestamp": 1776691249,
  "data": {
    "filament": {
      "id": 14817,
      "uid": "NBCU",
      "type": {
        "id": 281,
        "name": "PLA"
      },
      "brand": "DevilDesign",
      "brandId": null,
      "brandFilamentId": null,
      "brandColorId": null,
      "brandVariantId": null,
      "colorName": "White",
      "colorHex": "#FFFFFF",
      "dia": 1.75,
      "note": null,
      "productionId": null,
      "batchId": null,
      "cost": 250,
      "storeName": null,
      "storeId": null,
      "qrId": null,
      "nfcId": null,
      "recyclable": false,
      "total": 670567,
      "left": 670567,
      "nozzle": 0,
      "extruder": 0,
      "printer": 44844,
      "bought": "2023-04-08T22:00:00+00:00",
      "firstUsedDate": null,
      "lastUsedDate": null,
      "lastDriedDate": null,
      "created": "2023-04-09T22:08:21+00:00",
      "locationId": null,
      "locationPath": null,
      "locationBeforeAssign": 48,
      "emptiedAt": null,
      "emptiedByAuto": false,
      "deleted": false,
      "deletedAt": null,
      "trashReason": null,
      "isNearEmpty": false,
      "autoTrashAt": null,
      "importedFrom": null,
      "importedFromLabel": null,
      "customFields": []
    },
    "printer": {
      "id": 385,
      "sort_order": 3,
      "printer": {
        "name": "Workshop Printer",
        "state": "offline",
        "group": 1377,
        "position": 3,
        "api": "Moonraker",
        "ui": "fluidd",
        "ip": "10.78.16.68",
        "machine": null,
        "online": false,
        "region": null,
        "firmware": "Klipper",
        "firmwareVersion": "1.1.0.105_20260124180406",
        "spVersion": "0.0.1",
        "temps": {
          "ambient": 25,
          "current": {
            "tool": [
              25
            ],
            "bed": 23
          },
          "target": {
            "tool": [
              0
            ],
            "bed": 0
          },
          "targetTemperatures": false
        },
        "tags": {
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ]
        },
        "activeExtruder": 0,
        "activeNozzle": 0,
        "activeTools": [
          0
        ],
        "hasPSU": 0,
        "psuOn": false,
        "hasFilSensor": false,
        "filSensor": false,
        "model": {
          "id": 647,
          "name": "U1",
          "brand": "Snapmaker",
          "bedSize": [
            270,
            270
          ],
          "bedType": "square",
          "maxHeight": 270,
          "image": "https://cdn.simplyprint.io/i/printer_types/snapmaker/u1/product_photo_md.png",
          "hasHeatedBed": true,
          "coolPlate": false,
          "nozzleData": [
            {
              "extruders": 1,
              "size": 0.4,
              "i": 0,
              "virtualLayout": false,
              "nozzleIndex": 0
            }
          ],
          "nozzles": 1,
          "extruders": 1,
          "extruderSettings": null,
          "maxToolTemp": 300,
          "maxBedTemp": 100,
          "probeToolTemp": 0,
          "filamentWidth": 1.75,
          "nozzleDia": 0.4,
          "directDrive": 1,
          "hasAbl": 1,
          "ablOnPrint": 1,
          "axes": {
            "x": {
              "speed": 100,
              "inverted": false
            },
            "y": {
              "speed": 100,
              "inverted": false
            },
            "z": {
              "speed": 3.5,
              "inverted": false
            },
            "e": {
              "speed": 5,
              "inverted": false
            }
          },
          "screwOffset": 35,
          "filamentRetraction": 60,
          "customBoundingBox": null,
          "probingGcode": [
            "G28 ; home all axes",
            "@BEDLEVELVISUALIZER ; tell the plugin to watch for reported mesh",
            "BED_MESH_OUTPUT ; report the bed leveling mesh points."
          ],
          "probingFirmware": "klipper",
          "heatedChamber": 0,
          "canM117": false,
          "extrudeAbs": 0,
          "originCenter": 0,
          "bedBelt": 0,
          "fwRetract": 0,
          "extrusionType": 1,
          "noControl": false,
          "mms": null,
          "startOptions": null,
          "peripheralsDefinition": null,
          "zipPrinting": false,
          "slicerSupport": false,
          "specialExtensions": null,
          "pluginsToInstall": ""
        },
        "hasCam": 0,
        "hasQueue": {
          "items": 1,
          "fits": true
        },
        "locked": 0,
        "lockReason": null,
        "health": {
          "usage": 43,
          "temp": 46,
          "memory": 55
        },
        "unsupported": 0,
        "latency": null,
        "autoprint": false,
        "currentAutoprintJobs": 0,
        "autoprintMaxJobs": null,
        "aiEnabled": false,
        "aiSettings": null,
        "autoprintDetails": {
          "method": null
        },
        "integration": "Moonraker",
        "capabilities": {
          "supported": [
            "layer.progress",
            "time.left"
          ],
          "unsupported": [
            "print.start.predownload"
          ]
        },
        "peripheralsDefinition": null,
        "peripheralsState": null,
        "nopi": 0,
        "licensed": false,
        "serial_number_id": null,
        "outOfOrder": 0
      },
      "filament": {
        "0": {
          "id": 14817,
          "uid": "NBCU",
          "type": {
            "id": 281,
            "name": "PLA"
          },
          "colorName": "White",
          "colorHex": "#FFFFFF",
          "brand": "DevilDesign",
          "nozzle": 0,
          "extruder": 0,
          "printer": 44844,
          "total": 670567,
          "left": 670567,
          "dia": 1.75,
          "customFields": []
        }
      },
      "job": null
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

balance.charged

A print was charged against the user's balance. transaction includes the balance movement.

Example payload

{
  "webhook_id": 25,
  "event": "balance.charged",
  "timestamp": 1776691249,
  "data": {
    "transaction": {
      "id": 26,
      "amount": 0.05,
      "balance_after": 45.36,
      "type": "print_refund",
      "reference_type": "print_job",
      "reference_id": 5080369,
      "reason": "Overpayment refund",
      "metadata": null,
      "performed_by": null,
      "created_at": "2026-03-23T08:38:37+00:00"
    }
  }
}

balance.refunded

A prior print charge was refunded.

Example payload

{
  "webhook_id": 25,
  "event": "balance.refunded",
  "timestamp": 1776691249,
  "data": {
    "transaction": {
      "id": 26,
      "amount": 0.05,
      "balance_after": 45.36,
      "type": "print_refund",
      "reference_type": "print_job",
      "reference_id": 5080369,
      "reason": "Overpayment refund",
      "metadata": null,
      "performed_by": null,
      "created_at": "2026-03-23T08:38:37+00:00"
    }
  }
}

balance.topped_up

A user topped up their balance.

Example payload

{
  "webhook_id": 25,
  "event": "balance.topped_up",
  "timestamp": 1776691249,
  "data": {
    "transaction": {
      "id": 26,
      "amount": 0.05,
      "balance_after": 45.36,
      "type": "print_refund",
      "reference_type": "print_job",
      "reference_id": 5080369,
      "reason": "Overpayment refund",
      "metadata": null,
      "performed_by": null,
      "created_at": "2026-03-23T08:38:37+00:00"
    }
  }
}

balance.adjusted

An operator manually adjusted a user's balance.

Example payload

{
  "webhook_id": 25,
  "event": "balance.adjusted",
  "timestamp": 1776691249,
  "data": {
    "transaction": {
      "id": 26,
      "amount": 0.05,
      "balance_after": 45.36,
      "type": "print_refund",
      "reference_type": "print_job",
      "reference_id": 5080369,
      "reason": "Overpayment refund",
      "metadata": null,
      "performed_by": null,
      "created_at": "2026-03-23T08:38:37+00:00"
    }
  }
}

quota.request_new

A user requested an increase to their print quota.

Example payload

{
  "webhook_id": 25,
  "event": "quota.request_new",
  "timestamp": 1776691249,
  "data": {
    "request": {
      "id": 11,
      "user_id": 76716,
      "user_name": "John Doe",
      "quota_type": "material_grams",
      "material_type": null,
      "requested_amount": 200,
      "message": "need to print this file",
      "status": "approved",
      "resolved_by": 6976,
      "resolved_at": "2026-04-04T19:37:10+00:00",
      "resolved_message": null,
      "adjustment_applied": 200,
      "created_at": "2026-04-04T19:37:05+00:00"
    }
  }
}

quota.request_resolved

An admin approved or denied a quota request.

Example payload

{
  "webhook_id": 25,
  "event": "quota.request_resolved",
  "timestamp": 1776691249,
  "data": {
    "request": {
      "id": 11,
      "user_id": 76716,
      "user_name": "John Doe",
      "quota_type": "material_grams",
      "material_type": null,
      "requested_amount": 200,
      "message": "need to print this file",
      "status": "approved",
      "resolved_by": 6976,
      "resolved_at": "2026-04-04T19:37:10+00:00",
      "resolved_message": null,
      "adjustment_applied": 200,
      "created_at": "2026-04-04T19:37:05+00:00"
    },
    "resolved_by": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

quota.adjusted

An admin manually adjusted a user's quota allocation.

Example payload

{
  "webhook_id": 25,
  "event": "quota.adjusted",
  "timestamp": 1776691249,
  "data": {
    "period": {
      "id": 105,
      "quota_type": "cost",
      "material_type": null,
      "period_start": "2026-04-01T00:00:00+02:00",
      "period_end": "2026-05-01T00:00:00+02:00",
      "consumed": 0,
      "limit_snapshot": 10,
      "adjustment": 0,
      "rolled_over": 0,
      "total_allowed": 10,
      "remaining": 10,
      "is_active": true,
      "period_type": "monthly",
      "period_anchor": "calendar"
    },
    "amount": 50,
    "performed_by": 1
  }
}

quota.reset

A user's quota period was reset (rolled over).

Example payload

{
  "webhook_id": 25,
  "event": "quota.reset",
  "timestamp": 1776691249,
  "data": {
    "period": {
      "id": 105,
      "quota_type": "cost",
      "material_type": null,
      "period_start": "2026-04-01T00:00:00+02:00",
      "period_end": "2026-05-01T00:00:00+02:00",
      "consumed": 0,
      "limit_snapshot": 10,
      "adjustment": 0,
      "rolled_over": 0,
      "total_allowed": 10,
      "remaining": 10,
      "is_active": true,
      "period_type": "monthly",
      "period_anchor": "calendar"
    },
    "performed_by": 1
  }
}

maintenance.job_created

A maintenance job was scheduled on a printer. auto_created indicates whether the job was generated by a schedule rather than created manually.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_created",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.job_started

A scheduled maintenance job was started by a technician. started_at marks the moment work began.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_started",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.job_completed

A maintenance job was marked complete. downtime_seconds is the elapsed time between started_at and completed_at.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_completed",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    },
    "downtime_seconds": 927
  }
}

maintenance.job_cancelled

A maintenance job was cancelled before completion. cancelled_at records when the cancellation occurred.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_cancelled",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.job_overdue

A scheduled maintenance job passed its due date without being completed. scheduled_date is echoed at the top level for convenience.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_overdue",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "scheduled_date": null
  }
}

maintenance.job_reopened

A completed or cancelled maintenance job was reopened for further work.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_reopened",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.job_updated

A maintenance job's metadata (title, priority, assignees, etc.) was edited. The full job object reflects its post-update state.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_updated",
  "timestamp": 1776691249,
  "data": {
    "job": {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.job_deleted

A maintenance job was deleted. The entity is gone, so only the title and printer name are included, not a full job object.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.job_deleted",
  "timestamp": 1776691249,
  "data": {
    "job_title": "Quarterly inspection",
    "printer_name": "Printer A",
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.task_completed

A checklist task inside a maintenance job was marked done. The parent job object is included so subscribers can track overall progress.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.task_completed",
  "timestamp": 1776691249,
  "data": {
    "task": {
      "id": 2133,
      "template_id": 293,
      "name": "Routine maintenance",
      "description": null,
      "is_required": true,
      "is_completed": false,
      "completed_at": null,
      "completed_by": null,
      "skipped_at": null,
      "skipped_by": null,
      "spare_part": null,
      "spare_part_quantity": 1,
      "gcode_snippet_ids": null,
      "gcode_snippets": null,
      "instructions": null,
      "reference_url": null,
      "youtube_url": null,
      "course_id": null,
      "course_url": null,
      "spare_part_category": null,
      "tool": null,
      "sort_order": 0,
      "assigned_to": null,
      "notes": null,
      "custom_field_values": []
    },
    "job": {
      "id": 492,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "in_progress",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T18:51:41+00:00",
      "completed_at": null,
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 0,
      "completed_tasks": 0,
      "total_tasks": 4,
      "required_tasks": 2,
      "completed_required_tasks": 0,
      "assignees": [],
      "problems": [
        {
          "id": 66,
          "status": "resolved",
          "description": null,
          "problem_type": null,
          "printer_id": 385,
          "reported_by": {
            "id": 1234,
            "name": "John Doe"
          },
          "created_at": "2026-04-14T18:43:57+00:00"
        }
      ],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T18:51:40+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.task_skipped

A checklist task was skipped with a note. notes on the task object captures the reason given by the technician.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.task_skipped",
  "timestamp": 1776691249,
  "data": {
    "task": {
      "id": 2133,
      "template_id": 293,
      "name": "Routine maintenance",
      "description": null,
      "is_required": true,
      "is_completed": false,
      "completed_at": null,
      "completed_by": null,
      "skipped_at": null,
      "skipped_by": null,
      "spare_part": null,
      "spare_part_quantity": 1,
      "gcode_snippet_ids": null,
      "gcode_snippets": null,
      "instructions": null,
      "reference_url": null,
      "youtube_url": null,
      "course_id": null,
      "course_url": null,
      "spare_part_category": null,
      "tool": null,
      "sort_order": 0,
      "assigned_to": null,
      "notes": null,
      "custom_field_values": []
    },
    "job": {
      "id": 492,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "in_progress",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T18:51:41+00:00",
      "completed_at": null,
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 0,
      "completed_tasks": 0,
      "total_tasks": 4,
      "required_tasks": 2,
      "completed_required_tasks": 0,
      "assignees": [],
      "problems": [
        {
          "id": 66,
          "status": "resolved",
          "description": null,
          "problem_type": null,
          "printer_id": 385,
          "reported_by": {
            "id": 1234,
            "name": "John Doe"
          },
          "created_at": "2026-04-14T18:43:57+00:00"
        }
      ],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T18:51:40+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.problem_reported

A user reported a printer problem. print_job_id links the report to an in-progress print when the problem was raised mid-print.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.problem_reported",
  "timestamp": 1776691249,
  "data": {
    "problem": {
      "id": 68,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "problem_type": null,
      "reported_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "print_job_id": null,
      "description": null,
      "status": "resolved",
      "resolved_at": "2026-04-14T18:56:28+00:00",
      "resolved_by_job_id": null,
      "linked_jobs": [],
      "custom_field_values": [],
      "created_at": "2026-04-14T18:56:25+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.problem_resolved

A previously-reported problem was marked resolved. resolved_by_job_id points to the maintenance job that fixed it, if any.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.problem_resolved",
  "timestamp": 1776691249,
  "data": {
    "problem": {
      "id": 68,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "problem_type": null,
      "reported_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "print_job_id": null,
      "description": null,
      "status": "resolved",
      "resolved_at": "2026-04-14T18:56:28+00:00",
      "resolved_by_job_id": null,
      "linked_jobs": [],
      "custom_field_values": [],
      "created_at": "2026-04-14T18:56:25+00:00"
    },
    "printer": {
      "id": 385,
      "name": "Workshop Printer"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.schedule_created

A recurring-maintenance schedule template was created. trigger_type and trigger_value together describe the cadence (for example, interval_days every 30 days).

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.schedule_created",
  "timestamp": 1776691249,
  "data": {
    "schedule": {
      "id": 107,
      "name": "Routine maintenance",
      "description": null,
      "enabled": true,
      "trigger_type": "interval_days",
      "trigger_value": 30,
      "trigger_config": {
        "mode": null,
        "template_ids": null,
        "cancel_reason_type": null
      },
      "task_assignment_mode": "manual",
      "auto_task_template_ids": null,
      "min_usage_threshold": null,
      "advance_notice_days": 7,
      "snooze_days": 7,
      "stagger_max_concurrent": null,
      "stagger_period": null,
      "auto_assign_user_ids": null,
      "job_title_template": null,
      "job_priority": "normal",
      "scope_type": "company",
      "scope_ids": null,
      "task_template_ids": [],
      "last_evaluated_at": null,
      "created_at": "2026-04-09T19:15:24+00:00"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.schedule_updated

An existing maintenance schedule was edited. The full schedule object reflects its post-update state.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.schedule_updated",
  "timestamp": 1776691249,
  "data": {
    "schedule": {
      "id": 107,
      "name": "Routine maintenance",
      "description": null,
      "enabled": true,
      "trigger_type": "interval_days",
      "trigger_value": 30,
      "trigger_config": {
        "mode": null,
        "template_ids": null,
        "cancel_reason_type": null
      },
      "task_assignment_mode": "manual",
      "auto_task_template_ids": null,
      "min_usage_threshold": null,
      "advance_notice_days": 7,
      "snooze_days": 7,
      "stagger_max_concurrent": null,
      "stagger_period": null,
      "auto_assign_user_ids": null,
      "job_title_template": null,
      "job_priority": "normal",
      "scope_type": "company",
      "scope_ids": null,
      "task_template_ids": [],
      "last_evaluated_at": null,
      "created_at": "2026-04-09T19:15:24+00:00"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.schedule_deleted

A maintenance schedule was deleted; only the schedule name is included since the entity no longer exists.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.schedule_deleted",
  "timestamp": 1776691249,
  "data": {
    "schedule_name": "Monthly cleaning",
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.spare_part_created

A spare part was added to inventory. is_low_stock and is_out_of_stock are computed against the configured threshold and current quantity.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.spare_part_created",
  "timestamp": 1776691249,
  "data": {
    "spare_part": {
      "id": 168,
      "name": "Routine maintenance",
      "description": null,
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": null,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": null,
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": false,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-04-09T19:06:34+00:00"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.spare_part_updated

A spare part's details were edited. The full spare part object reflects its post-update state.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.spare_part_updated",
  "timestamp": 1776691249,
  "data": {
    "spare_part": {
      "id": 168,
      "name": "Routine maintenance",
      "description": null,
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": null,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": null,
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": false,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-04-09T19:06:34+00:00"
    },
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.spare_part_deleted

A spare part was removed from inventory. Only name and sku are included since the entity no longer exists.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.spare_part_deleted",
  "timestamp": 1776691249,
  "data": {
    "name": "0.4mm brass nozzle",
    "sku": "NOZ-04",
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

maintenance.low_stock

A spare part reached its configured low-stock threshold. Use this to trigger re-ordering workflows.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.low_stock",
  "timestamp": 1776691249,
  "data": {
    "spare_part": {
      "id": 168,
      "name": "Routine maintenance",
      "description": null,
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": null,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": null,
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": false,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-04-09T19:06:34+00:00"
    }
  }
}

maintenance.stock_adjusted

A spare part's stock count was adjusted. mode is increment, decrement, or set; reason is optional.

Example payload

{
  "webhook_id": 25,
  "event": "maintenance.stock_adjusted",
  "timestamp": 1776691249,
  "data": {
    "spare_part": {
      "id": 168,
      "name": "Routine maintenance",
      "description": null,
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": null,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": null,
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": false,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-04-09T19:06:34+00:00"
    },
    "old_quantity": 10,
    "new_quantity": 5,
    "adjustment": -5,
    "mode": "decrement",
    "reason": "Used in repair",
    "user": {
      "id": 1234,
      "sso": false,
      "first_name": "John",
      "last_name": "Doe",
      "avatar": "https://cdn.simplyprint.io/avatars/default.png"
    }
  }
}

Available events

Event Description
balance.adjusted Triggered when balance is adjusted.
balance.charged Triggered when balance is charged.
balance.refunded Triggered when balance is refunded.
balance.topped_up Triggered when balance is topped up.
company.autoprint_state_changed Triggered when the autoprint state of a company is changed.
filament.assigned Triggered when filament is assigned to a printer.
filament.create Triggered when filament is created.
filament.delete Triggered when filament is deleted.
filament.unassigned Triggered when filament is unassigned from a printer.
filament.update Triggered when filament is updated.
job.bed_cleared Triggered when the bed is cleared.
job.cancelled Triggered when a job is cancelled.
job.done Triggered when a job is done.
job.failed Triggered when a job has failed.
job.objects_skipped Triggered when objects are skipped in a print job.
job.paused Triggered when a job is paused.
job.resumed Triggered when a job is resumed.
job.started Triggered when a job is started.
maintenance.job_cancelled Triggered when a maintenance job is cancelled.
maintenance.job_completed Triggered when a maintenance job is completed.
maintenance.job_created Triggered when a maintenance job is created.
maintenance.job_deleted Triggered when a maintenance job is deleted.
maintenance.job_overdue Triggered when a maintenance job becomes overdue.
maintenance.job_reopened Triggered when a maintenance job is reopened.
maintenance.job_started Triggered when a maintenance job is started.
maintenance.job_updated Triggered when a maintenance job is updated.
maintenance.low_stock Triggered when a maintenance spare part reaches low stock.
maintenance.problem_reported Triggered when a maintenance problem is reported.
maintenance.problem_resolved Triggered when a maintenance problem is resolved.
maintenance.schedule_created Triggered when a maintenance schedule is created.
maintenance.schedule_deleted Triggered when a maintenance schedule is deleted.
maintenance.schedule_updated Triggered when a maintenance schedule is updated.
maintenance.spare_part_created Triggered when a maintenance spare part is created.
maintenance.spare_part_deleted Triggered when a maintenance spare part is deleted.
maintenance.spare_part_updated Triggered when a maintenance spare part is updated.
maintenance.stock_adjusted Triggered when maintenance spare part stock is adjusted.
maintenance.task_completed Triggered when a maintenance task is completed.
maintenance.task_skipped Triggered when a maintenance task is skipped.
organization.user_pending Triggered when a user is pending approval for an organization.
organization.user_signup Triggered when a user signs up to an organization.
printer.ai_failure_detected Triggered when AI detects a potential print failure.
printer.ai_failure_false_positive Triggered when a detected AI failure is resolved as a false positive.
printer.ai_state_changed Triggered when a printer AI state changes.
printer.autoprint_max_cycles Triggered when a printer reaches its configured autoprint max cycles.
printer.autoprint_state_changed Triggered when the autoprint state of a printer is changed.
printer.custom_tag_assigned Triggered when a custom tag is assigned to a printer.
printer.custom_tag_detached Triggered when a custom tag is detached from a printer.
printer.material_changed Triggered when the material of a printer is changed.
printer.nozzle_size_changed Triggered when the nozzle size of a printer is changed.
printer.out_of_order_state_changed Triggered when a printer enters or leaves out-of-order state.
queue.add_item Triggered when a queue item is added.
queue.delete_item Triggered when a queue item is deleted.
queue.empty_queue Triggered when a queue is emptied.
queue.item_approved Triggered when a queue item is approved.
queue.item_denied Triggered when a queue item is denied.
queue.item_pending_approval Triggered when a queue item requires approval.
queue.move_item Triggered when a queue item is moved.
queue.revive_item Triggered when a done queue item is revived.
quota.adjusted Triggered when quota is adjusted.
quota.request_new Triggered when a new quota request is created.
quota.request_resolved Triggered when a quota request is resolved.
quota.reset Triggered when quota is reset.

GCode Macros

Get overview

curl https://api.simplyprint.io/{id}/gcode_macros/GetOverview \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "gcodeCompletions": [
    {
      "label": "G0",
      "type": "variable",
      "info": "Add a straight line movement to the planner",
      "detail": "X, Y, Z, E, F, S"
    }
  ],
  "macro_groups": [
    {
      "name": "<i class='fas fa-infinity'><\/i> AutoPrint <i>(advanced)<\/i>",
      "desc": "The AutoPrint feature can automatically start prints. Here you define what Gcode should be executed to make sure the bed is clear.",
      "macros": [
        "is_autoprint_clear"
      ],
      "nopersonal": true
    }
  ],
  "macros_cards": {
    "is_start": {
      "name": "Start print",
      "description": "GCODE to be executed at start of print when using our slicer"
    }
  },
  "macros": {
    "company": [
      {
        "gcodes": {
          "printer_225": [
            "{snippet:2731}"
          ],
          "printer_10063": null,
          "printer_10372": [
            "{snippet:2796}"
          ]
        },
        "type": "is_start"
      }
    ],
    "personal": null,
    "sp": [
      {
        "gcodes": {
          "type_0": [
            "{snippet:26}"
          ],
          "type_236": [
            "{snippet:1103}",
            "{snippet:26}"
          ]
        },
        "type": "is_pause"
      }
    ]
  },
  "snippets": {
    "company": [
      {
        "id": 28,
        "name": "Indentify Ender 5",
        "description": "Identify printer specifically for Ender 5",
        "priority": 0,
        "created": "2020-04-22T09:19:37+00:00"
      }
    ]
  },
  "variables": {
    "bed_x": "Printer bed X length in mm",
    "bed_y": "Printer bed Y length in mm"
  },
  "slicerVariables": {
    "temp": "Hot end temperature",
    "bed_temp": "Bed temperature",
    "fan_speed": "Active cooling fan speed (usually 0-255)"
  }
}

GET /{id}/gcode_macros/GetOverview

Response

See example response.

Get snippet

curl https://api.simplyprint.io/{id}/gcode_macros/GetSnippet?id=123 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \

Success Response

{
  "status": true,
  "message": null,
  "snippet": {
    "id": 123,
    "name": "Example Snippet",
    "description": "This is an example snippet",
    "priority": 0,
    "gcode": "G1 X10 Y10"
  }
}

GET /gcode_macros/GetSnippet

Request Parameters

Parameter Type Description
id integer The ID of the snippet to retrieve.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
snippet object The details of the snippet.
snippet.id integer Unique identifier for the snippet.
snippet.name string Name of the snippet.
snippet.description string Description of the snippet.
snippet.priority integer Priority of the snippet.
snippet.gcode string? GCode content of the snippet (if any).

Save snippet

curl -X POST https://api.simplyprint.io/{id}/gcode_macros/SaveSnippet?id=123&type=private \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "name": "Updated Snippet",
    "description": "This is an updated snippet.",
    "gcode": ["G1 X10 Y10", "G1 X20 Y20"]
  }'

Success Response

{
  "status": true,
  "message": null,
  "new_data": {
    // Updated data of the GCODE snippets
  }
}

POST /gcode_macros/SaveSnippet

Request Parameters

Parameter Type Description
id integer The ID of the snippet to update (optional for creating a new snippet).
type string The type of the snippet (org, private, public).

Request Body

Parameter Type Description
name string The name of the GCODE snippet.
description string The description of the snippet.
gcode array The GCODE commands of the snippet.
gcode.* string A single GCODE command.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
created integer The ID of the newly created snippet (if applicable).
new_data object The updated data of the GCODE snippets.

Delete snippet

curl -X POST https://api.simplyprint.io/{id}/gcode_macros/DeleteSnippet?id=123 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success Response

{
  "status": true,
  "message": null,
  "new_data": {
    // Updated data of the GCODE snippets
  }
}

POST /gcode_macros/DeleteSnippet

Request Parameters

Parameter Type Description
id integer The ID of the snippet to delete (required if ids is not provided).
ids string Comma-separated list of IDs of snippets to delete (required if id is not provided).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
new_data object The updated data of the GCODE snippets.

Get macro

curl https://api.simplyprint.io/{id}/gcode_macros/GetMacroGcode?macro=is_start&printer=123&model=456&org=true&private=false&public=true \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \

Success Response

{
  "status": true,
  "message": null,
  "gcode": [
    "G1 X10 Y10",
    "G1 X20 Y20"
  ],
  "multiple": false
}

GET /gcode_macros/GetMacroGcode

Request Parameters

Parameter Type Description
macro string The type of the macro. Must be one of the enums defined in GcodeMacroType.
printer integer The ID of the printer.
model integer The ID of the printer model.
org boolean Whether to include organization macros.
private boolean Whether to include private macros.
public boolean Whether to include public macros.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
gcode array The GCODE commands of the macro.
multiple boolean Whether multiple GCODEs are returned.

Save macro

curl -X POST https://api.simplyprint.io/gcode_macros/SaveMacro?type=private \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
  "type": "is_start",
  "gcodes": {"printer_225": ["G1 X10 Y10"], "type_123": ["G1 X20 Y20", "{snippet:123}"]}
  }'

Success Response

{
  "status": true,
  "message": null
}
Required permission Description
gcode_profiles Required if macro is of type org.

POST /gcode_macros/SaveMacro

Request Parameters

Parameter Type Description
type string One of org, private

Request Body

Parameter Type Description
type string One of is_start, is_end, is_cancel, is_pause, is_resume, is_autorpint_clear
gcodes object Content of the macro.
gcodes.printer_{id} array GCODE commands for the printer with ID {id}.
gcodes.type_{id} array GCODE commands for the printer model with ID {id}.
gcodes.*[] string Can be a GCODE command or {snippet:{id}} to reference a snippet.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Arrange gcode order in macro

curl -X POST https://api.simplyprint.io/gcode_macros/Arrange \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "order": [4,2,3,1]
  }'

Success Response

{
  "status": true,
  "message": null
}

POST /gcode_macros/Arrange

Request Parameters

Parameter Type Description
order array An array of snippet IDs in the desired order.
order.* integer A single snippet ID.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Courses

Get course

curl https://api.simplyprint.io/{id}/courses/GetCourse?id=123 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "course": {
    // Course details
  },
  "slides": [
    // Course slides
  ],
  "embeds": [
    {
      "name": "Embed",
      "logo": "example.png",
      "privacy_policy": "https://example.com/privacy",
      "allowed_url": "https://example.com/embed",
      "how_to_embed_guide": "https://example.com/embed_guide"
    }
  ]
}
Required permission Description
courses_view Required to view courses.
courses_manage Required for teacher view.

GET /{id}/courses/GetCourse

Request Parameters

Parameter Type Description
id integer The ID of the course to retrieve.
teacher_view boolean Whether to retrieve the course in teacher view mode.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
course object The course details.
slides array The slides of the course.
embeds array The embed types for the course.

Delete course

curl -X POST https://api.simplyprint.io/{id}/courses/DeleteCourse \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "id": 123
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
courses_manage

POST /{id}/courses/DeleteCourse

Request Body

Parameter Type Description
id integer The ID of the course to delete.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Move course

curl -X POST https://api.simplyprint.io/{id}/courses/MoveCourse \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "course": 123,
    "category": 456
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
courses_manage

POST /{id}/courses/MoveCourse

Request Body

Parameter Type Description
course integer The ID of the course to move.
category integer The ID of the new category.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Publish/unpublish course

curl -X POST https://api.simplyprint.io/{id}/courses/PublishCourse \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "id": 123
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
courses_manage

POST /{id}/courses/PublishCourse

Request Parameters

Parameter Description
unpublish Set if the course should be unpublished (no value required).

Request Body

Parameter Type Description
id integer The ID of the course to publish.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Create/update category

curl -X POST https://api.simplyprint.io/{id}/courses/CreateCategory \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "name": "New Category",
    "public": true
  }'

Success response

{
  "status": true,
  "message": null,
  "category": {
    "id": 123,
    "name": "New Category",
    "public": true
  }
}
Required permissions
courses_manage

POST /{id}/courses/CreateCategory

Request Body

Parameter Type Description
language string The language code (2 characters) (optional).
id integer The ID of the category to update (optional to update existing category).
name string The name of the category.
public boolean Whether the category is public.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
category object The created or updated category details.

Delete category

curl -X POST https://api.simplyprint.io/{id}/courses/DeleteCategory \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "id": 123
  }'

Success response

{
  "status": true,
  "message": null
}
Required permissions
courses_manage

POST /{id}/courses/DeleteCategory

Request Body

Parameter Type Description
id integer The ID of the category to delete.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Partner

Get companies

curl -X POST https://api.simplyprint.io/{id}/partner/GetCompanies \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "page": 1,
    "page_size": 10,
    "search": "example",
    "sort_id": "name",
    "sort_dir": "asc"
  }'

Success response

{
  "status": true,
  "message": null,
  "data": [
    // List of companies
  ],
  "total": 100,
  "page_amount": 10
}

POST /{id}/partner/GetCompanies

Request Body

Parameter Type Description
page integer The page number to retrieve.
page_size integer The number of items per page (between 1 and 100).
search string Search term to filter companies (max 50 chars).
sort_id string The field to sort by.
sort_dir string The direction to sort (asc or desc).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
data array The list of companies.
total integer The total number of companies.
page_amount integer The total number of pages.

Get company

curl https://api.simplyprint.io/{id}/partner/GetCompany?company=123&initial=true \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "data": {
    "id": 123,
    "name": "Example Company",
    "vat": "12345678",
    "ean": "1234567890123",
    "trial_until": "2023-12-31T23:59:59",
    "country": "US",
    "uid": "unique-id",
    "created": "2023-01-01T00:00:00",
    "active": true,
    "sponsored": false,
    "public_edu": true,
    "plan": "premium",
    "type": "business",
    "max_printers": 10,
    "max_users": 50,
    "user_max_gb": 100,
    "address": "123 Example St",
    "contact_person": "John Doe",
    "contact_email": "john.doe@example.com",
    "contact_phone": "+1234567890",
    "user_count": 25,
    "printers_count": 5,
    "online_printers": 3,
    "week_jobs": 10,
    "total_jobs": 100,
    "filament": 20,
    "success_jobs": 8,
    "online_user_count": 15,
    "user_space_used": 50
  },
  "users_data": {
    // Initial user data if applicable
  }
}

GET /{id}/partner/GetCompany

Request Parameters

Parameter Type Description
company integer The ID of the company to retrieve.
initial boolean Whether to include initial user data (optional).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
data object The company details.
users_data object Initial user data if initial is true.

Get overview stats

curl https://api.simplyprint.io/{id}/partner/GetOverviewStats \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null,
  "total_active_managed_companies": 10,
  "total_trial_managed_companies": 2,
  "total_inactive_managed_companies": 3,
  "total_printers": 50,
  "total_online_printers": 30,
  "total_print_jobs": 200,
  "total_print_jobs_last_7_days": 20,
  "total_users": 100,
  "total_users_online_last_7_days": 15
}

GET /{id}/partner/GetOverviewStats

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
total_active_managed_companies integer Total number of active managed companies.
total_trial_managed_companies integer Total number of managed companies in trial.
total_inactive_managed_companies integer Total number of inactive managed companies.
total_printers integer Total number of printers for all managed companies.
total_online_printers integer Total number of online printers for all managed companies.
total_print_jobs integer Total number of print jobs for all managed companies.
total_print_jobs_last_7_days integer Total number of print jobs in the last 7 days.
total_users integer Total number of users for all managed companies.
total_users_online_last_7_days integer Total number of users online in the last 7 days.

Create/update company

curl -X POST https://api.simplyprint.io/{id}/partner/CreateCompany \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "name": "Example Company",
    "uid": "unique-id",
    "active": 1,
    "trial_until": "2023-12-31",
    "public_edu": true,
    "extra_printers": 5,
    "extra_users": 50,
    "extra_gb": 100,
    "active_plan": 5,
    "type": 1,
    "contact_email": "contact@example.com",
    "contact_phone": "+1234567890",
    "att_person": "John Doe",
    "uni_login": true,
    "uni_login_ids": "id1,id2",
    "address_stuff": {
      "street": "123 Example St",
      "city": "Example City",
      "country": "US",
      "postal_code": "12345"
    }
  }'

Success response

{
  "status": true,
  "message": null,
  "id": 123
}

POST /{id}/partner/CreateCompany

Request Parameters

Parameter Type Description
edit integer The ID of the company to edit (optional).

Request Body

Parameter Type Description
name string The name of the company (required, max 128 characters).
uid string The unique identifier for the company (required, max 32 characters).
active integer Whether the company is active (required, 0 or 1).
trial_until date The trial end date in Y-m-d format (optional).
public_edu boolean Whether the company is a public educational institution (required).
extra_printers integer The number of extra printers (required, min 0).
extra_users integer The number of extra users (required, min 0).
extra_gb integer The amount of extra storage in GB (required, min 0).
active_plan integer The active plan ID (required, must be 4 or 5).
type integer The type of company (required, must be 0, 1, 2, or 3).
contact_email string The contact email for the company (required, valid email format).
contact_phone string The contact phone number (optional, max 32 characters).
att_person string The name of the contact person (required, max 128 characters).
uni_login boolean Whether UniLogin is enabled (optional).
uni_login_ids string Comma-separated UniLogin IDs (optional).
address_stuff array The address details (required).

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
id integer The ID of the created or updated company.

Delete company

curl -X POST https://api.simplyprint.io/{id}/partner/DeleteCompany?company=123 \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Success response

{
  "status": true,
  "message": null
}

POST /{id}/partner/DeleteCompany

Request Parameters

Parameter Type Description
company integer The ID of the company to delete.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
curl -X POST https://api.simplyprint.io/{id}/partner/move/ValidatePrinter \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "ids": [1, 2, 3],
    "search": "example",
    "not_in": [4, 5]
  }'

Success response

{
  "status": true,
  "message": null,
  "items": [
    {
      "id": 1,
      "name": "Printer 1",
      "sku": "SKU123",
      "org_id": 10,
      "image": "https://example.com/printer1.jpg"
    },
    {
      "id": 2,
      "name": "Printer 2",
      "sku": "SKU456",
      "org_id": 11,
      "image": "https://example.com/printer2.jpg"
    }
  ]
}

Searches for printers across all partner-companies. Useful for finding printers to move between companies.

POST /{id}/partner/move/ValidatePrinter

Request Body

Parameter Type Description
ids array List of printer IDs to search (optional).
ids.* integer Each printer ID must be an integer.
search string Search term to filter printers (optional, max 256 chars).
not_in array List of printer IDs to exclude (optional).
not_in.* integer Each printer ID to exclude must be an integer.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
items array List of validated printers.
items.*.id integer The ID of the printer.
items.*.name string The name of the printer.
items.*.sku string The SKU of the printer.
items.*.org_id integer The ID of the company owning the printer.
items.*.image string URL of the printer's image.

Move printer

curl -X POST https://api.simplyprint.io/{id}/partner/move/MovePrinter \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "moveTo": 123,
    "moveToGroup": 456,
    "ids": [1, 2, 3]
  }'

Success response

{
  "status": true,
  "message": null
}

Find printers to move with ValidatePrinter endpoint.

POST /{id}/partner/move/MovePrinter

Request Parameters

Parameter Type Description
moveTo integer The ID of the target company (required).
moveToGroup integer The ID of the target printer group (required).
ids array List of printer IDs to move (required).
ids.* integer Each printer ID must be an integer.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
curl -X POST https://api.simplyprint.io/{id}/partner/move/ValidateFilament \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "ids": [1, 2, 3],
    "search": "example filament",
    "not_in": [4, 5]
  }'

Success response

{
  "status": true,
  "message": null,
  "items": [
    {
      "id": 1,
      "uniq_id": "UNIQ123",
      "color_name": "Red",
      "color_hex": "#FF0000",
      "org_id": 10,
      "brand": "Example Brand",
      "type_id": 1,
      "type_name": "PLA"
    }
  ]
}

Searches for filaments across all partner-companies. Useful for finding filaments to move between companies.

POST /{id}/partner/move/ValidateFilament

Request Body

Parameter Type Description
ids array List of filament IDs to search (optional).
ids.* integer Each filament ID must be an integer.
search string Search term to filter filament (optional, max 256 chars).
not_in array List of filament IDs to exclude (optional).
not_in.* integer Each filament ID to exclude must be an integer.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.
items array List of validated filaments.
items.*.id integer The ID of the filament.
items.*.uniq_id string The unique ID of the filament.
items.*.color_name string The name of the filament color.
items.*.color_hex string The hex code of the filament color.
items.*.org_id integer The ID of the company owning the filament.
items.*.brand string The brand of the filament.
items.*.type_id integer The ID of the filament type.
items.*.type_name string The name of the filament type.

Move filament

curl -X POST https://api.simplyprint.io/{id}/partner/move/MoveFilament \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
    "moveTo": 123,
    "moveToFilamentType": 456,
    "filamentMoveTypeClean": false,
    "ids": [1, 2, 3]
  }'

Success response

{
  "status": true,
  "message": null
}

Find filament to move with ValidateFilament endpoint.

POST /{id}/partner/move/MoveFilament

Request Parameters

Parameter Type Description
moveTo integer The ID of the target company (required).
moveToFilamentType integer The ID of the target filament type (required).
filamentMoveTypeClean boolean Whether to only change the filament company, or also change the type (optional).
ids array List of printer IDs to move (required).
ids.* integer Each printer ID must be an integer.

Response

Parameter Type Description
status boolean true if the request was successful.
message string Error message if status is false.

Maintenance

Maintenance endpoints let you track maintenance jobs, schedules, templates, problems, inventory, and comments for printers in your account.

Dashboard: Get

Retrieve dashboard.

Required permissions
maintenance_view

GET /{id}/maintenance/dashboard/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/dashboard/Get \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "stats": {
    "in_maintenance": 10,
    "scheduled": 61,
    "overdue": 4,
    "open_problems": 1,
    "low_stock_count": 3,
    "out_of_stock_count": 2,
    "total_parts_count": 10,
    "total_templates": 27,
    "total_plans": 18,
    "total_jobs": 278
  },
  "next_due": null,
  "recent_jobs": [
    {
      "id": 492,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "in_progress",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T18:51:41+00:00",
      "completed_at": null,
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 0,
      "completed_tasks": 0,
      "total_tasks": 4,
      "required_tasks": 2,
      "completed_required_tasks": 0,
      "assignees": [],
      "problems": [
        {
          "id": 66,
          "status": "resolved",
          "description": null,
          "problem_type": null,
          "printer_id": 385,
          "reported_by": {
            "id": 1234,
            "name": "John Doe"
          },
          "created_at": "2026-04-14T18:43:57+00:00"
        }
      ],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T18:51:40+00:00"
    },
    {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00"
    }
  ],
  "printer_status": [
    {
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "model": "A1 Mini Swapmod Combo",
      "model_brand": "Bambu Lab",
      "model_image": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini_swapmod_combo/product_photo_md.png",
      "group": {
        "id": 99,
        "name": "Workshop A"
      },
      "in_maintenance": true,
      "out_of_order": false,
      "open_problems": 0,
      "jobs": [
        {
          "id": 406,
          "title": "Scheduled maintenance - Workshop Printer",
          "status": "scheduled",
          "priority": "normal",
          "scheduled_date": null,
          "started_at": null,
          "batch_id": "c8716339-75e5-472b-9578-764454a69eb8",
          "is_overdue": false,
          "total_tasks": 0,
          "completed_tasks": 0,
          "progress": 0
        },
        {
          "id": 468,
          "title": "Scheduled maintenance - Workshop Printer",
          "status": "scheduled",
          "priority": "normal",
          "scheduled_date": null,
          "started_at": null,
          "batch_id": "4b1554e6-4bb4-44f1-a393-d258db74b294",
          "is_overdue": false,
          "total_tasks": 0,
          "completed_tasks": 0,
          "progress": 0
        }
      ]
    },
    {
      "printer_id": 48013,
      "printer_name": "Anycubic Kobra S1",
      "model": "Kobra S1",
      "model_brand": "Anycubic",
      "model_image": "https://cdn.simplyprint.io/i/printer_types/anycubic/kobra_s1/product_photo_md.png",
      "group": {
        "id": 99,
        "name": "Printers"
      },
      "in_maintenance": false,
      "out_of_order": false,
      "open_problems": 0,
      "jobs": [
        {
          "id": 298,
          "title": "Scheduled maintenance - Anycubic Kobra S1",
          "status": "scheduled",
          "priority": "urgent",
          "scheduled_date": null,
          "started_at": null,
          "batch_id": "4a4f36fb-67da-4e59-a3a8-ea30b76e54d3",
          "is_overdue": false,
          "total_tasks": 14,
          "completed_tasks": 3,
          "progress": 21
        },
        {
          "id": 359,
          "title": "Scheduled maintenance - Anycubic Kobra S1",
          "status": "scheduled",
          "priority": "urgent",
          "scheduled_date": null,
          "started_at": null,
          "batch_id": "eaf0274f-afc6-467b-a9ac-279691a7d90d",
          "is_overdue": false,
          "total_tasks": 14,
          "completed_tasks": 0,
          "progress": 0
        }
      ]
    }
  ],
  "low_stock_parts": [
    {
      "id": 152,
      "name": "Nozzle 0.4mm (brass)",
      "description": "Standard 0.4mm brass nozzle. Most common size for general-purpose printing.",
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": 2,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": "Nozzle",
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": true,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-03-31T12:50:42+00:00"
    },
    {
      "id": 156,
      "name": "Routine maintenance",
      "description": null,
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": 3,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": "replacement",
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": true,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-04-01T10:50:35+00:00"
    }
  ],
  "active_plans": [
    {
      "id": 96,
      "name": "Routine maintenance",
      "description": null,
      "enabled": true,
      "trigger_type": "interval_days",
      "trigger_value": 14,
      "trigger_config": {
        "mode": null,
        "template_ids": null,
        "cancel_reason_type": null
      },
      "task_assignment_mode": "manual",
      "auto_task_template_ids": null,
      "min_usage_threshold": null,
      "advance_notice_days": 7,
      "snooze_days": 7,
      "stagger_max_concurrent": null,
      "stagger_period": null,
      "auto_assign_user_ids": null,
      "job_title_template": null,
      "job_priority": "normal",
      "scope_type": "company",
      "scope_ids": null,
      "task_template_ids": [],
      "last_evaluated_at": null,
      "created_at": "2026-04-09T19:09:57+00:00",
      "active_job_count": 0
    },
    {
      "id": 107,
      "name": "Routine maintenance",
      "description": null,
      "enabled": true,
      "trigger_type": "interval_days",
      "trigger_value": 30,
      "trigger_config": {
        "mode": null,
        "template_ids": null,
        "cancel_reason_type": null
      },
      "task_assignment_mode": "manual",
      "auto_task_template_ids": null,
      "min_usage_threshold": null,
      "advance_notice_days": 7,
      "snooze_days": 7,
      "stagger_max_concurrent": null,
      "stagger_period": null,
      "auto_assign_user_ids": null,
      "job_title_template": null,
      "job_priority": "normal",
      "scope_type": "company",
      "scope_ids": null,
      "task_template_ids": [],
      "last_evaluated_at": null,
      "created_at": "2026-04-09T19:15:24+00:00",
      "active_job_count": 0
    }
  ]
}

Dashboard: Calendar

Retrieve the calendar view for dashboard.

Required permissions
maintenance_view

POST /{id}/maintenance/dashboard/Calendar

Example request

curl https://api.simplyprint.io/{id}/maintenance/dashboard/Calendar \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "start": "string",
      "end": "string"
    }'

Example response

{
  "status": true,
  "message": null,
  "events": [
    {
      "id": 491,
      "title": "Nozzle replacement",
      "start": "2026-04-14T15:23:19+00:00",
      "end": "2026-04-14T15:38:46+00:00",
      "color": "#0F9D58",
      "extendedProps": {
        "status": "completed",
        "priority": "normal",
        "printer_name": "Workshop Printer",
        "printer_id": 385,
        "progress": 100
      }
    },
    {
      "id": 492,
      "title": "Routine maintenance",
      "start": "2026-04-14T18:51:41+00:00",
      "end": null,
      "color": "#F4B400",
      "extendedProps": {
        "status": "in_progress",
        "priority": "normal",
        "printer_name": "Workshop Printer",
        "printer_id": 385,
        "progress": 0
      }
    },
    {
      "id": 232,
      "title": "Monthly maintenance - Workshop Printer",
      "start": "2026-04-11T19:08:55+00:00",
      "end": null,
      "color": "#DB4437",
      "extendedProps": {
        "status": "overdue",
        "priority": "low",
        "printer_name": "Workshop Printer",
        "printer_id": 385,
        "progress": 0
      }
    }
  ]
}

Request

Parameter Type Required Description
start string yes -
end string yes -

Jobs: Get

Retrieve job.

Required permissions
maintenance_view

POST /{id}/maintenance/jobs/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "total": 12,
  "page": 1,
  "page_size": 25,
  "page_amount": 1,
  "page_count": 1,
  "data": [
    {
      "id": 492,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Routine maintenance",
      "description": null,
      "status": "in_progress",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T18:51:41+00:00",
      "completed_at": null,
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 0,
      "completed_tasks": 0,
      "total_tasks": 4,
      "required_tasks": 2,
      "completed_required_tasks": 0,
      "assignees": [],
      "problems": [
        {
          "id": 66,
          "status": "resolved",
          "description": null,
          "problem_type": null,
          "printer_id": 385,
          "reported_by": {
            "id": 1234,
            "name": "John Doe"
          },
          "created_at": "2026-04-14T18:43:57+00:00"
        }
      ],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T18:51:40+00:00",
      "printer_group": {
        "id": 99,
        "name": "Workshop A"
      },
      "printer_model_image": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini_swapmod_combo/product_photo_md.png",
      "printer_model_brand": "Bambu Lab"
    },
    {
      "id": 491,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "title": "Nozzle replacement",
      "description": null,
      "status": "completed",
      "priority": "normal",
      "scheduled_date": null,
      "started_at": "2026-04-14T15:23:19+00:00",
      "completed_at": "2026-04-14T15:38:46+00:00",
      "cancelled_at": null,
      "completion_summary": null,
      "auto_created": false,
      "scheduled_date_manually_set": false,
      "progress": 100,
      "completed_tasks": 2,
      "total_tasks": 2,
      "required_tasks": 2,
      "completed_required_tasks": 2,
      "assignees": [],
      "problems": [],
      "batch_id": null,
      "task_assignment_enabled": true,
      "custom_field_values": [],
      "created_at": "2026-04-14T15:23:19+00:00",
      "printer_group": {
        "id": 99,
        "name": "Workshop A"
      },
      "printer_model_image": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini_swapmod_combo/product_photo_md.png",
      "printer_model_brand": "Bambu Lab"
    }
  ],
  "batch_summary": [
    {
      "batch_id": "23e499bd-5f40-4967-a8aa-5bf4e4583e6b",
      "title": "Routine maintenance",
      "priority": "normal",
      "job_count": 4,
      "status_counts": {
        "completed": 2,
        "in_progress": 2
      }
    }
  ]
}

Request

Parameter Type Required Description
printer_id integer no -
printer_ids string no max 1000 characters
status string no -
search string no max 255 characters
page integer no min 1
page_size integer no between 1 and 100
sort_id string no One of: created_at, scheduled_date, status, priority, printer, title
sort_dir string no One of: asc, desc

Jobs: Get one

Retrieve a single job.

Required permissions
maintenance_view

POST /{id}/maintenance/jobs/GetOne

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/GetOne \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null,
  "data": {
    "id": 491,
    "printer_id": 385,
    "printer_name": "Workshop Printer",
    "schedule_id": null,
    "created_by": {
      "id": 1234,
      "name": "John Doe"
    },
    "title": "Nozzle replacement",
    "description": null,
    "status": "completed",
    "priority": "normal",
    "scheduled_date": null,
    "started_at": "2026-04-14T15:23:19+00:00",
    "completed_at": "2026-04-14T15:38:46+00:00",
    "cancelled_at": null,
    "completion_summary": null,
    "progress": 100,
    "completed_tasks": 2,
    "total_tasks": 2,
    "required_tasks": 2,
    "completed_required_tasks": 2,
    "assignees": [],
    "problems": [],
    "batch_id": null,
    "task_assignment_enabled": true,
    "custom_field_values": [],
    "created_at": "2026-04-14T15:23:19+00:00",
    "tasks": [
      {
        "id": 2128,
        "template_id": 240,
        "name": "Inspect nozzle",
        "description": "Check the nozzle for wear, clogs, or damage.",
        "is_required": true,
        "is_completed": true,
        "completed_at": "2026-04-14T15:38:44+00:00",
        "completed_by": {
          "id": 1234,
          "name": "John Doe"
        },
        "skipped_at": null,
        "skipped_by": null,
        "spare_part": null,
        "spare_part_quantity": 1,
        "instructions": "1. Heat the nozzle to printing temperature.\n2. Visually inspect the nozzle tip for deformation or buildup.\n3. Push filament through manually to check for partial clogs.\n4. If clogged, perform a cold pull or replace the nozzle.\n5. Check for any leaking around the heat block.",
        "reference_url": null,
        "youtube_url": null,
        "course_id": null,
        "course_url": null,
        "spare_part_category": null,
        "tool": null,
        "sort_order": 2,
        "assigned_to": null,
        "notes": null,
        "custom_field_values": []
      }
    ],
    "printer_info": {
      "id": 385,
      "name": "Workshop Printer",
      "group": {
        "id": 99,
        "name": "Workshop A"
      },
      "model": {
        "id": 573,
        "name": "A1 Mini",
        "brand": "Bambu Lab",
        "images": {
          "md": {
            "silhouette": null,
            "product": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini/product_photo_md.png",
            "custom": null
          }
        }
      },
      "stats": {
        "total_runtime_seconds": 44161,
        "runtime_since_maintenance_seconds": 0,
        "print_count": 41,
        "completed_print_count": 26,
        "prints_since_maintenance": 0,
        "success_rate": 63.4,
        "maintenance_count": 13,
        "last_maintenance_at": "2026-04-14T18:09:40+00:00"
      }
    },
    "loose_problems": []
  }
}

Request

Parameter Type Required Description
id integer yes -

Jobs: Get batch

Retrieve multiple job in one call.

Required permissions
maintenance_view

POST /{id}/maintenance/jobs/GetBatch

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/GetBatch \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "batch_id": "string"
    }'

Example response

{
  "status": true,
  "message": null,
  "data": {
    "shared": {
      "batch_id": "23e499bd-5f40-4967-a8aa-5bf4e4583e6b",
      "title": "Routine maintenance",
      "description": null,
      "priority": "normal",
      "scheduled_date": null,
      "auto_created": false,
      "schedule_id": null,
      "created_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "created_at": "2026-03-31T13:17:48+00:00",
      "assignees": []
    },
    "jobs": [
      {
        "id": 208,
        "printer_id": 385,
        "printer_name": "Workshop Printer",
        "schedule_id": null,
        "created_by": {
          "id": 1234,
          "name": "John Doe"
        },
        "title": "Routine maintenance",
        "description": null,
        "status": "completed",
        "priority": "normal",
        "scheduled_date": null,
        "started_at": "2026-03-31T13:17:51+00:00",
        "completed_at": "2026-04-07T13:02:54+00:00",
        "cancelled_at": null,
        "completion_summary": null,
        "auto_created": false,
        "scheduled_date_manually_set": false,
        "progress": 100,
        "completed_tasks": 13,
        "total_tasks": 13,
        "required_tasks": 8,
        "completed_required_tasks": 8,
        "assignees": [],
        "problems": [],
        "batch_id": "23e499bd-5f40-4967-a8aa-5bf4e4583e6b",
        "task_assignment_enabled": true,
        "custom_field_values": [],
        "created_at": "2026-03-31T13:17:48+00:00",
        "tasks": [
          {
            "id": 229,
            "template_id": 244,
            "name": "Calibrate bed leveling",
            "description": "Ensure the print bed is properly leveled and Z offset is correct.",
            "is_required": true,
            "is_completed": true,
            "completed_at": "2026-03-31T14:44:12+00:00",
            "completed_by": {
              "id": 1234,
              "name": "John Doe"
            },
            "skipped_at": null,
            "skipped_by": null,
            "spare_part": null,
            "spare_part_quantity": 0,
            "gcode_snippet_ids": null,
            "gcode_snippets": null,
            "instructions": "1. Preheat the bed to normal printing temperature.\n2. Run the printer's automatic bed leveling procedure if available.\n3. For manual leveling, use a piece of paper at each corner and the center.\n4. Adjust until there is slight resistance on the paper at all points.\n5. Print a test first layer to verify calibration.",
            "reference_url": null,
            "youtube_url": null,
            "course_id": null,
            "course_url": null,
            "spare_part_category": null,
            "tool": null,
            "sort_order": 6,
            "assigned_to": null,
            "notes": null,
            "custom_field_values": []
          },
          {
            "id": 230,
            "template_id": 241,
            "name": "Check belt tension",
            "description": "Verify that X and Y axis belts have proper tension.",
            "is_required": true,
            "is_completed": true,
            "completed_at": "2026-03-31T14:43:44+00:00",
            "completed_by": {
              "id": 1234,
              "name": "John Doe"
            },
            "skipped_at": null,
            "skipped_by": null,
            "spare_part": null,
            "spare_part_quantity": 0,
            "gcode_snippet_ids": null,
            "gcode_snippets": null,
            "instructions": "1. Power off the printer.\n2. Gently pluck each belt - it should vibrate like a guitar string, not sag.\n3. Check for fraying, cracking, or wear on the belt surface.\n4. Adjust tensioners if the belt is too loose or too tight.\n5. Verify smooth axis movement after adjustment.",
            "reference_url": null,
            "youtube_url": null,
            "course_id": null,
            "course_url": null,
            "spare_part_category": null,
            "tool": null,
            "sort_order": 3,
            "assigned_to": null,
            "notes": null,
            "custom_field_values": []
          }
        ],
        "printer_info": {
          "id": 385,
          "name": "Workshop Printer",
          "group": {
            "id": 99,
            "name": "Workshop A"
          },
          "model": {
            "id": 573,
            "name": "A1 Mini Swapmod Combo",
            "brand": "Bambu Lab",
            "images": {
              "md": {
                "silhouette": null,
                "product": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini_swapmod_combo/product_photo_md.png",
                "custom": null
              }
            }
          },
          "stats": {
            "total_runtime_seconds": 44161,
            "print_count": 41,
            "last_maintenance_at": "2026-04-14T18:09:40+00:00"
          }
        }
      },
      {
        "id": 210,
        "printer_id": 24342,
        "printer_name": "Bambu Lab P1P 2",
        "schedule_id": null,
        "created_by": {
          "id": 1234,
          "name": "John Doe"
        },
        "title": "Routine maintenance",
        "description": null,
        "status": "completed",
        "priority": "normal",
        "scheduled_date": null,
        "started_at": "2026-03-31T13:17:48+00:00",
        "completed_at": "2026-04-12T17:55:48+00:00",
        "cancelled_at": null,
        "completion_summary": null,
        "auto_created": false,
        "scheduled_date_manually_set": false,
        "progress": 100,
        "completed_tasks": 13,
        "total_tasks": 13,
        "required_tasks": 8,
        "completed_required_tasks": 8,
        "assignees": [],
        "problems": [],
        "batch_id": "23e499bd-5f40-4967-a8aa-5bf4e4583e6b",
        "task_assignment_enabled": true,
        "custom_field_values": [],
        "created_at": "2026-03-31T13:17:48+00:00",
        "tasks": [
          {
            "id": 255,
            "template_id": 244,
            "name": "Calibrate bed leveling",
            "description": "Ensure the print bed is properly leveled and Z offset is correct.",
            "is_required": true,
            "is_completed": true,
            "completed_at": "2026-03-31T14:44:12+00:00",
            "completed_by": {
              "id": 1234,
              "name": "John Doe"
            },
            "skipped_at": null,
            "skipped_by": null,
            "spare_part": null,
            "spare_part_quantity": 0,
            "gcode_snippet_ids": null,
            "gcode_snippets": null,
            "instructions": "1. Preheat the bed to normal printing temperature.\n2. Run the printer's automatic bed leveling procedure if available.\n3. For manual leveling, use a piece of paper at each corner and the center.\n4. Adjust until there is slight resistance on the paper at all points.\n5. Print a test first layer to verify calibration.",
            "reference_url": null,
            "youtube_url": null,
            "course_id": null,
            "course_url": null,
            "spare_part_category": null,
            "tool": null,
            "sort_order": 6,
            "assigned_to": null,
            "notes": null,
            "custom_field_values": []
          },
          {
            "id": 256,
            "template_id": 241,
            "name": "Check belt tension",
            "description": "Verify that X and Y axis belts have proper tension.",
            "is_required": true,
            "is_completed": true,
            "completed_at": "2026-03-31T14:43:44+00:00",
            "completed_by": {
              "id": 1234,
              "name": "John Doe"
            },
            "skipped_at": null,
            "skipped_by": null,
            "spare_part": null,
            "spare_part_quantity": 0,
            "gcode_snippet_ids": null,
            "gcode_snippets": null,
            "instructions": "1. Power off the printer.\n2. Gently pluck each belt - it should vibrate like a guitar string, not sag.\n3. Check for fraying, cracking, or wear on the belt surface.\n4. Adjust tensioners if the belt is too loose or too tight.\n5. Verify smooth axis movement after adjustment.",
            "reference_url": null,
            "youtube_url": null,
            "course_id": null,
            "course_url": null,
            "spare_part_category": null,
            "tool": null,
            "sort_order": 3,
            "assigned_to": null,
            "notes": null,
            "custom_field_values": []
          }
        ],
        "printer_info": {
          "id": 24342,
          "name": "Bambu Lab P1P 2",
          "group": {
            "id": 99,
            "name": "Workshop A"
          },
          "model": {
            "id": 658,
            "name": "P2S FarmLoop Combo",
            "brand": "Bambu Lab",
            "images": {
              "md": {
                "silhouette": null,
                "product": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/p2s_farmloop_combo/product_photo_md.png",
                "custom": null
              }
            }
          },
          "stats": {
            "total_runtime_seconds": 78376,
            "print_count": 47,
            "last_maintenance_at": "2026-04-12T17:55:48+00:00"
          }
        }
      }
    ],
    "template_tasks": [
      {
        "template_id": 250,
        "name": "Cleaning nozzle",
        "description": "Clean the darned nozzle",
        "is_required": true,
        "instructions": null,
        "reference_url": null,
        "youtube_url": null,
        "spare_part": null,
        "spare_part_quantity": 1,
        "spare_part_category": null,
        "gcode_snippet_ids": null,
        "tool": null,
        "sort_order": 0,
        "completions": [
          {
            "job_id": 208,
            "task_id": 235,
            "printer_id": 385,
            "printer_name": "Workshop Printer",
            "is_completed": true,
            "completed_at": "2026-04-01T13:13:04+00:00",
            "spare_part": {
              "id": 152,
              "name": "Nozzle 0.4mm (brass)"
            }
          },
          {
            "job_id": 210,
            "task_id": 261,
            "printer_id": 24342,
            "printer_name": "Bambu Lab P1P 2",
            "is_completed": false,
            "completed_at": null,
            "spare_part": null
          }
        ]
      },
      {
        "template_id": 249,
        "name": "Something whatever",
        "description": null,
        "is_required": true,
        "instructions": "<p>jhagjwagawg</p><p><br></p><p><strong><em><u>gagwa</u></em></strong></p>",
        "reference_url": null,
        "youtube_url": null,
        "spare_part": null,
        "spare_part_quantity": 1,
        "spare_part_category": null,
        "gcode_snippet_ids": [
          28,
          513
        ],
        "tool": "change_filament",
        "sort_order": 0,
        "completions": [
          {
            "job_id": 208,
            "task_id": 239,
            "printer_id": 385,
            "printer_name": "Workshop Printer",
            "is_completed": true,
            "completed_at": "2026-03-31T15:11:37+00:00",
            "spare_part": {
              "id": 152,
              "name": "Nozzle 0.4mm (brass)"
            }
          },
          {
            "job_id": 210,
            "task_id": 265,
            "printer_id": 24342,
            "printer_name": "Bambu Lab P1P 2",
            "is_completed": false,
            "completed_at": null,
            "spare_part": null
          }
        ]
      }
    ],
    "problems": [],
    "summary": {
      "job_count": 4,
      "status_counts": {
        "completed": 2,
        "in_progress": 2
      },
      "total_tasks": 52,
      "completed_tasks": 48,
      "progress": 92
    }
  }
}

Request

Parameter Type Required Description
batch_id string yes max 36 characters

Jobs: Export

Export job as a downloadable file.

Required permissions
maintenance_view

POST /{id}/maintenance/jobs/Export

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Export \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "csv": "\"ID\",\"Printer\",\"Title\",\"Status\",\"Priority\",\"Scheduled date\",\"Started at\",\"Completed at\",\"Tasks completed\",\"Tasks total\",\"Assignees\",\"Created by\"\n\"491\",\"Workshop Printer\",\"Nozzle replacement\",\"completed\",\"normal\",\"\",\"2026-04-14 15:23:19\",\"2026-04-14 15:38:46\",\"2\",\"2\",\"\",\"John Doe\"\n\"487\",\"Workshop Printer\",\"Nozzle replacement\",\"completed\",\"normal\",\"\",\"2026-04-13 12:25:51\",\"2026-04-13 12:32:43\",\"1\",\"1\",\"\",\"John Doe\"\n\"485\",\"Workshop Printer\",\"Routine maintenance\",\"cancelled\",\"normal\",\"\",\"2026-04-12 18:12:23\",\"\",\"0\",\"0\",\"\",\"John Doe\"\n\"344\",\"Workshop Printer\",\"Scheduled maintenance - Workshop Printer\",\"completed\",\"urgent\",\"\",\"2026-04-14 18:08:55\",\"2026-04-14 18:09:40\",\"9\",\"13\",\"\",\"John Doe\"\n",
  "filename": "maintenance-jobs-2026-04-19.csv",
  "total": 278
}

Request

Parameter Type Required Description
status string no -
date_from string no -
date_to string no -

Jobs: Create

Create a new job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Create

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "title": "string"
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
printer_id integer no -
printer_ids array no -
title string yes min 1; max 255 characters
description string no max 5000 characters
priority string no -
scheduled_date string no -
template_ids array no -
assignee_ids array no -
problem_ids array no -
task_assignments array no -
custom_fields array no -

Jobs: Create from problem

Create a new job from an existing problem.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/CreateFromProblem

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/CreateFromProblem \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "problem_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
problem_id integer yes -
title string no min 1; max 255 characters
priority string no -

Jobs: Add tasks

Add tasks to a job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/AddTasks

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/AddTasks \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1,
      "template_ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
template_ids array yes min 1

Jobs: Update

Update top-level fields on an existing maintenance job. Title, description, priority, and scheduled date can all be edited while the job is still in scheduled or in_progress. Tasks on the job are managed via the separate Add tasks / Complete task / Skip task endpoints; this endpoint does not modify the task list.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Update

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Update \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
title string no min 1; max 255 characters
description string no max 5000 characters
priority string no -
scheduled_date string no -
assignee_ids array no -
custom_fields array no -

Jobs: Assign task

Assign a user to a single task on an in-progress maintenance job, or clear the existing assignment by passing user_id: null. The task assignment feature must be enabled in the account settings, otherwise this returns a Failed response. By default, sends a notification to the newly-assigned user; set notify: false to suppress that. Returns the updated task object.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/AssignTask

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/AssignTask \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "task_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
task_id integer yes ID of the maintenance job task to (re-)assign.
user_id integer no ID of the user to assign. Pass null to clear the current assignment without assigning anyone else.
notify boolean no If true (default), notify the newly-assigned user. Pass false to skip the notification (useful when bulk-assigning).

Link problems to a job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/LinkProblems

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/LinkProblems \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1,
      "problem_ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
problem_ids array yes min 1

Jobs: Start

Start a job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Start

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Start \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -

Jobs: Bulk start

Start multiple job at once.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/BulkStart

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/BulkStart \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "job_ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
job_ids array yes min 1; max 100

Jobs: Complete

Mark a job as complete.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Complete

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Complete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
completion_summary string no max 5000 characters
resolve_problem_ids array no -
skip_resolve_linked boolean no -

Jobs: Bulk complete

Mark multiple job as complete.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/BulkComplete

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/BulkComplete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "job_ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
job_ids array yes min 1; max 100
completion_summary string no max 5000 characters

Jobs: Complete task

Mark a task as complete on a job.

Required permissions
maintenance_complete

POST /{id}/maintenance/jobs/CompleteTask

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/CompleteTask \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "task_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
task_id integer yes -
selected_spare_part_id integer no -
skip_spare_part boolean no -
custom_fields array no -

Jobs: Bulk complete task

Mark multiple tasks as complete on a job.

Required permissions
maintenance_complete

POST /{id}/maintenance/jobs/BulkCompleteTask

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/BulkCompleteTask \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "job_ids": [],
      "template_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
job_ids array yes min 1; max 100
template_id integer yes -
selected_spare_part_id integer no -

Jobs: Uncomplete task

Mark a previously-completed task as not complete on a job.

Required permissions
maintenance_complete

POST /{id}/maintenance/jobs/UncompleteTask

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/UncompleteTask \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "task_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
task_id integer yes -

Jobs: Skip task

Skip a task on a job.

Required permissions
maintenance_complete

POST /{id}/maintenance/jobs/SkipTask

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/SkipTask \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "task_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
task_id integer yes -

Jobs: Unskip task

Mark a previously-skipped task as not skipped on a job.

Required permissions
maintenance_complete

POST /{id}/maintenance/jobs/UnskipTask

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/UnskipTask \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "task_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
task_id integer yes -

Jobs: Send task gcode

Send the gcode associated with a task on a job.

Required permissions
maintenance_complete

POST /{id}/maintenance/jobs/SendTaskGcode

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/SendTaskGcode \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "task_id": 1,
      "snippet_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
task_id integer yes -
snippet_id integer yes -

Jobs: Cancel

Cancel a job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Cancel

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Cancel \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -

Jobs: Reopen

Reopen a previously closed job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Reopen

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Reopen \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -

Jobs: Delete

Delete a job.

Required permissions
maintenance_manage

POST /{id}/maintenance/jobs/Delete

Example request

curl https://api.simplyprint.io/{id}/maintenance/jobs/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
ids array yes -

Comments can be attached to either a maintenance job or a printer. File attachments are supported via separate uploads referenced by file_ids.

Comments: Get

Retrieve comment.

Required permissions
maintenance_view

POST /{id}/maintenance/comments/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/comments/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "commentable_type": "maintenance_job",
      "commentable_id": 1
    }'

Example response

{
  "status": true,
  "message": null,
  "comments": [
    {
      "id": 12,
      "commentable_type": "maintenance_job",
      "commentable_id": 491,
      "text": "Nozzle replaced with 0.4mm brass.",
      "user": {
        "id": 1234,
        "name": "John Doe"
      },
      "files": [],
      "created_at": "2026-04-14T15:38:50+00:00",
      "updated_at": null
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 50,
    "total": 1,
    "total_pages": 1
  }
}

Request

Parameter Type Required Description
commentable_type string yes One of: maintenance_job, printer
commentable_id integer yes -
page integer no min 1
per_page integer no min 1; max 100

Comments: Add

Add a comment.

Required permissions
maintenance_view

POST /{id}/maintenance/comments/Add

Example request

curl https://api.simplyprint.io/{id}/maintenance/comments/Add \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "commentable_type": "maintenance_job",
      "commentable_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
commentable_type string yes One of: maintenance_job, printer
commentable_id integer yes -
text string no max 5000 characters
file_ids array no -

Comments: Update

Update an existing comment.

Required permissions
maintenance_view

POST /{id}/maintenance/comments/Update

Example request

curl https://api.simplyprint.io/{id}/maintenance/comments/Update \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1,
      "text": "string"
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
text string yes max 5000 characters

Comments: Delete

Delete a comment.

Required permissions
maintenance_view

POST /{id}/maintenance/comments/Delete

Example request

curl https://api.simplyprint.io/{id}/maintenance/comments/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -

Tasks are the individual steps that make up a maintenance job (clean nozzle, lubricate rails, calibrate bed, etc.). They are stored as reusable task templates on the account, and copied into a job when the job is created. Editing a template does not affect tasks already on existing jobs.

Tasks: Get

Retrieve task.

Required permissions
maintenance_view

POST /{id}/maintenance/templates/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "total": 27,
  "page": 1,
  "page_size": 100,
  "page_amount": 1,
  "page_count": 1,
  "data": [
    {
      "id": 244,
      "name": "Calibrate bed leveling",
      "description": "Ensure the print bed is properly leveled and Z offset is correct.",
      "category": "calibration",
      "brands": null,
      "is_required": true,
      "system_default_key": "generic_calibrate_bed",
      "trigger_type": "time_interval",
      "trigger_config": {
        "interval_days": 30
      },
      "spare_part": null,
      "spare_part_quantity": 1,
      "spare_part_category": null,
      "estimated_minutes": 15,
      "instructions": "1. Preheat the bed to normal printing temperature.\n2. Run the printer's automatic bed leveling procedure if available.\n3. For manual leveling, use a piece of paper at each corner and the center.\n4. Adjust until there is slight resistance on the paper at all points.\n5. Print a test first layer to verify calibration.",
      "reference_url": null,
      "youtube_url": null,
      "course_id": null,
      "tool": null,
      "responsible_user_ids": null,
      "sort_order": 6,
      "printer_model_ids": [],
      "printer_ids": [],
      "gcode_snippet_ids": [],
      "created_at": "2026-03-31T12:50:16+00:00"
    },
    {
      "id": 240,
      "name": "Inspect nozzle",
      "description": "Check the nozzle for wear, clogs, or damage.",
      "category": "inspection",
      "brands": null,
      "is_required": true,
      "system_default_key": "generic_inspect_nozzle",
      "trigger_type": "usage_based",
      "trigger_config": {
        "print_hours": 200
      },
      "spare_part": null,
      "spare_part_quantity": 1,
      "spare_part_category": null,
      "estimated_minutes": 15,
      "instructions": "1. Heat the nozzle to printing temperature.\n2. Visually inspect the nozzle tip for deformation or buildup.\n3. Push filament through manually to check for partial clogs.\n4. If clogged, perform a cold pull or replace the nozzle.\n5. Check for any leaking around the heat block.",
      "reference_url": null,
      "youtube_url": null,
      "course_id": null,
      "tool": null,
      "responsible_user_ids": null,
      "sort_order": 2,
      "printer_model_ids": [],
      "printer_ids": [],
      "gcode_snippet_ids": [],
      "created_at": "2026-03-31T12:50:16+00:00"
    }
  ]
}

Request

Parameter Type Required Description
category string no -
search string no max 255 characters
page integer no min 1
page_size integer no between 1 and 100
sort_id string no One of: name, category, trigger_type, estimated_minutes, created_at, sort_order
sort_dir string no One of: asc, desc

Tasks: Get defaults

Retrieve the default task.

Required permissions
maintenance_manage

GET /{id}/maintenance/templates/GetDefaults

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/GetDefaults \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null
}

Retrieve recommended task.

Required permissions
maintenance_view

POST /{id}/maintenance/templates/GetRecommended

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/GetRecommended \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "printer_id": 1
    }'

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 273,
      "name": "Clean heater block exterior",
      "description": "Remove plastic buildup from the nozzle and heater block using a brass brush while heated.",
      "category": "cleaning",
      "brands": null,
      "is_required": false,
      "system_default_key": "generic_clean_heater_block",
      "trigger_type": "time_interval",
      "trigger_config": {
        "interval_days": 7
      },
      "spare_part": null,
      "spare_part_quantity": 1,
      "spare_part_category": null,
      "estimated_minutes": 5,
      "instructions": "1. Heat the nozzle to printing temperature.\n2. Use a small brass brush to clear old plastic.\n3. Wait for cooldown before touching.",
      "reference_url": null,
      "youtube_url": null,
      "course_id": null,
      "tool": null,
      "responsible_user_ids": null,
      "sort_order": 12,
      "printer_model_ids": [],
      "printer_ids": [],
      "gcode_snippet_ids": [],
      "created_at": "2026-04-09T15:51:08+00:00",
      "is_recommended": true,
      "is_due": true,
      "due_reason": "7 days since last (every 7 days)"
    },
    {
      "id": 244,
      "name": "Calibrate bed leveling",
      "description": "Ensure the print bed is properly leveled and Z offset is correct.",
      "category": "calibration",
      "brands": null,
      "is_required": true,
      "system_default_key": "generic_calibrate_bed",
      "trigger_type": "time_interval",
      "trigger_config": {
        "interval_days": 30
      },
      "spare_part": null,
      "spare_part_quantity": 1,
      "spare_part_category": null,
      "estimated_minutes": 15,
      "instructions": "1. Preheat the bed to normal printing temperature.\n2. Run the printer's automatic bed leveling procedure if available.",
      "reference_url": null,
      "youtube_url": null,
      "course_id": null,
      "tool": null,
      "responsible_user_ids": null,
      "sort_order": 6,
      "printer_model_ids": [],
      "printer_ids": [],
      "gcode_snippet_ids": [],
      "created_at": "2026-03-31T12:50:16+00:00",
      "is_recommended": false,
      "is_due": false,
      "due_reason": null
    }
  ]
}

Request

Parameter Type Required Description
printer_id integer yes -
exclude_template_ids array no -

Tasks: Get cancel reasons

Retrieve the available cancel reasons for task.

Required permissions
maintenance_view

GET /{id}/maintenance/templates/GetCancelReasons

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/GetCancelReasons \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 1,
      "label": "Print failed"
    },
    {
      "id": 7,
      "label": "Poor quality"
    },
    {
      "id": 3,
      "label": "No filament extruded / nozzle clog"
    },
    {
      "id": 8,
      "label": "Spaghetti print"
    },
    {
      "id": 4,
      "label": "Fell off the plate"
    },
    {
      "id": 5,
      "label": "Not enough filament"
    },
    {
      "id": 6,
      "label": "Other"
    }
  ]
}

Tasks: Get notification triggers

Retrieve the available notification triggers for task.

Required permissions
maintenance_view

POST /{id}/maintenance/templates/GetNotificationTriggers

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/GetNotificationTriggers \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "data": {
    "Bambu": {
      "LUBRICATE_RODS": {
        "category": "lubrication",
        "title": "Lubricate rods",
        "description": "Lubricate threaded rods and linear rails",
        "template_keys": [
          "bambu_grease_z_screws",
          "generic_lubricate_rails"
        ],
        "hms_patterns": [
          "0501040000030002"
        ],
        "error_codes": []
      },
      "CLEAN_NOZZLE": {
        "category": "cleaning",
        "title": "Clean/unclog nozzle",
        "description": "Nozzle or extruder clog detected - clean or perform cold pull",
        "template_keys": [
          "bambu_cold_pull",
          "generic_inspect_nozzle"
        ],
        "hms_patterns": [
          "03001A0000020001"
        ],
        "error_codes": [
          "03004006",
          "03008014"
        ]
      },
      "BED_LEVELING": {
        "category": "calibration",
        "title": "Bed leveling",
        "description": "Heatbed leveling data is abnormal or leveling failed",
        "template_keys": [
          "generic_calibrate_bed"
        ],
        "hms_patterns": [
          "03000D000001000C"
        ],
        "error_codes": [
          "03004002"
        ]
      }
    }
  }
}

Request

Parameter Type Required Description
printer_api string no -
code string no max 16 characters

Tasks: Create

Create a new task template -- a reusable definition of a single maintenance step (clean nozzle, lubricate rails, etc.). Templates are not maintenance jobs themselves; they are copied into a job when the job is created or when Add tasks is called. Templates can target specific printer models or printer IDs, declare a spare_part they consume, link to a course/video, and ship gcode snippets to run.

Required permissions
maintenance_manage

POST /{id}/maintenance/templates/Create

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "name": "string"
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
name string yes min 1; max 255 characters
description string no max 5000 characters
category string no -
brands array no -
is_required boolean no -
trigger_type string no -
trigger_config array no -
spare_part_id integer no -
spare_part_quantity integer no min 1
estimated_minutes integer no min 1
instructions string no max 10000 characters
reference_url string no max 512 characters
youtube_url string no max 512 characters
course_id integer no -
printer_model_ids array no -
printer_ids array no -
gcode_snippet_ids array no -
tool string no -
spare_part_category string no max 128 characters
responsible_user_ids array no -

Tasks: Update

Update an existing task.

Required permissions
maintenance_manage

POST /{id}/maintenance/templates/Update

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/Update \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
name string no min 1; max 255 characters
description string no max 5000 characters
category string no -
brands array no -
is_required boolean no -
trigger_type string no -
trigger_config array no -
spare_part_id integer no -
spare_part_quantity integer no min 1
estimated_minutes integer no min 1
instructions string no max 10000 characters
reference_url string no max 512 characters
youtube_url string no max 512 characters
course_id integer no -
printer_model_ids array no -
printer_ids array no -
gcode_snippet_ids array no -
tool string no -
spare_part_category string no max 128 characters
responsible_user_ids array no -

Tasks: Adopt defaults

Apply the default task settings.

Required permissions
maintenance_manage

POST /{id}/maintenance/templates/AdoptDefaults

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/AdoptDefaults \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "template_keys": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
template_keys array yes min 1

Tasks: Delete

Delete a task.

Required permissions
maintenance_manage

POST /{id}/maintenance/templates/Delete

Example request

curl https://api.simplyprint.io/{id}/maintenance/templates/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer no -
ids array no min 1

Schedules automatically create maintenance jobs based on a trigger -- elapsed time, print hours, completed prints, filament weight, or accumulated task threshold. Each schedule references a list of task templates that get copied into every job it creates.

Schedules: Get

Retrieve schedule.

Required permissions
maintenance_view

POST /{id}/maintenance/schedules/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "total": 5,
  "page": 1,
  "page_size": 25,
  "page_amount": 1,
  "page_count": 1,
  "data": [
    {
      "id": 87,
      "name": "Monthly maintenance",
      "description": "Thorough monthly servicing including lubrication, fan cleaning, belt tensioning, and calibration. Keeps printers in peak condition.",
      "enabled": true,
      "trigger_type": "interval_days",
      "trigger_value": 30,
      "trigger_config": null,
      "task_assignment_mode": "manual",
      "auto_task_template_ids": null,
      "min_usage_threshold": null,
      "advance_notice_days": 5,
      "snooze_days": 7,
      "stagger_max_concurrent": null,
      "stagger_period": null,
      "auto_assign_user_ids": null,
      "job_title_template": "{printer_name} - {plan_name}",
      "job_priority": "normal",
      "scope_type": "company",
      "scope_ids": null,
      "task_template_ids": [
        239,
        240,
        241,
        242,
        243,
        245,
        246
      ],
      "last_evaluated_at": null,
      "created_at": "2026-03-31T12:50:31+00:00"
    },
    {
      "id": 92,
      "name": "Every 500 print hours service",
      "description": "Usage-based maintenance triggered after 500 hours of printing",
      "enabled": true,
      "trigger_type": "print_hours",
      "trigger_value": 500,
      "trigger_config": null,
      "task_assignment_mode": "manual",
      "auto_task_template_ids": null,
      "min_usage_threshold": null,
      "advance_notice_days": 7,
      "snooze_days": 7,
      "stagger_max_concurrent": null,
      "stagger_period": null,
      "auto_assign_user_ids": null,
      "job_title_template": "{printer_name} - 500hr service",
      "job_priority": "normal",
      "scope_type": "company",
      "scope_ids": null,
      "task_template_ids": [
        253
      ],
      "last_evaluated_at": null,
      "created_at": "2026-04-01T10:19:07+00:00"
    }
  ]
}

Request

Parameter Type Required Description
enabled boolean no -
trigger_type string no max 64 characters
search string no max 255 characters
page integer no min 1
page_size integer no between 1 and 100
sort_id string no One of: name, trigger_type, enabled, created_at
sort_dir string no One of: asc, desc

Schedules: Get defaults

Retrieve the default schedule.

Required permissions
maintenance_manage

GET /{id}/maintenance/schedules/GetDefaults

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/GetDefaults \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "key": "weekly_quick_check",
      "name": "Weekly quick check",
      "description": "A fast weekly inspection to catch issues early. Covers bed cleaning, nozzle inspection, and a visual check of belts and moving parts.",
      "trigger_type": "interval_days",
      "trigger_value": 7,
      "job_priority": "low",
      "advance_notice_days": 2,
      "snooze_days": 3,
      "task_assignment_mode": "manual",
      "template_keys": [
        "generic_clean_bed",
        "generic_inspect_nozzle"
      ]
    },
    {
      "key": "monthly_maintenance",
      "name": "Monthly maintenance",
      "description": "Thorough monthly servicing including lubrication, fan cleaning, belt tensioning, and calibration.",
      "trigger_type": "interval_days",
      "trigger_value": 30,
      "job_priority": "normal",
      "advance_notice_days": 5,
      "snooze_days": 7,
      "task_assignment_mode": "manual",
      "template_keys": [
        "generic_clean_bed",
        "generic_inspect_nozzle"
      ]
    },
    {
      "key": "usage_500h_deep_service",
      "name": "Every 500 print hours",
      "description": "Extended usage-based plan for major servicing after 500 print hours. Full calibration, thorough lubrication, component inspection, and preventive part replacement.",
      "trigger_type": "print_hours",
      "trigger_value": 500,
      "job_priority": "high",
      "advance_notice_days": 7,
      "snooze_days": 7,
      "task_assignment_mode": "manual",
      "template_keys": [
        "generic_clean_bed",
        "generic_inspect_nozzle"
      ]
    }
  ]
}

Schedules: Preview

Preview the jobs a schedule would create across the account, without actually creating them. Useful for verifying scope filters and trigger settings before saving. Does not modify any data.

Required permissions
maintenance_manage

POST /{id}/maintenance/schedules/Preview

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/Preview \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
lightweight boolean no -

Schedules: Create

Create a new schedule.

Required permissions
maintenance_manage

POST /{id}/maintenance/schedules/Create

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "name": "string",
      "trigger_type": "string",
      "trigger_value": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
name string yes min 1; max 255 characters
description string no max 5000 characters
trigger_type string yes -
trigger_value integer yes min 1
trigger_config array no -
trigger_config.mode string no One of: count, specific
trigger_config.template_ids array no -
trigger_config.cancel_reason_type integer no -
enabled boolean no -
task_assignment_mode string no -
auto_task_template_ids array no -
min_usage_threshold integer no min 1
advance_notice_days integer no min 1; max 90
snooze_days integer no min 1; max 90
stagger_max_concurrent integer no min 1
stagger_period string no One of: day, week
auto_assign_user_ids array no -
job_title_template string no max 255 characters
job_priority string no -
scope_type string no One of: company, model, group, printer
scope_ids array no -
template_ids array no -

Schedules: Update

Update an existing schedule.

Required permissions
maintenance_manage

POST /{id}/maintenance/schedules/Update

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/Update \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
name string no min 1; max 255 characters
description string no max 5000 characters
trigger_type string no -
trigger_value integer no min 1
trigger_config array no -
trigger_config.mode string no One of: count, specific
trigger_config.template_ids array no -
trigger_config.cancel_reason_type integer no -
enabled boolean no -
task_assignment_mode string no -
auto_task_template_ids array no -
min_usage_threshold integer no min 1
advance_notice_days integer no min 1; max 90
snooze_days integer no min 1; max 90
stagger_max_concurrent integer no min 1
stagger_period string no One of: day, week
auto_assign_user_ids array no -
job_title_template string no max 255 characters
job_priority string no -
scope_type string no One of: company, model, group, printer
scope_ids array no -
template_ids array no -

Schedules: Adopt defaults

Apply the default schedule settings.

Required permissions
maintenance_manage

POST /{id}/maintenance/schedules/AdoptDefaults

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/AdoptDefaults \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "plan_keys": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
plan_keys array yes min 1

Schedules: Trigger now

Trigger a schedule immediately.

Required permissions
maintenance_manage

POST /{id}/maintenance/schedules/TriggerNow

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/TriggerNow \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
printer_ids array no -
schedule_in_days integer no min 1; max 365

Schedules: Delete

Delete a schedule.

Required permissions
maintenance_manage

POST /{id}/maintenance/schedules/Delete

Example request

curl https://api.simplyprint.io/{id}/maintenance/schedules/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer no -
ids array no min 1

Problems are issues reported on a printer (poor quality, layer shift, clogged nozzle, etc.). They can be linked to a maintenance job that resolves them, or resolved standalone. Problem types are the catalog of categories users pick from when reporting.

Problems: Get

Retrieve problem.

Required permissions
maintenance_view

POST /{id}/maintenance/problems/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "total": 6,
  "page": 1,
  "page_size": 25,
  "page_amount": 1,
  "page_count": 1,
  "data": [
    {
      "id": 68,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "problem_type": null,
      "reported_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "print_job_id": null,
      "description": "Bed adhesion issues during the last 3 prints.",
      "status": "resolved",
      "resolved_at": "2026-04-14T18:56:28+00:00",
      "resolved_by_job_id": null,
      "linked_jobs": [],
      "custom_field_values": [],
      "created_at": "2026-04-14T18:56:25+00:00",
      "printer_group": {
        "id": 99,
        "name": "Workshop A"
      },
      "printer_model_image": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini/product_photo_md.png",
      "printer_model_brand": "Bambu Lab"
    },
    {
      "id": 66,
      "printer_id": 385,
      "printer_name": "Workshop Printer",
      "problem_type": null,
      "reported_by": {
        "id": 1234,
        "name": "John Doe"
      },
      "print_job_id": null,
      "description": null,
      "status": "resolved",
      "resolved_at": "2026-04-14T18:52:11+00:00",
      "resolved_by_job_id": null,
      "linked_jobs": [
        {
          "id": 492,
          "title": "Routine maintenance",
          "status": "in_progress"
        }
      ],
      "custom_field_values": [],
      "created_at": "2026-04-14T18:43:57+00:00",
      "printer_group": {
        "id": 99,
        "name": "Workshop A"
      },
      "printer_model_image": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini/product_photo_md.png",
      "printer_model_brand": "Bambu Lab"
    }
  ]
}

Request

Parameter Type Required Description
printer_id integer no -
problem_type_id integer no -
status string no -
search string no max 255 characters
page integer no min 1
page_size integer no between 1 and 100
sort_id string no One of: created_at, status, printer, problem_type
sort_dir string no One of: asc, desc

Problems: Get types

Retrieve all available problem types.

GET /{id}/maintenance/problems/GetTypes

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/GetTypes \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "data": [
    {
      "id": 1,
      "name": "Clogged nozzle",
      "description": null,
      "icon": "fas fa-circle-xmark",
      "sort_order": 1
    },
    {
      "id": 2,
      "name": "Damaged print bed",
      "description": null,
      "icon": "fas fa-table-cells",
      "sort_order": 2
    },
    {
      "id": 3,
      "name": "Filament jam",
      "description": null,
      "icon": "fas fa-link-slash",
      "sort_order": 3
    },
    {
      "id": 4,
      "name": "Layer shifting",
      "description": null,
      "icon": "fas fa-arrows-left-right",
      "sort_order": 4
    },
    {
      "id": 7,
      "name": "Stringing / oozing",
      "description": null,
      "icon": "fas fa-droplet",
      "sort_order": 7
    },
    {
      "id": 8,
      "name": "Warping",
      "description": null,
      "icon": "fas fa-wave-square",
      "sort_order": 8
    },
    {
      "id": 14,
      "name": "Other",
      "description": null,
      "icon": "fas fa-question",
      "sort_order": 14
    }
  ],
  "auto_ooo_default": true,
  "can_mark_ooo": true,
  "ooo_feature_enabled": true
}

Problems: Create type

Create a new problem type.

Required permissions
maintenance_manage

POST /{id}/maintenance/problems/CreateType

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/CreateType \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "name": "string"
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
name string yes min 1; max 255 characters
description string no max 2000 characters
icon string no max 64 characters

Problems: Report

Report a new problem on a printer. Optionally link the problem to a print job that exhibited it (print_job_id). Reporting a problem does not start a maintenance job; use Create from problem to spin one up that includes recommended remediation tasks.

Required permissions
maintenance_report_problem

POST /{id}/maintenance/problems/Report

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/Report \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "printer_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
printer_id integer yes -
problem_type_id integer no -
description string no max 5000 characters
print_job_id integer no -
mark_out_of_order boolean no -
custom_fields array no -

Problems: Update type

Update an existing problem type.

Required permissions
maintenance_manage

POST /{id}/maintenance/problems/UpdateType

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/UpdateType \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
name string no min 1; max 255 characters
description string no max 2000 characters
icon string no max 64 characters

Problems: Resolve

Resolve a problem.

Required permissions
maintenance_manage

POST /{id}/maintenance/problems/Resolve

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/Resolve \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
resolved_by_job_id integer no -

Problems: Delete

Delete a problem.

Required permissions
maintenance_manage

POST /{id}/maintenance/problems/Delete

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer no -
ids array no min 1

Problems: Delete type

Delete a problem type.

Required permissions
maintenance_manage

POST /{id}/maintenance/problems/DeleteType

Example request

curl https://api.simplyprint.io/{id}/maintenance/problems/DeleteType \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -

Inventory tracks spare parts (nozzles, PTFE tubes, build plates, etc.) including stock levels and low-stock thresholds. Tasks can declare a spare_part they consume, and completing the task auto-decrements the inventory.

Inventory: Get

Retrieve inventory.

Required permissions
maintenance_view

POST /{id}/maintenance/inventory/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "total": 10,
  "page": 1,
  "page_size": 25,
  "page_amount": 1,
  "page_count": 1,
  "data": [
    {
      "id": 155,
      "name": "0.4mm Brass Nozzle",
      "description": "Standard brass nozzle for general-purpose FDM printing",
      "sku": null,
      "quantity": 23,
      "low_stock_threshold": 5,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": null,
      "buy_url": "https://store.example.com/nozzle-04mm",
      "category": "nozzle",
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": false,
      "is_out_of_stock": false,
      "custom_field_values": [],
      "created_at": "2026-04-01T10:18:28+00:00"
    },
    {
      "id": 152,
      "name": "Nozzle 0.4mm (brass)",
      "description": "Standard 0.4mm brass nozzle. Most common size for general-purpose printing.",
      "sku": null,
      "quantity": 0,
      "low_stock_threshold": 2,
      "unit": "pcs",
      "cost_per_unit": null,
      "currency": "USD",
      "buy_url": null,
      "category": "Nozzle",
      "image_url": null,
      "brands": null,
      "printer_models": [],
      "printer_model_ids": [],
      "is_low_stock": true,
      "is_out_of_stock": true,
      "custom_field_values": [],
      "created_at": "2026-03-31T12:50:42+00:00"
    }
  ]
}

Request

Parameter Type Required Description
category string no max 128 characters
low_stock boolean no -
stock_status string no One of: in_stock, low_stock, out_of_stock
search string no max 255 characters
page integer no min 1
page_size integer no between 1 and 100
sort_id string no One of: name, quantity, category, sku, cost_per_unit
sort_dir string no One of: asc, desc
printer_brand string no max 128 characters
printer_model_ids array no -

Inventory: Get defaults

Retrieve the default inventory.

Required permissions
maintenance_inventory_manage

GET /{id}/maintenance/inventory/GetDefaults

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/GetDefaults \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "data": {
    "generic": [
      {
        "key": "generic_nozzle_04",
        "name": "Nozzle 0.4mm (brass)",
        "description": "Standard 0.4mm brass nozzle. Most common size for general-purpose printing.",
        "category": "Nozzle",
        "sku": null,
        "unit": "pcs",
        "low_stock_threshold": 2
      },
      {
        "key": "generic_ptfe_tube",
        "name": "PTFE Bowden tube (1m)",
        "description": "Capricorn-style PTFE tube for Bowden extruder setups. Cut to length.",
        "category": "PTFE tube",
        "sku": null,
        "unit": "m",
        "low_stock_threshold": 1
      }
    ],
    "bambu_lab": [
      {
        "key": "bambu_pei_plate",
        "name": "Bambu Lab textured PEI plate",
        "description": "Replacement textured PEI build plate for X1/P1/A1 series.",
        "category": "Bed plate",
        "sku": null,
        "unit": "pcs",
        "low_stock_threshold": 1,
        "bambu_lab_scoped": true
      }
    ]
  },
  "brand_meta": {
    "generic": {
      "label": "Generic FDM",
      "brand_name": null
    },
    "bambu_lab": {
      "label": "Bambu Lab",
      "brand_name": "Bambu Lab"
    }
  },
  "user_models_by_brand": {
    "Bambu Lab": [
      "A1 Mini",
      "P1P",
      "X1-Carbon"
    ],
    "Prusa": [
      "i3 MK4S",
      "CORE One"
    ]
  },
  "adopted_keys": []
}

Inventory: Create

Create a new inventory.

Required permissions
maintenance_inventory_manage

POST /{id}/maintenance/inventory/Create

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/Create \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "name": "string"
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
name string yes min 1; max 255 characters
description string no max 5000 characters
sku string no max 128 characters
quantity integer no min 0
low_stock_threshold integer no min 0
unit string no max 32 characters
cost_per_unit integer no min 0
currency string no max 3 characters
buy_url string no max 512 characters
category string no max 128 characters
image_id integer no -
brands array no -
printer_model_ids array no -
custom_fields array no -

Inventory: Update

Update an existing inventory.

Required permissions
maintenance_inventory_manage

POST /{id}/maintenance/inventory/Update

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/Update \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
name string no min 1; max 255 characters
description string no max 5000 characters
sku string no max 128 characters
low_stock_threshold integer no min 0
unit string no max 32 characters
cost_per_unit integer no min 0
currency string no max 3 characters
buy_url string no max 512 characters
category string no max 128 characters
image_id integer no -
brands array no -
printer_model_ids array no -
custom_fields array no -

Inventory: Adopt defaults

Apply the default inventory settings.

Required permissions
maintenance_inventory_manage

POST /{id}/maintenance/inventory/AdoptDefaults

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/AdoptDefaults \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "part_keys": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
part_keys array yes min 1

Inventory: Adjust stock

Adjust the stock level of a inventory.

Required permissions
maintenance_inventory_manage

POST /{id}/maintenance/inventory/AdjustStock

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/AdjustStock \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "id": 1,
      "adjustment": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer yes -
adjustment integer yes -
mode string no One of: adjust, set
reason string no max 500 characters

Inventory: Delete

Delete a inventory.

Required permissions
maintenance_inventory_manage

POST /{id}/maintenance/inventory/Delete

Example request

curl https://api.simplyprint.io/{id}/maintenance/inventory/Delete \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
id integer no -
ids array no min 1

Printer: Get profile

Retrieve the maintenance profile of a printer.

Required permissions
maintenance_view

POST /{id}/maintenance/printer/GetProfile

Example request

curl https://api.simplyprint.io/{id}/maintenance/printer/GetProfile \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "printer_id": 1
    }'

Example response

{
  "status": true,
  "message": null,
  "data": {
    "printer_info": {
      "id": 385,
      "name": "Workshop Printer",
      "group": {
        "id": 99,
        "name": "Workshop A"
      },
      "model": {
        "id": 573,
        "name": "A1 Mini",
        "brand": "Bambu Lab",
        "images": {
          "md": {
            "silhouette": null,
            "product": "https://cdn.simplyprint.io/i/printer_types/bambu_lab/a1_mini/product_photo_md.png",
            "custom": null
          }
        }
      },
      "out_of_order": false
    },
    "health": {
      "last_maintenance_at": "2026-04-14T18:09:40+00:00",
      "days_since_maintenance": 4,
      "total_maintenance_count": 13,
      "total_downtime_seconds": 1138472,
      "active_job": {
        "id": 492,
        "title": "Routine maintenance",
        "started_at": "2026-04-14T18:51:41+00:00",
        "priority": "normal",
        "status": "in_progress",
        "completed_tasks": 0,
        "total_tasks": 4
      },
      "next_scheduled_job": {
        "id": 406,
        "title": "Scheduled maintenance - Workshop Printer",
        "scheduled_date": null,
        "priority": "normal",
        "status": "scheduled"
      },
      "open_problems_count": 0,
      "current_status": "in_maintenance"
    },
    "stats": {
      "total_runtime_seconds": 44161,
      "print_count": 41,
      "completed_print_count": 26,
      "success_rate": 63.4
    },
    "active_job_detail": null,
    "job_history": [
      {
        "id": 491,
        "printer_id": 385,
        "printer_name": "Workshop Printer",
        "schedule_id": null,
        "created_by": {
          "id": 1234,
          "name": "John Doe"
        },
        "title": "Nozzle replacement",
        "description": null,
        "status": "completed",
        "priority": "normal",
        "started_at": "2026-04-14T15:23:19+00:00",
        "completed_at": "2026-04-14T15:38:46+00:00",
        "progress": 100,
        "completed_tasks": 2,
        "total_tasks": 2,
        "duration_seconds": 927,
        "parts_used_count": 0
      }
    ],
    "task_completion_history": [
      {
        "name": "Inspect nozzle",
        "category": "inspection",
        "times_completed": 2,
        "last_completed_at": "2026-04-14T15:38:44+00:00",
        "last_completed_by": "John Doe",
        "last_job_id": 491,
        "spare_part_name": null,
        "spare_part_sku": null,
        "spare_part_category": null,
        "spare_part_image_url": null,
        "spare_part_quantity_total": 0
      }
    ],
    "parts_consumed": [
      {
        "id": 155,
        "name": "0.4mm Brass Nozzle",
        "sku": null,
        "category": "nozzle",
        "unit": "pcs",
        "image_url": null,
        "total_quantity": 3,
        "last_used_at": "2026-04-14T14:11:46+00:00"
      }
    ],
    "open_problems": []
  }
}

Request

Parameter Type Required Description
printer_id integer yes -
include_active_job_detail boolean no -

Printer: Get status map

Retrieve the printer status map.

Required permissions
maintenance_view

GET /{id}/maintenance/printer/GetStatusMap

Example request

curl https://api.simplyprint.io/{id}/maintenance/printer/GetStatusMap \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "data": {
    "13": {
      "status": "scheduled",
      "next_scheduled_date": null
    },
    "385": {
      "status": "in_maintenance",
      "next_scheduled_date": null
    },
    "39426": {
      "status": "due",
      "next_scheduled_date": "2026-04-11T19:08:55+00:00"
    },
    "40624": {
      "status": "scheduled",
      "next_scheduled_date": null
    }
  }
}

Timeline: Get

Retrieve timeline.

Required permissions
maintenance_view

POST /{id}/maintenance/timeline/Get

Example request

curl https://api.simplyprint.io/{id}/maintenance/timeline/Get \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "entity_type": "maintenance_job",
      "entity_id": 1
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
entity_type string yes One of: maintenance_job, printer
entity_id integer yes -
page integer no min 1
per_page integer no min 1; max 100
filter string no -
search string no -

Partner: Dashboard

Retrieve the dashboard view for partner.

GET /{id}/maintenance/partner/Dashboard

Example request

curl https://api.simplyprint.io/{id}/maintenance/partner/Dashboard \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}'

Example response

{
  "status": true,
  "message": null,
  "companies": [
    {
      "company_id": 5152,
      "company_name": "Acme Print Lab",
      "in_maintenance": 0,
      "scheduled": 0,
      "overdue": 0,
      "open_problems": 3
    },
    {
      "company_id": 455,
      "company_name": "Acme Print Lab",
      "in_maintenance": 0,
      "scheduled": 0,
      "overdue": 0,
      "open_problems": 0
    }
  ],
  "totals": {
    "in_maintenance": 0,
    "overdue": 2,
    "open_problems": 3,
    "scheduled": 2
  },
  "recent_problems": [
    {
      "id": 61,
      "printer_id": 4182,
      "printer_name": "Printer 4",
      "problem_type": {
        "id": 5,
        "name": "Under-extrusion",
        "description": null,
        "icon": "fas fa-arrow-down",
        "sort_order": 5
      },
      "reported_by": {
        "id": 76716,
        "name": "John Doe"
      },
      "print_job_id": null,
      "description": null,
      "status": "open",
      "resolved_at": null,
      "resolved_by_job_id": null,
      "linked_jobs": [],
      "custom_field_values": [],
      "created_at": "2026-04-09T15:11:26+00:00",
      "company_id": 5152,
      "company_name": "Acme Print Lab"
    }
  ]
}

Partner: Calendar

Retrieve the calendar view for partner.

POST /{id}/maintenance/partner/Calendar

Example request

curl https://api.simplyprint.io/{id}/maintenance/partner/Calendar \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "start": "string",
      "end": "string"
    }'

Example response

{
  "status": true,
  "message": null,
  "events": [
    {
      "id": 224,
      "title": "Acme Print Lab - Printer 2 - {schedule_name}",
      "start": "2026-04-09T16:03:15+00:00",
      "end": null,
      "color": "#DB4437",
      "extendedProps": {
        "status": "overdue",
        "priority": "normal",
        "printer_name": "Printer 2",
        "printer_id": 24423,
        "company_id": 23418,
        "company_name": "Acme Print Lab",
        "progress": 0
      }
    },
    {
      "id": 225,
      "title": "Acme Print Lab - Printer 1 - {schedule_name}",
      "start": "2026-04-09T16:30:43+00:00",
      "end": "2026-04-09T16:32:03+00:00",
      "color": "#4285F4",
      "extendedProps": {
        "status": "completed",
        "priority": "normal",
        "printer_name": "Printer 1",
        "printer_id": 24422,
        "company_id": 23418,
        "company_name": "Acme Print Lab",
        "progress": 100
      }
    },
    {
      "id": 227,
      "title": "Acme Print Lab - Deep clean",
      "start": "2026-04-09T22:00:00+00:00",
      "end": null,
      "color": "#DB4437",
      "extendedProps": {
        "status": "overdue",
        "priority": "normal",
        "printer_name": "Printer 8",
        "printer_id": 24429,
        "company_id": 23418,
        "company_name": "Acme Print Lab",
        "progress": 0
      }
    }
  ]
}

Request

Parameter Type Required Description
start string yes -
end string yes -

Partner: Propagate schedules

Propagate schedules to managed partner.

POST /{id}/maintenance/partner/PropagateSchedules

Example request

curl https://api.simplyprint.io/{id}/maintenance/partner/PropagateSchedules \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "schedule_ids": [],
      "company_ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
schedule_ids array yes min 1; max 100
company_ids array yes min 1; max 100
overwrite_existing boolean no -

Partner: Propagate templates

Propagate templates to managed partner.

POST /{id}/maintenance/partner/PropagateTemplates

Example request

curl https://api.simplyprint.io/{id}/maintenance/partner/PropagateTemplates \
  -X POST \
  -H 'accept: application/json' \
  -H 'X-API-KEY: {API_KEY}' \
  -d '{
      "template_ids": [],
      "company_ids": []
    }'

Example response

{
  "status": true,
  "message": null
}

Request

Parameter Type Required Description
template_ids array yes min 1; max 100
company_ids array yes min 1; max 100
overwrite_existing boolean no -

Permissions and scopes

Permissions

Last updated: April 24, 2026

These permissions are used to control access within a company. The permissions are tied to the user groups within the company.

The owner of a company has all permissions.

Permission Description
access_all_printers Access all printers
ai_printer_settings Manage AI settings
ai_printer_toggle Toggle AI Failure Detection
all_slicer_modes Access all slicer modes
approve_quota_requests Approve quota requests
archive_print_jobs Archive print jobs
assign_peer_rank Assign peer rank
autoprint_manage Manage AutoPrint
baby_stepping Baby stepping
bed_leveling Bed leveling tool
can_export Export data
cancel Can cancel
cancel_decide_queue_return Decide queue return on cancel
cancel_others Cancel others' prints
change_filament Change filament
change_print_speed Change print speed
change_temps Change temperatures
change_user_rank Can change user rank
change_user_school_class Change user's school class
clear_bed Clear bed
courses_manage Manage courses
courses_view View courses
create_filament Add new filament
create_org_folder Create organisation folders
custom_fields_edit_all_print Edit all print custom fields
custom_fields_edit_own_print Edit own print custom fields
custom_fields_manage Manage custom fields
custom_slicer_profiles Allow custom slicer profiles
delete_user Can delete users
display_screen_settings Display Screens management
download_others_print_jobs Download other user's print jobs
edit_tags Edit tags
emergency_stop Emergency stop
feature_unlocks_manage Manage Feature Unlocks
filament_adjust_weight Adjust filament weight
filament_barcode_scanner Barcode & QR code scanner access
filament_dry Dry filament
filament_generate_labels Generate filament labels
filament_label_pick_default_presets Use default filament label presets
filament_label_presets_manage Manage filament label presets
filament_label_settings Access filament label settings
filament_label_use_any_user_preset Use any user's label presets
filament_locations_manage Manage filament locations
filament_nfc_assign_flash Assign & flash filament NFC tags
filament_nfc_scanner NFC scanner access
filament_settings Filament settings
filament_view_all_print_jobs View all filament print job history
filament_view_spool_details View spool details
files_assign_custom_tags Custom tags (files)
files_material_tag Material tags (files)
files_nozzle_tag Tag nozzle (files)
gcode_profiles G-code profiles
goto_local Go to local
invite_users Can invite users
maintenance_complete Complete maintenance tasks
maintenance_inventory_manage Manage spare parts inventory
maintenance_manage Manage maintenance
maintenance_report_problem Report maintenance problems
maintenance_view View maintenance
manage_quotas Manage quotas & limits
manage_subscription Manage subscription
manage_user_balance Manage user balance
manual_user_email_confirm Can confirm user email
one_click_print 1-click print
org_admin Edit organisation settings
org_api Organisation API key access
org_hub_settings Edit Hub settings
org_rank_management Manage user groups
org_school_settings_manage School settings management
org_user_registration_settings Edit registration settings
org_view_statistics View organization-wide statistics
panel_printing Allow panel printing
pause Can pause
print Can print
print_queue Access print queue
printer_add Add printers
printer_delete Delete printers
printer_edit Edit printers
printer_group_manage Manage printer groups
printer_info See printer info
printer_restart Restart printers
printer_settings Printer settings
printer_status_warnings See printer status warnings
printer_update Update printers
queue_approve Approve/deny queue items
queue_approve_view_all View all pending items
queue_assign_custom_tags Custom tags (queue item)
queue_assign_printers Assign printers & printer groups to queue item
queue_delete_others_comments Delete others' comments
queue_download_others Download other users' jobs
queue_edit_others Edit other users' items
queue_groups Queue groups
queue_material_tag Material tags (queue item)
queue_move_items Move queue items between queue groups
queue_nozzle_tag Tag nozzle (queue item)
queue_print_slice Start & slice via print queue
queue_read_notes Read others' notes
queue_remove_all Remove all queue items / other users' items
queue_revive_done_items Move done jobs back to the queue
queue_see_done_items See done items
queue_see_others See other users' job items
queue_skip_approval Skip approval requirement
queue_whole_folder Queue whole folders from 'Your files'
refer_a_friend_settings 'Refer a friend' feature & settings access
refund_user_quota Refund user quota
reorder_queue Re-order print queue
reprint_file Reprint files
reprint_others Reprint other people's files
school_dashboard_view View school dashboard
see_archived_jobs See archived print jobs
see_cam See camera
see_filament_tab View filament system
see_integrations Can see integrations page
see_livechat See & use livechat widget
see_print_history Can see print history page
see_print_job_page Can see individual print job pages
see_printers_no_access Can see printers they don't have access to
see_slicer_default_profiles Access official slicer profiles
see_statistics Can see statistics page
see_who_printed See who printed
send_raw_gcode Send G-code
set_user_teacher Set user as teacher
skip_objects Can skip objects
slice Can slice
slicer_add_plate Add plate
slicer_auto_arrange Auto arrange models
slicer_auto_rotate Auto rotate
slicer_change_bed_type Change bed type
slicer_change_engine Change slicer engine
slicer_change_filament_profile Change filament profile
slicer_change_machine_profile Change machine profile
slicer_change_nozzle_size Change nozzle size
slicer_change_nozzle_volume_type Change nozzle volume type
slicer_change_print_profile Change print profile
slicer_change_profile_settings Change slicer print profile settings
slicer_flush_volumes Flush volumes
slicer_grid_snap Grid snap
slicer_history Slicer history
slicer_lay_on_face Lay on face
slicer_measure Measure tool
slicer_org_profiles Make organisation slicer profiles
slicer_org_settings Access & change account slicer settings
slicer_paint_color Paint color
slicer_paint_fuzzy_skin Paint fuzzy skin
slicer_paint_seam Paint seam
slicer_paint_support Paint support
slicer_personal_ui_settings Change personal UI settings
slicer_simplify_model Simplify model
slicer_text Add and edit text
staggered_start_manage Manage staggered start groups
unarchive_print_jobs Unarchive print jobs
use_out_of_order_printers Allow using out-of-order printers
view_all_print_history View everyone's print history
view_news See news
view_print_job_user View print job user
view_users Can see "Users" tab in panel
webhooks_manage Webhook management
widget_control "Control" widget
widget_device_health See device health
widget_print_history Printer print history widget
z_offset_calibration Z-Offset Calibration

OAuth2 scopes

These scopes are used to control access to the API. The scopes are tied to the OAuth2 access token.

Scope Description
balance.read View your balance history
balance.write Manage your balance
custom_fields.read View your custom fields
custom_fields.write Manage your custom fields and their values
display_screens.read View your display screens
display_screens.write Manage your display screens
files.read View your files and folders
files.temp_upload Upload temporary files
files.write Manage your files and folders
print_history.read View your print history
print_history.write Manage your print history (archive, restore)
printers.actions Operate your printers
printers.read View your printers' details
printers.write Manage your printers' details
queue.read View your print queue
queue.write Manage your print queue
quota.read View your quota
quota.write Manage your quota
slicer.read View your slicer profiles
slicer.write Manage your slicer profiles
spools.read View filament spools
spools.write Manage filament spools
statistics.read View your print statistics
tags.read View your custom tags
tags.write Manage your custom tags
user.read View your user details
webhooks.read View your webhooks
webhooks.write Manage your webhooks

Errors

The SimplyPrint API uses the following HTTP error codes:

Error Code Meaning
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your API key is wrong.
403 Forbidden -- Request not allowed.
404 Not Found -- Endpoint not found.
405 Method Not Allowed -- You tried to access an endpoint with an invalid method.
406 Not Acceptable -- You requested a format that isn't json.
410 Gone -- The endpoint requested has been removed from our servers.
429 Too Many Requests -- You're requesting too much - slow down
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.

Error Response

Error response example:

{
  "status": false,
  "message": "No API key provided, or not logged in"
}

When an error occurs, the API will return a JSON object with the following fields:

Field Description Type
status The status of the request Boolean
message A message describing the error String/null

MCP (Model Context Protocol)

SimplyPrint exposes a JSON-RPC 2.0 Model Context Protocol server so AI assistants (Claude, ChatGPT, Gemini, Cursor, any MCP-compatible client) can drive a user's SimplyPrint account over OAuth2 with scoped access. The server wraps the same API endpoints documented throughout the rest of this reference - each MCP "tool" is a thin mapping to a real API endpoint.

SimplyPrint is published on the official MCP registry as io.simplyprint/simplyprint. Clients that support registry browsing can discover the server without the user pasting a URL.

Endpoint

POST https://simplyprint.io/api/mcp

All MCP traffic flows through a single endpoint. Method and payload are dispatched via the standard JSON-RPC 2.0 envelope.

Supported JSON-RPC methods:

Method Auth required Purpose
initialize No Handshake; returns server capabilities and OAuth metadata URLs.
tools/list No Returns the full tool catalog and their JSON Schemas. Intentionally unauthenticated so clients can discover tools before the user approves any scopes.
tools/call Yes Invoke a tool. Requires a valid OAuth2 Bearer token or a resolved session.

Authentication

The user-facing MCP uses the OAuth 2.0 Authorization Code Flow and Device Authorization Flow. Metadata is served at:

GET https://simplyprint.io/.well-known/oauth-authorization-server

The typical flow:

  1. Client calls initialize. The response includes the authorization and token URLs.
  2. Client opens the authorization URL (or runs the device flow). The user logs in to SimplyPrint and approves the scopes the client asks for.
  3. Client receives an access token. It passes the token as Authorization: Bearer {token} on subsequent MCP calls.
  4. The server returns a Mcp-Session-Id header on the first authenticated call. Sending that header back on later requests avoids re-sending the Bearer every time.

Example initialize

Request

curl -X POST https://simplyprint.io/api/mcp \
    -H 'Content-Type: application/json' \
    -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","clientInfo":{"name":"my-client","version":"1.0"},"capabilities":{}}}'

Response (abridged)

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-03-26",
    "serverInfo": { "name": "SimplyPrint MCP", "version": "1.0" },
    "capabilities": { "tools": { "listChanged": true } }
  }
}

Example tools/call

Request

curl -X POST https://simplyprint.io/api/mcp \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {BEARER_TOKEN}' \
    -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_printers","arguments":{"compact":true}}}'

Response (abridged)

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      { "type": "text", "text": "{\"status\":true,\"printers\":[ ... ]}" }
    ],
    "isError": false
  }
}

Scopes

Every user-facing MCP tool requires one OAuth2 scope. The authorization screen lets the user approve or decline each scope individually. Tools whose scope was not granted are hidden from that user's tools/list response (per-session filtering).

Scope Description
user.read View your user details
printers.read View your printers' details
printers.write Manage your printers' details
printers.actions Operate your printers (pause, resume, cancel, home, G-code)
spools.read View filament spools
spools.write Manage filament spools
files.read View your files and folders
files.write Manage your files and folders
files.temp_upload Upload temporary files
queue.read View your print queue
queue.write Manage your print queue
custom_fields.read View your custom fields
custom_fields.write Manage your custom fields and their values
quota.read View your quota
quota.write Manage your quota
statistics.read View your print statistics
print_history.read View your print history
print_history.write Manage your print history (archive, restore)
slicer.read View your slicer profiles
slicer.write Manage your slicer profiles
tags.read View your custom tags
tags.write Manage your custom tags
webhooks.read View your webhooks
webhooks.write Manage your webhooks
balance.read View your balance history
balance.write Manage your balance
display_screens.read View your display screens
display_screens.write Manage your display screens

Error model

Tool execution errors surface as isError: true in the content array rather than as JSON-RPC error envelopes. This preserves the raw API error so the assistant can show it to the user. JSON-RPC-level errors (invalid method, auth required, malformed request) return standard JSON-RPC error objects.

Common failure modes:

Symptom Cause Fix
-32001 Unauthorized Missing or expired Bearer token Re-run the OAuth flow.
-32001 Scope not granted Tool's required scope is not in the token Re-authorize and approve the scope, or hide the tool client-side.
isError: true with "Feature not available" The company's plan lacks the required feature (e.g. STATISTICS, QUEUE_APPROVAL) User must upgrade or tool should be hidden.
isError: true with "Permission denied" The user's role lacks the required permission (e.g. PRINT_QUEUE_REMOVE_ALL) Ask a user with higher privileges.

Client setup

Claude Desktop

In ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent path:

{
  "mcpServers": {
    "simplyprint": {
      "type": "http",
      "url": "https://simplyprint.io/api/mcp"
    }
  }
}

Claude Desktop will open the SimplyPrint authorization page the first time the user asks it to use a SimplyPrint tool.

ChatGPT custom connector

Open a new chat, click the connector icon, add a custom connector, and paste https://simplyprint.io/api/mcp.

Other MCP clients

Any MCP-compliant client works. Point it at https://simplyprint.io/api/mcp and it will handle the OAuth discovery automatically.

Discovering available tools

The canonical source of truth for the tool catalog is the server itself, not this page. Clients should call tools/list over the MCP endpoint to retrieve the current set of tools, their JSON Schemas, annotations, and descriptions. The server filters per-user after auth so the response reflects exactly what the authorizing user is allowed to call.

Quirks worth knowing