openapi: 3.0.1 info: termsOfService: /developer/terms-of-use title: Eiger API V3 description: | © 2023 Markforged - All Rights Reserved # Introduction The Eiger API uses RESTful principles. This means the API is organized around **resources** and **collections** of resources. Resources and collections are each available at their own URI. You can interact with these resources using standard [HTTP Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) on the resource's URI. Example endpoint ``` GET https://www.eiger.io/api/v3/devices ``` It is important that your syntax include **https** & **www** in the request to avoid issues with security and redirects. Responses from the API server will be in JSON and are documented throughout the reference docs. Eiger's API is described by an [OpenAPI Specification](https://spec.openapis.org/oas/v3.1.0). This interactive documentation is automatically generated from the specification file. # Getting Started To start using the API, you will first need to get an API key. Only the Eiger Organization admin has the permissions to generate API keys. To get an API key, have your organization admin generate one using the API keys management page.

You are your organization's owner. This means you can create API keys by navigating to the API Keys Manager in Eiger and following the steps below.

  1. Select "Create API Key"
    Create API Key
  2. Name the API Key
    This should describe what you intend to use this key for. You should generate a new key for every application that needs access to the API. Name your API Key
  3. Download the Credentials
    Save it in a secure location. You will not be able to view your Secret Key again. Never share your API Secret Key. Download the credentials
# Authentication The Eiger API requires authentication to identify the API consumer and validate that they have permission to use the API. Authentication is handled through [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) and API keys. Eiger API keys contain two credentials: - **API Access Key** - **API Secret Key** HTTP Basic Auth accepts two credentials: Username and Password. To authenticate Eiger API requests, use the Access Key as the Username and the Secret Key as the Password. CURL ```curl curl 'https://www.eiger.io/api/v3/devices' -u $ACCESS_KEY:$SECRET_KEY ``` PYTHON ```python import requests requests.get('https://www.eiger.io/api/v3/devices', auth={ ACCESS_KEY, SECRET_KEY ) ``` # Examples This documentation includes both example programs and short code recipes to help kickstart your project. ## Downloadable Python Programs You can download these Python command-line utility programs as a starting point, or review the code for inspiration. These examples can be combined by chaining them together: Send build 'Build01' to 'Printer01' ```bash $ send-to-printer `build Build01` `device Printer01` ``` #### You can download these example programs here: |Filename|Description| |---|---| |[approve-builds.py](/developer/example/approve-builds)|Update the approved builds list in Eiger| |[available-printers.py](/developer/example/available-printers)|Get list of available printers for a specified build| |[build.py](/developer/example/build)|Find a build given it's title| |[device-utilization.py](/developer/example/device-utilization)|Compute the device utilization over a time period| |[device.py](/developer/example/device)|Get device ID by name.| |[print-job-state.py](/developer/example/print-job-state)|Gets the number of print jobs in each state| |[printed-parts.py](/developer/example/printed-parts)|Find a printed part given it's notes| |[scan-reports.py](/developer/example/scan-reports)|Download all scan report for a print job.| |[send-to-printer.py](/developer/example/send-to-printer)|Send a build to a printer.| ## List All Devices
```python import os import requests ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') url = 'https://www.eiger.io/api/v3/devices' response = requests.get(url, auth=(ACCESS_KEY,SECRET_KEY)) print(response.text) ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Make a Request
    Use this function call to make an HTTP "GET" request to the devices API endpoint
  3. Display Result
    The API returns a JSON object, which is displayed.
## Get Device Status by Name Return the status for a specific device.
```python import os import requests ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') DEVICE_NAME = 'Printer' url = f"https://www.eiger.io/api/v3/devices?filter[name][eq]={DEVICE_NAME}" response = requests.get(url, auth=(ACCESS_KEY,SECRET_KEY)) print(response.text) ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Get the Device Name
    You will need the device name
  3. Make a Request
    Use this function call to make an HTTP "GET" request to the devices API endpoint
  4. Display Result
    The API returns a JSON object, which is displayed.
## Get Queue Information For a specific device, return the number of jobs in the queue, the estimated time to print and the amount of material remaining.
```python import os import requests ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') DEVICE_ID = "00000000-0000-0000-0000-000000000000" url = f"https://www.eiger.io/api/v3/devices/{DEVICE_ID}/queue" response = requests.post(url, data={"build": BUILD_ID}, auth=(ACCESS_KEY,SECRET_KEY)) json = response.json() device = json.get('device') print(f"{device.get('queue_length')} jobs in queue") print(f"{device.get('queue_estimated_time_seconds')} seconds to print (estimated)") primary = device.get('ccs_primary_remaining') or 0 secondary = device.get('ccs_secondary_remaining') or 0 for job in json.get('queue'): primary -= job.get('build').get('ccs_primary_required') or 0 secondary -= job.get('build').get('ccs_secondary_required') or 0 print(f"{primary} ccs of primary material remaining") print(f"{secondary} ccs of secondary material remaining") ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Get Device ID
    You will need the ID of the device.
  3. Read the Queue
    Call the API to read the device queue
  4. Extract the Queue Information
    Extract the queue length and estimated print time.
  5. Compute Material Used
    Compute the remaining material by starting with the current levels, and subtracting the needed material for each job in the queue
## Add a Build to Device Queue Add a specific build to the end of a device's print queue.
```python import os import json import requests ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') BUILD_ID = '00000000-0000-0000-0000-000000000000' DEVICE_ID = '00000000-0000-0000-0000-000000000000' url = f"https://www.eiger.io/api/v3/devices/{DEVICE_ID}/queue" response = requests.post(url, data={"build": BUILD_ID}, auth=(ACCESS_KEY,SECRET_KEY)) print('Build added to queue') ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Get Printer and Build ID
    You will need the ID of both the printer and the build.
  3. Make a Request
    Make an API call to append the build to the end of the device's queue.
  4. Print Success Message
## Clear Device Queue Remove all jobs from a device's queue
```python import os import requests ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') BUILD_ID = '00000000-0000-0000-0000-000000000000' PRINTER_ID = '00000000-0000-0000-0000-000000000000' url = f"https://www.eiger.io/api/v3/devices/{PRINTER_ID}/queue" response = requests.get(url, auth=(ACCESS_KEY,SECRET_KEY)) for job in response.json().get('queue'): url = f"https://www.eiger.io/api/v3/devices/{PRINTER_ID}/queue/{job.get('id')}" requests.delete(url, auth=(ACCESS_KEY,SECRET_KEY)) print('Queue Cleared') ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Get Device and Build ID
    You will need the ID of both the device and the build.
  3. Get the Device Queue
    Make an API request to get the device's queue.
  4. Remove Jobs from the Queue
    Request each print job to be removed from the device queue
  5. Display Success Message
## Remove a Build From Device Queue Remove a specific build from a device's queue.
```python import os import json import requests ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') BUILD_ID = "00000000-0000-0000-0000-000000000000" PRINTER_ID = "00000000-0000-0000-0000-000000000000" url = f"https://www.eiger.io/api/v3/devices/{PRINTER_ID}/queue" response = requests.get(url, auth=(ACCESS_KEY,SECRET_KEY)) for job in response.json().get('queue'): if job.get('build').get('id') == BUILD_ID: url = f"https://www.eiger.io/api/v3/devices/{PRINTER_ID}/queue/{job.get('id')}" response = requests.delete(url, auth=(ACCESS_KEY,SECRET_KEY)) print('Build removed from queue') exit(0) print('Build not found in queue') exit(1) ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Get Device and Build ID
    You will need the ID of both the device and the build.
  3. Get the Device Queue
    Make an API request to retrieve the list of print jobs in the device's queue
  4. Remove Jobs From the Queue
    Make an API request for each job in the queue to remove the job
  5. Print Success Message
  6. Print Failure Message
## Send Build to Device Select a build ID to send to a device as a print job. Once the request to print is sent, the program confirms the job has started by polling the device status.
```python import os import time import requests # get API credentials from environment variables ACCESS_KEY = os.environ.get('ACCESS_KEY') SECRET_KEY = os.environ.get('SECRET_KEY') BUILD_ID = '00000000-0000-0000-0000-000000000000' PRINTER_ID = '00000000-0000-0000-0000-000000000000' responses = { 201: 'Print Job Created', 401: 'Not Authorized. Check API Keys', 400: 'Invalid Print. Check Print ID and Compatibility', 404: 'Could not find Print or Printer', 409: 'Printer not ready to receive Print', } # api endpoint for interacting with our device device_url = f"https://www.eiger.io/api/v3/devices/{PRINTER_ID}" response = requests.post(device_url, data={"build": BUILD_ID}, auth=(ACCESS_KEY,SECRET_KEY)) code = response.status_code message = responses.get(code, 'Something went wrong.') if code != 201: print(response.text) raise Exception(message) print_job_id = response.json()['id'] total_tries = 3 retry_interval = 2 # seconds for i in range(total_tries): response = requests.get(device_url, auth=(ACCESS_KEY,SECRET_KEY)).json() if response['active_job']['id'] == print_job_id: break time.sleep(retry_interval) else: print('Print Job did not make it to Printer') exit(1) # display the print_job print(response) exit(0) ``` Click on each step to see details, and highlight the corresponding code above
  1. Get API Credentials
    You will need your API credentials (Access Key & Secret Key) to authenticate API requests.
  2. Get Device and Build ID
    You will need the ID of both the device and the build.
  3. Define Status Codes
    Define a textual message for the possible status codes.
  4. Request the Print to Start
    This request will start a Print Job if the Printer is ready and the Print is compatible. Please make sure the printer is safe to use prior to making this request!
  5. Check if the Print Failed to Start
    The API will let you know if the Print cannot be started.
  6. Ensure the the Printer is Printing
    Check the status of the Printer to make sure the Print Job is running
  7. Display result
contact: url: https://support.markforged.com name: Markforged Support version: 3.0.1 x-logo: url: '/developer/assets/images/mf-logo-dark.svg' altText: Markforged Logo servers: - url: https://www.eiger.io/api/v3 security: - basic: [] tags: - name: Builds description: Endpoints for interacting with builds - name: Devices description: Endpoints for interacting with devices - name: Parts description: Endpoints for interacting with parts - name: Print Jobs description: Endpoints for interacting with print jobs - name: Users description: Endpoints for interacting with users paths: /backlog/{build_id}: post: tags: - Builds operationId: sendBuildToBacklog summary: Send Build to Backlog description: | ### Send a build to the backlog. This will create a printjob with a backlogged status, and return the printjob. responses: '201': $ref: '#/components/responses/sendBuildToBacklog' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/build_id' requestBody: $ref: '#/components/requestBodies/sendBuildToBacklog' /builds: get: tags: - Builds operationId: listBuilds summary: List Builds description: | ### List all the builds in your organization Items are returned in reverse chronological order. responses: '200': $ref: '#/components/responses/listBuilds' '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/generic.page.number' - $ref: '#/components/parameters/generic.page.size' - $ref: '#/components/parameters/generic.filter.title.eq' - $ref: '#/components/parameters/generic.filter.created_at.lt' - $ref: '#/components/parameters/generic.filter.created_at.le' - $ref: '#/components/parameters/generic.filter.created_at.gt' - $ref: '#/components/parameters/generic.filter.created_at.ge' - $ref: '#/components/parameters/generic.filter.updated_at.lt' - $ref: '#/components/parameters/generic.filter.updated_at.le' - $ref: '#/components/parameters/generic.filter.updated_at.gt' - $ref: '#/components/parameters/generic.filter.updated_at.ge' - $ref: '#/components/parameters/generic.filter.part_count.eq' - $ref: '#/components/parameters/generic.filter.part_count.ne' - $ref: '#/components/parameters/generic.filter.part_count.lt' - $ref: '#/components/parameters/generic.filter.part_count.le' - $ref: '#/components/parameters/generic.filter.part_count.gt' - $ref: '#/components/parameters/generic.filter.part_count.ge' - $ref: '#/components/parameters/generic.filter.sliced.eq' - $ref: '#/components/parameters/generic.filter.blacksmith_enabled.eq' - $ref: '#/components/parameters/generic.filter.approved.eq' - $ref: '#/components/parameters/generic.filter.approved.ne' - $ref: '#/components/parameters/generic.sort.order.asc' - $ref: '#/components/parameters/listBuilds.sort.by' /builds/{build_id}: get: tags: - Builds operationId: readBuild summary: Get Build description: | ### Get a single build responses: '200': $ref: '#/components/responses/readBuild' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/build_id' /builds/approved: get: tags: - Builds operationId: listApprovedBuilds summary: List Approved Builds description: | ### List all approved builds in your organization responses: '200': $ref: '#/components/responses/listApprovedBuilds' '204': description: Build approvals are disabled '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/generic.page.size' - $ref: '#/components/parameters/generic.page.number' put: tags: - Builds operationId: approveBuilds summary: Approve Builds description: | ### Update all specified builds to be approved, unapproving all others. responses: '204': description: Successfully approved builds. '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' requestBody: $ref: '#/components/requestBodies/approveBuilds' delete: tags: - Builds operationId: disableApprovedBuilds summary: Disable Build Approvals description: | ### Disable all approved builds, leaving all builds as default (approved) responses: '204': description: Successfully disabled approved builds. '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' /devices: get: tags: - Devices operationId: listDevices summary: List Devices description: | ### List all devices in organization responses: '200': $ref: '#/components/responses/listDevices' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/generic.filter.name.eq' - $ref: '#/components/parameters/generic.filter.created_at.le' - $ref: '#/components/parameters/generic.filter.created_at.lt' - $ref: '#/components/parameters/generic.filter.created_at.gt' - $ref: '#/components/parameters/generic.filter.created_at.ge' - $ref: '#/components/parameters/generic.filter.updated_at.le' - $ref: '#/components/parameters/generic.filter.updated_at.lt' - $ref: '#/components/parameters/generic.filter.updated_at.gt' - $ref: '#/components/parameters/generic.filter.updated_at.ge' - $ref: '#/components/parameters/generic.sort.order.asc' - $ref: '#/components/parameters/listDevices.sort.by' - $ref: '#/components/parameters/generic.page.number' - $ref: '#/components/parameters/generic.page.size' /devices/{device_id}: get: tags: - Devices operationId: readDevice summary: Get a Device description: | ### Get the state of a device responses: '200': $ref: '#/components/responses/readDevice' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/device_id' post: tags: - Devices operationId: printToPrinter summary: Print to Printer description: | ### Send a build to a printer > WARNING: Remotely operating machinery can be dangerous. > Please confirm that the printer is safe to use prior to using this endpoint. responses: '201': $ref: '#/components/responses/printToPrinter' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '409': $ref: '#/components/responses/conflictError' requestBody: $ref: '#/components/requestBodies/printToPrinter' /devices/{device_id}/queue: get: tags: - Devices operationId: listDeviceQueue summary: List Queued Jobs description: | ### List jobs in a device queue responses: '200': $ref: '#/components/responses/listDeviceQueue' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' post: tags: - Devices operationId: appendToDeviceQueue summary: Add Build to Queue description: | ### Add a build to the device queue responses: '201': $ref: '#/components/responses/appendToDeviceQueue' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' requestBody: $ref: '#/components/requestBodies/appendToDeviceQueue' parameters: - $ref: '#/components/parameters/device_id' /devices/{device_id}/queue/{queued_job_id}: delete: tags: - Devices operationId: removeFromDeviceQueue summary: Remove Job From Queue description: | ### Remove a job from the queue responses: '204': description: Build removed from queue # No content '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' get: tags: - Devices operationId: readDeviceQueue summary: Get Queued Job description: | ### Get job information from queue responses: '200': $ref: '#/components/responses/readDeviceQueue' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/device_id' - $ref: '#/components/parameters/queued_job_id' /job-requests/{build_id}: post: tags: - Builds operationId: sendBuildToJobRequestQueue summary: Send Build to Job Request Queue description: | ### Send a build to the Job Request Queue. This will create a printjob with a backlogged status, and return the printjob. responses: '201': $ref: '#/components/responses/sendBuildToJobRequestQueue' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/build_id' requestBody: $ref: '#/components/requestBodies/sendBuildToJobRequestQueue' delete: tags: - Builds operationId: removeBuildFromJobRequestQueue summary: Delete Build from Job Request Queue description: | ### Deletes a build's print job from the job request queue responses: '204': description: Successfully deleted printjob from job request queue. '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/build_id' /parts/{part_id}: get: tags: - Parts operationId: readPart summary: Get Part description: | ### Get a single part. responses: '200': $ref: '#/components/responses/readPart' '400': $ref: '#/components/responses/badRequestError' '500': $ref: '#/components/responses/resourceNotFoundError' parameters: - $ref: '#/components/parameters/part_id' /parts/upload_stl: post: tags: - Parts operationId: uploadStl summary: Upload a Part description: | ### Upload an STL file. ```bash $ curl --location 'https://eiger.io/api/v3/parts/upload_stl' \ --header 'Authorization: Basic ' \ --form 'stlFile=@"/Users/your.name/Downloads/theFileName.stl"' \ --form 'userId="uuid"' ``` requestBody: $ref: '#/components/requestBodies/uploadStl' responses: '201': $ref: '#/components/responses/uploadStl' '400': $ref: '#/components/responses/badRequestError' '500': $ref: '#/components/responses/resourceNotFoundError' /parts/slice_status/{slice_job_id}: get: tags: - Parts operationId: getSliceStatus summary: Get the Status of a Slice Job description: | ### STATUS TYPES: REQUESTED, QUEUED, IN_PROGRESS, CANCELED, ERROR, COMPLETED responses: '200': $ref: '#/components/responses/getSliceStatus' '400': $ref: '#/components/responses/badRequestError' '500': $ref: '#/components/responses/resourceNotFoundError' parameters: - $ref: '#/components/parameters/slice_job_id' /parts/settings_presets: get: tags: - Parts operationId: getOrgSettingsPresets summary: List Organization Settings Presets description: | responses: '200': $ref: '#/components/responses/getOrgSettingsPresets' '400': $ref: '#/components/responses/badRequestError' '500': $ref: '#/components/responses/resourceNotFoundError' /part_versions/{part_version_id}: get: tags: - Parts operationId: readPartVersion summary: Get Part Version description: | ### Get a single part version. responses: '200': $ref: '#/components/responses/readPartVersion' '400': $ref: '#/components/responses/badRequestError' '500': $ref: '#/components/responses/resourceNotFoundError' parameters: - $ref: '#/components/parameters/part_version_id' /part_versions/{part_version_id}/download: get: tags: - Parts operationId: readSignedURL summary: Get Part Version Download URL description: | ### Get the download URL for the STL file of a part version, valid for 30 seconds. responses: '200': $ref: '#/components/responses/readSignedURL' '400': $ref: '#/components/responses/badRequestError' '500': $ref: '#/components/responses/resourceNotFoundError' parameters: - $ref: '#/components/parameters/part_version_id' /print_jobs: get: tags: - Print Jobs operationId: listPrintJobs summary: List Print Jobs description: | ### List the print jobs in your organization Items are returned in reverse chronological order. responses: '200': $ref: '#/components/responses/listPrintJobs' '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/generic.page.size' - $ref: '#/components/parameters/generic.page.number' - $ref: '#/components/parameters/listPrintJobs.filter.state.eq' - $ref: '#/components/parameters/listPrintJobs.filter.state.ne' - $ref: '#/components/parameters/generic.filter.created_at.lt' - $ref: '#/components/parameters/generic.filter.created_at.le' - $ref: '#/components/parameters/generic.filter.created_at.gt' - $ref: '#/components/parameters/generic.filter.created_at.ge' - $ref: '#/components/parameters/generic.filter.started_at.lt' - $ref: '#/components/parameters/generic.filter.started_at.le' - $ref: '#/components/parameters/generic.filter.started_at.gt' - $ref: '#/components/parameters/generic.filter.started_at.ge' - $ref: '#/components/parameters/generic.filter.ended_at.lt' - $ref: '#/components/parameters/generic.filter.ended_at.le' - $ref: '#/components/parameters/generic.filter.ended_at.gt' - $ref: '#/components/parameters/generic.filter.ended_at.ge' - $ref: '#/components/parameters/generic.filter.updated_at.lt' - $ref: '#/components/parameters/generic.filter.updated_at.le' - $ref: '#/components/parameters/generic.filter.updated_at.gt' - $ref: '#/components/parameters/generic.filter.updated_at.ge' - $ref: '#/components/parameters/generic.filter.build.eq' - $ref: '#/components/parameters/generic.filter.device.eq' - $ref: '#/components/parameters/generic.sort.order.desc' - $ref: '#/components/parameters/listPrintJobs.sort.by' /print_jobs/{print_job_id}: get: tags: - Print Jobs operationId: readPrintJob summary: Get Print Job description: | ### Get a single print job responses: '200': $ref: '#/components/responses/readPrintJob' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/print_job_id' /print_jobs/{print_job_id}/scan_report: get: tags: - Print Jobs operationId: getPrintJobPartScanReport summary: Get Print Job Scan Reports description: | ### Get all URLs to download the scan reports for printed parts associated with a print job A null value will be returned for any scan reports that haven't been generated yet. responses: '200': $ref: '#/components/responses/getPrintJobPartScanReport' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/print_job_id' /printed_parts: get: tags: - Parts operationId: listPrintedParts summary: List Printed Parts description: | ### Get all Printed Parts in an organization. Items are returned sorted by printed_at in reverse chronological order. responses: '200': $ref: '#/components/responses/listPrintedParts' '401': $ref: '#/components/responses/unauthorizedError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/listPrintedParts.sort.by' - $ref: '#/components/parameters/generic.sort.order.desc' - $ref: '#/components/parameters/generic.page.size' - $ref: '#/components/parameters/generic.page.number' - $ref: '#/components/parameters/listPrintedParts.filter.state.eq' - $ref: '#/components/parameters/listPrintedParts.filter.state.ne' - $ref: '#/components/parameters/listPrintedParts.filter.notes.eq' - $ref: '#/components/parameters/listPrintedParts.filter.notes.ne' /printed_parts/{printed_part_id}: get: tags: - Parts operationId: readPrintedPart summary: Get Printed Part description: | ### Get a single printed part responses: '200': $ref: '#/components/responses/readPrintedPart' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/printed_part_id' /printed_parts/{printed_part_id}/scan_report: get: tags: - Parts operationId: getPrintedPartScanReport summary: Get a Printed Part's Scan Report description: | ### Get the URL to download the scan report for a printed part A null value will be returned if the scan report hasn't been generated yet. responses: '200': $ref: '#/components/responses/getPrintedPartScanReport' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/printed_part_id' /users: get: tags: - Users operationId: listUsers summary: List Users description: | ### List all users in organization responses: '200': $ref: '#/components/responses/listUsers' '400': $ref: '#/components/responses/badRequestError' '401': $ref: '#/components/responses/unauthorizedError' '404': $ref: '#/components/responses/resourceNotFoundError' '500': $ref: '#/components/responses/serverError' parameters: - $ref: '#/components/parameters/generic.filter.name.eq' - $ref: '#/components/parameters/listUsers.filter.email.eq' - $ref: '#/components/parameters/generic.filter.created_at.le' - $ref: '#/components/parameters/generic.filter.created_at.lt' - $ref: '#/components/parameters/generic.filter.created_at.gt' - $ref: '#/components/parameters/generic.filter.created_at.ge' - $ref: '#/components/parameters/generic.filter.updated_at.le' - $ref: '#/components/parameters/generic.filter.updated_at.lt' - $ref: '#/components/parameters/generic.filter.updated_at.gt' - $ref: '#/components/parameters/generic.filter.updated_at.ge' - $ref: '#/components/parameters/generic.sort.order.asc' - $ref: '#/components/parameters/listUsers.sort.by' - $ref: '#/components/parameters/generic.page.number' - $ref: '#/components/parameters/generic.page.size' components: securitySchemes: basic: type: http scheme: basic schemas: ## Views BuildView: description: Build type: object properties: id: description: Build Identifier type: string format: uuid title: description: Build Title type: string created_at: description: Date/Time the Build was Created type: string format: date-time nullable: true updated_at: description: Date/Time the Build was Last Updated type: string format: date-time nullable: true part_count: description: Number of Parts type: integer preview_url: description: A preview url of the Build valid for one hour. type: string device_series: $ref: '#/components/schemas/DeviceSeriesEnum' primary_material: description: Primary Material type: string secondary_material: description: Secondary Material type: string ccs_primary_required: description: Amount of the Primary Material Required (cm³) type: number nullable: true ccs_secondary_required: description: Amount of the Secondary Material Required (cm³) type: number nullable: true ccs_tertiary_required: description: Amount of the Tertiary Material Required (cm³) type: number nullable: true estimated_print_seconds: description: Estimated time to print (seconds) type: number nullable: true sliced: description: Has the build been sliced? type: boolean blacksmith_enabled: description: Is the build enabled for Inspection scanning? type: boolean approved: description: Describes if the Build is approved to be printed type: boolean nullable: true required: - id - title - created_at - updated_at - part_count - device_series - primary_material - secondary_material - ccs_primary_required - ccs_secondary_required - ccs_tertiary_required - estimated_print_seconds - sliced - blacksmith_enabled - approved BuildViewExtended: allOf: - $ref: '#/components/schemas/BuildView' - type: object properties: part_versions: type: array items: $ref: '#/components/schemas/PartVersionView' poses: type: array items: $ref: '#/components/schemas/PoseView' required: - part_versions - poses DeviceView: type: object properties: id: description: ID of the device type: string format: uuid name: type: string description: Name of the device device_type: oneOf: - type: string enum: - Unknown - $ref: '#/components/schemas/PrinterTypeEnum' device_series: $ref: '#/components/schemas/DeviceSeriesEnum' created_at: type: string format: date-time description: Time the printer was created nullable: true updated_at: type: string format: date-time description: Time the printer was last updated nullable: true queue_estimated_time_seconds: type: number format: float minimum: 0 description: Total time estimate to print every print job in the printer's queue in seconds nullable: true queue_length: type: integer minimum: 0 description: Number of print jobs in the printer's queue nullable: true loaded_primary_material: type: string nullable: true description: Name of the material loaded in the primary hot end loaded_secondary_material: type: string nullable: true description: Name of the material loaded in the secondary hot end ccs_primary_remaining: type: number format: float nullable: true description: Cubic Centimeters of primary material remaining ccs_secondary_remaining: type: number format: float nullable: true description: Cubic Centimeters of secondary material remaining state: $ref: '#/components/schemas/PrinterStateEnum' required: - id - name - device_type - device_series - created_at - updated_at - queue_estimated_time_seconds - queue_length DeviceViewExtended: allOf: - $ref: '#/components/schemas/DeviceView' - type: object properties: active_job: allOf: - $ref: '#/components/schemas/PrintJobView' - $ref: '#/components/schemas/DeviceStatusView' - type: object properties: build: $ref: '#/components/schemas/BuildView' required: - build DeviceStatusView: type: object properties: printing_state: $ref: '#/components/schemas/PrintingStateEnum' current_layer: description: | Current layer number type: integer minimum: 1 nullable: true layer_count: description: | Number of layers type: integer minimum: 1 nullable: true progress: description: | Percentage of completion for print job type: number format: float minimum: 0 maximum: 100 nullable: true estimated_seconds_remaining: description: | Estimated time left in print job in seconds type: integer minimum: 0 nullable: true PartView: type: object properties: id: type: string format: uuid created_at: type: string format: date-time nullable: true updated_at: type: string format: date-time nullable: true cloned_from: type: string format: uuid nullable: true latest_partversion: type: string format: uuid nullable: true part_versions: type: array items: type: string format: uuid required: - id - created_at - updated_at - cloned_from - latest_partversion - part_versions PartVersionView: type: object properties: id: type: string format: uuid part_id: type: string format: uuid title: type: string description: type: string nullable: true version_number: type: number preview_url: type: string sliced: type: boolean device_series: type: string primary_material: type: string secondary_material: type: string settings: type: object properties: scale: type: number euler: type: object properties: x: type: number y: type: number z: type: number units: type: string required: - id - part_id - title - description - version_number - sliced PoseView: type: object properties: id: type: string format: uuid x: type: integer y: type: integer theta: type: integer PrintedPartView: type: object properties: id: type: string format: uuid state: $ref: '#/components/schemas/PrintedPartViewStateEnum' nullable: true notes: type: string nullable: true printed_at: type: string format: date-time nullable: true updated_at: type: string format: date-time nullable: true required: - id - state - printed_at - updated_at PrintedPartViewExtended: allOf: - $ref: '#/components/schemas/PrintedPartView' - type: object properties: print_job: allOf: - $ref: '#/components/schemas/PrintJobView' - type: object properties: build: $ref: '#/components/schemas/BuildView' required: - build required: - print_job PrintJobView: type: object properties: id: description: | ID of the print job type: string format: uuid state: $ref: '#/components/schemas/PrintJobStateEnum' queued_at: description: | This when the print job was queued to the device type: string format: date-time nullable: true created_at: description: | This when the print job was first created type: string format: date-time nullable: true started_at: description: | Time when the print job started on the devices. In most cases, this is the same value as created_at. type: string format: date-time nullable: true updated_at: description: | The last time the print job's status was updated type: string format: date-time nullable: true ended_at: description: | Time when the print job ended type: string format: date-time nullable: true required: - id - state - created_at - queued_at - started_at - updated_at - ended_at PrintJobViewExtended: allOf: - $ref: '#/components/schemas/PrintJobView' - $ref: '#/components/schemas/DeviceStatusView' - type: object properties: build: $ref: '#/components/schemas/BuildView' device: $ref: '#/components/schemas/DeviceView' nullable: true required: - build - device QueuedPrintJobView: description: An node in the print queue type: object properties: id: description: ID of the Queued Print Job type: string format: uuid state: $ref: '#/components/schemas/QueuedPrintJobStateEnum' queued_at: description: Time the print job was created type: string format: date-time nullable: true updated_at: description: Time the queued print job was last updated type: string format: date-time nullable: true required: - id - state - queued_at - updated_at QueuedPrintJobViewExtended: allOf: - $ref: '#/components/schemas/QueuedPrintJobView' - type: object properties: build: $ref: '#/components/schemas/BuildView' required: - build UserView: type: object properties: id: description: ID of the User type: string format: uuid nullable: true name: type: string description: Name of the User nullable: true email: description: Email of the User type: string nullable: true ## Enumerations DeviceClassEnum: description: Device Class (Printer, Furnace or Wash) type: string enum: - Unknown - Printer - Furnace - Wash DeviceSeriesEnum: description: Device Series oneOf: - type: string enum: - 'Unknown' - $ref: '#/components/schemas/PrinterSeriesEnum' - $ref: '#/components/schemas/FurnaceSeriesEnum' - $ref: '#/components/schemas/WashSeriesEnum' FurnaceSeriesEnum: description: Furnace Series type: string enum: - Sinter-1 - Sinter-2 FurnaceStateEnum: type: string enum: - Unknown - Offline - Ready - Running Job - Finished - Disabled - Busy - Updating - Running Utility - Canceled Job - Downloading - System Cooldown - Setup Workflow - System Precheck PrintedPartViewStateEnum: description: State of a printed part instance type: string enum: - Unknown - Printing - Print Failed - Printed - Washing - Washed - Drying - Dried - Sintering - Sintered - Sinter Failed - Wash Aborted - Discarded PrinterTypeEnum: description: Model name of the printer type: string enum: - Mark One - Mark Two - Onyx One - Onyx Pro - X3 - X5 - X7 - Metal X - FX20 PrinterSeriesEnum: description: Printer Series type: string enum: - Mark One - Desktop Series - Industrial Series - Metal X - FX20 PrintingStateEnum: description: State of the print job on the device type: string enum: - Downloading - Heating - Printing - Scanning - Cooling Down - Performing Automatic Changeover - Stabilizing Build Chamber - Unknown PrinterStateEnum: type: string enum: - Unknown - Offline - Disabled - Ready - Printing - Print Finished - Canceling - Print Bed Needs Clearing - Configuration in Progress - Pausing - Print Paused - Resuming Print - Low on Material - Out of Material - Purge Strip Removal Needed - Update in Progress - Dislocation Error - Bed Needs Leveling - Incompatible Print File - Fiber Jam - Material Jam - Vacuum Not Engaged - Print Failure Detected - Update Required On Device - Custom Branch In Use - Running Utility - Utility Finished - User Action Required PrintJobStateEnum: description: State of the print job type: string enum: - Completed - Canceled - Failed - Paused - Printing - Backlogged - Unknown QueuedPrintJobStateEnum: type: string enum: - Queued - Removed - Started - Unknown WashSeriesEnum: description: Wash series type: string enum: - Wash-1 ## Requests AppendToDeviceQueueRequest: type: object properties: build: description: ID of build to append to queue type: string format: uuid required: - build additionalProperties: false ApproveBuildsRequest: type: object properties: builds: description: IDs of builds to approve type: array items: type: string format: uuid required: - builds additionalProperties: false PrintToPrinterRequest: type: object properties: build: description: ID of build to print type: string format: uuid required: - build additionalProperties: false SendBuildToBacklogRequest: type: object properties: dueDate: description: Target date to print type: string format: date additionalProperties: false RemoveBuildFromBacklogRequest: type: object properties: dueDate: description: Target date to print type: string format: date additionalProperties: false OrgSettingsPresetsResponse: type: array items: type: object required: - title - id properties: title: description: The Settings Preset title. type: string id: description: The Settings Preset id. type: string format: uuid UploadStlRequest: type: object properties: stlFile: type: string format: file-path folderId: description: Folder upload destination. Defaults to the Library. type: string format: uuid settingsPresetId: description: Settings Preset for the part. Defaults to Markforged Smart Settings. type: string format: uuid userId: description: The part owner. Defaults to organization owner. type: string format: uuid # solidMetadata: # type: object # description: | # An object with unique field id(s) as the key and its value. # Example: `{ 'fieldIdA': 'value', 'fieldIdB': 'value' }` # properties: # fieldId: # type: string # fieldValue: # type: string required: - stlFile ## Responses AppendToDeviceQueueResponse: $ref: '#/components/schemas/QueuedPrintJobView' ListApprovedBuildsResponse: type: object properties: has_more_items: description: Are there more items available on the next page? type: boolean items: type: array items: $ref: '#/components/schemas/BuildView' required: - has_more_items - items ListBuildsResponse: type: object properties: has_more_items: description: Are there more items available on the next page? type: boolean items: type: array items: $ref: '#/components/schemas/BuildView' required: - has_more_items - items ListDeviceQueueResponse: type: object properties: device: allOf: - $ref: '#/components/schemas/DeviceViewExtended' queue: type: array items: $ref: '#/components/schemas/QueuedPrintJobViewExtended' required: - device - queue ListDevicesResponse: type: object properties: has_more_items: description: Are there more items available on the next page? type: boolean items: type: array items: $ref: '#/components/schemas/DeviceViewExtended' required: - has_more_items - items additionalProperties: false ListUsersResponse: type: object properties: has_more_items: description: Are there more items available on the next page? type: boolean items: type: array items: $ref: '#/components/schemas/UserView' required: - has_more_items - items additionalProperties: false ListPrintJobsResponse: type: object properties: has_more_items: description: Are there more items available on the next page? type: boolean items: type: array items: $ref: '#/components/schemas/PrintJobViewExtended' required: - has_more_items - items additionalProperties: false ListPrintedPartsResponse: type: object properties: has_more_items: description: Are there more items available on the next page? type: boolean items: type: array items: $ref: '#/components/schemas/PrintedPartViewExtended' required: - has_more_items - items PrintToPrinterResponse: $ref: '#/components/schemas/PrintJobView' ReadBuildResponse: $ref: '#/components/schemas/BuildViewExtended' ReadDeviceResponse: $ref: '#/components/schemas/DeviceViewExtended' ReadDeviceQueueResponse: anyOf: - $ref: '#/components/schemas/QueuedPrintJobViewExtended' - $ref: '#/components/schemas/QueuedPrintJobView' ReadPartResponse: $ref: '#/components/schemas/PartView' SliceStatusResponse: type: object properties: status: type: string ReadPartVersionResponse: $ref: '#/components/schemas/PartVersionView' ReadPrintJobResponse: $ref: '#/components/schemas/PrintJobViewExtended' GetPrintJobPartScanReportResponse: type: array items: type: object required: - printed_part_id - scan_report_url properties: printed_part_id: description: The printed part ID type: string format: uuid scan_report_url: description: | The URL to download the Inspection report. This URL will be valid for approximately one hour. If the URL is `null`, the Inspection report hasn't been generated for the printed part. You can request that the report be generated by using the `api/v3/printed_parts/:printed_part_id/scan_report` endpoint. type: string nullable: true ReadPrintedPartResponse: $ref: '#/components/schemas/PrintedPartViewExtended' ReadSignedURLResponse: type: object properties: url: type: string SendBuildToBacklogResponse: $ref: '#/components/schemas/PrintJobView' RemoveBuildFromBacklogResponse: $ref: '#/components/schemas/PrintJobView' GetPrintedPartScanReportResponse: type: object properties: scan_report_url: type: string nullable: true required: - scan_report_url UploadStlResponse: type: object properties: slice_job_id: type: string format: uuid part_version_id: type: string format: uuid ## Misc Error: type: object properties: message: type: string description: Message describing to developer what went wrong required: - message additionalProperties: false parameters: ## Query parameters # generic generic.filter.approved.eq: description: | Limit the list to items that have been approved. name: filter[approved][eq] in: query required: false schema: type: boolean nullable: true generic.filter.approved.ne: description: | Limit the list to items that have been approved. name: filter[approved][ne] in: query required: false schema: type: boolean nullable: true generic.filter.blacksmith_enabled.eq: description: | Limit the list to items that have been enabled for Inspection scan. name: filter[blacksmith_enabled][eq] in: query required: false schema: type: boolean generic.filter.build.eq: description: | Limit the list to items with the specified build ID (UUID). name: filter[build][eq] in: query required: false schema: type: string format: uuid generic.filter.created_at.lt: description: | Limit the list to items created before *date*. name: filter[created_at][lt] in: query required: false schema: type: string format: date-time generic.filter.created_at.le: description: | Limit the list to items created before or on *date*. name: filter[created_at][le] in: query required: false schema: type: string format: date-time generic.filter.created_at.gt: description: | Limit the list to items created after *date*. name: filter[created_at][gt] in: query required: false schema: type: string format: date-time generic.filter.created_at.ge: description: | Limit the list to items created after or on *date*. name: filter[created_at][ge] in: query required: false schema: type: string format: date-time generic.filter.device.eq: description: | Limit the list to items with the specified device ID (UUID). name: filter[device][eq] in: query required: false schema: type: string format: uuid generic.filter.ended_at.lt: description: | Limit the list to items that ended before *date*. name: filter[ended_at][lt] in: query required: false schema: type: string format: date-time generic.filter.ended_at.le: description: | Limit the list to items that ended before or on *date*. name: filter[ended_at][le] in: query required: false schema: type: string format: date-time generic.filter.ended_at.gt: description: | Limit the list to items that ended after *date*. name: filter[ended_at][gt] in: query required: false schema: type: string format: date-time generic.filter.ended_at.ge: description: | Limit the list to items that ended after or on *date*. name: filter[ended_at][ge] in: query required: false schema: type: string format: date-time generic.filter.name.eq: description: | Limit the list to tiems that have the specified name name: filter[name][eq] in: query required: false schema: type: string generic.filter.part_count.eq: description: | Limit the list to items that have the specified number of parts. name: filter[part_count][eq] in: query required: false schema: type: integer minimum: 1 generic.filter.part_count.ne: description: | Limit the list to items that do not have the specified number of parts. name: filter[part_count][ne] in: query required: false schema: type: integer minimum: 1 generic.filter.part_count.lt: description: | Limit the list to items that have less than the specified number of parts. name: filter[part_count][lt] in: query required: false schema: type: integer minimum: 1 generic.filter.part_count.le: description: | Limit the list to items that have less than or equal to the specified number of parts. name: filter[part_count][le] in: query required: false schema: type: integer minimum: 1 generic.filter.part_count.gt: description: | Limit the list to items that have greater than the specified number of parts. name: filter[part_count][gt] in: query required: false schema: type: integer minimum: 1 generic.filter.part_count.ge: description: | Limit the list to items that have greater than or equal to the specified number of parts. name: filter[part_count][ge] in: query required: false schema: type: integer minimum: 1 generic.filter.sliced.eq: description: | Limit the list to items that have been sliced. name: filter[sliced][eq] in: query required: false schema: type: boolean generic.filter.started_at.lt: description: | Limit the list to items that started before *date*. name: filter[started_at][lt] in: query required: false schema: type: string format: date-time generic.filter.started_at.le: description: | Limit the list to items that started before or on *date*. name: filter[started_at][le] in: query required: false schema: type: string format: date-time generic.filter.started_at.gt: description: | Limit the list to items that started after *date*. name: filter[started_at][gt] in: query required: false schema: type: string format: date-time generic.filter.started_at.ge: description: | Limit the list to items that started after or on *date*. name: filter[started_at][ge] in: query required: false schema: type: string format: date-time generic.filter.title.eq: description: | Limit the list to items with the specified title. name: filter[title][eq] in: query required: false schema: type: string generic.filter.updated_at.lt: description: | Limit the list to items that updated before *date*. name: filter[updated_at][lt] in: query required: false schema: type: string format: date-time generic.filter.updated_at.le: description: | Limit the list to items that updated before or on *date*. name: filter[updated_at][le] in: query required: false schema: type: string format: date-time generic.filter.updated_at.gt: description: | Limit the list to items that updated after *date*. name: filter[updated_at][gt] in: query required: false schema: type: string format: date-time generic.filter.updated_at.ge: description: | Limit the list to items that updated after or on *date*. name: filter[updated_at][ge] in: query required: false schema: type: string format: date-time generic.page.size: description: | The number of items to return on each page (between 1 and 1000, defaults to 100). Items are returned in pages, where the number of items in a page are determined by the `page[size]` parameter, and the `page[number]` parameter determines which page is returned. name: page[size] in: query required: false schema: type: integer maximum: 1000 minimum: 1 default: 100 generic.page.number: description: | The number of the page to return. (defaults to 1) Items are returned in pages, where the number of items in a page are determined by the `page[size]` parameter, and the `page[number]` parameter determines which page is returned. name: page[number] in: query required: false schema: type: integer minimum: 1 default: 1 generic.sort.order.asc: description: | The direction to sort items, 'asc' (ascending) or 'desc' (descending). If you don't specify a sort order, the default order is asc (ascending). name: sort[order] in: query required: false schema: type: string enum: - asc - desc default: asc generic.sort.order.desc: description: | The direction to sort items, 'asc' (ascending) or 'desc' (descending). If you don't specify a sort order, the default order is descending (descending). name: sort[order] in: query required: false schema: type: string enum: - asc - desc default: desc # listBuildJobs listBuilds.sort.by: description: Sort the list name: sort[by] in: query required: false schema: type: string enum: - created_at - title default: created_at # listDevices listDevices.sort.by: description: Sort the list name: sort[by] in: query required: false schema: type: string enum: - name - created_at - updated_at default: name # listUsers listUsers.sort.by: description: Sort the list name: sort[by] in: query required: false schema: type: string enum: - name - email - created_at default: name listUsers.filter.email.eq: description: | Limit the list to items that have the specified email name: filter[email][eq] in: query required: false schema: type: string # listPrintJobs listPrintJobs.filter.state.eq: description: | Limit the list of print jobs to only items with the specified *state* name: filter[state][eq] in: query required: false schema: $ref: '#/components/schemas/PrintJobStateEnum' listPrintJobs.filter.state.ne: description: | Limit the list of print jobs to exclude items with the specified *state* name: filter[state][ne] in: query required: false schema: $ref: '#/components/schemas/PrintJobStateEnum' listPrintJobs.sort.by: description: Sort the list name: sort[by] in: query required: false schema: type: string enum: - created_at - started_at - updated_at - ended_at default: created_at # listPrintedParts listPrintedParts.sort.by: description: Sort the list name: sort[by] in: query required: false schema: type: string enum: - printed_at - updated_at default: printed_at listPrintedParts.filter.state.eq: description: | Limit the list of printed parts to only items with the specified *state* name: filter[state][eq] in: query required: false schema: $ref: '#/components/schemas/PrintedPartViewStateEnum' listPrintedParts.filter.state.ne: description: | Limit the list of printed parts to exclude items with the specified *state* name: filter[state][ne] in: query required: false schema: $ref: '#/components/schemas/PrintedPartViewStateEnum' listPrintedParts.filter.notes.eq: description: | Limit the list of printed parts to only items with the specified *notes* name: filter[notes][eq] in: query required: false schema: type: string maxLength: 255 listPrintedParts.filter.notes.ne: description: | Limit the list of printed parts to exclude items with the specified *notes* name: filter[notes][ne] in: query required: false schema: type: string maxLength: 255 ## Path parameters build_id: name: build_id in: path description: Build ID required: true schema: type: string format: uuid device_id: name: device_id in: path description: Device ID required: true schema: type: string format: uuid part_id: name: part_id in: path description: Part ID required: true schema: type: string format: uuid part_version_id: name: part_version_id in: path description: Part Version ID required: true schema: type: string format: uuid print_job_id: name: print_job_id in: path description: Print Job ID required: true schema: type: string format: uuid queued_job_id: name: queued_job_id in: path description: Queued build ID required: true schema: type: string format: uuid printed_part_id: name: printed_part_id in: path description: Printed Part ID required: true schema: type: string format: uuid slice_job_id: name: slice_job_id in: path description: Slice Job ID required: true schema: type: string format: uuid requestBodies: appendToDeviceQueue: content: application/json: schema: $ref: '#/components/schemas/AppendToDeviceQueueRequest' approveBuilds: content: application/json: schema: $ref: '#/components/schemas/ApproveBuildsRequest' printToPrinter: content: application/json: schema: $ref: '#/components/schemas/PrintToPrinterRequest' sendBuildToJobRequestQueue: content: application/json: schema: $ref: '#/components/schemas/SendBuildToBacklogRequest' sendBuildToBacklog: content: application/json: schema: $ref: '#/components/schemas/SendBuildToBacklogRequest' uploadStl: content: multipart/form-data: schema: $ref: '#/components/schemas/UploadStlRequest' responses: badRequestError: description: Parameter or payload input for the request was invalid. headers: X-Reference-ID: schema: type: integer description: An identifier of the error instance that can be used for Markforged support. content: application/json: schema: $ref: '#/components/schemas/Error' unauthorizedError: description: Authentication information is missing or invalid. headers: X-Reference-ID: schema: type: integer description: An identifier of the error instance that can be used for Markforged support. content: application/json: schema: $ref: '#/components/schemas/Error' conflictError: description: Request could not be completed because there is a conflicting action being performed on the resource. headers: X-Reference-ID: schema: type: integer description: An identifier of the error instance that can be used for Markforged support. content: application/json: schema: $ref: '#/components/schemas/Error' resourceNotFoundError: description: The requested resource does not or exist or cannot be found. headers: X-Reference-ID: schema: type: integer description: An identifier of the error instance that can be used for Markforged support. content: application/json: schema: $ref: '#/components/schemas/Error' serverError: description: The server failed to process the request. headers: X-Reference-ID: schema: type: integer description: An identifier of the error instance that can be used for Markforged support. content: application/json: schema: $ref: '#/components/schemas/Error' ## backlog sendBuildToJobRequestQueue: description: Send a build to the Job Request Queue. content: application/json: schema: $ref: '#/components/schemas/SendBuildToBacklogResponse' sendBuildToBacklog: description: Send a build to the backlog. content: application/json: schema: $ref: '#/components/schemas/SendBuildToBacklogResponse' ## builds listBuilds: description: A list of builds. content: application/json: schema: $ref: '#/components/schemas/ListBuildsResponse' readBuild: description: A single build. content: application/json: schema: $ref: '#/components/schemas/ReadBuildResponse' listApprovedBuilds: description: A list of approved builds. content: application/json: schema: $ref: '#/components/schemas/ListApprovedBuildsResponse' ## devices listDevices: description: A list of devices. content: application/json: schema: $ref: '#/components/schemas/ListDevicesResponse' readDevice: description: A single device. content: application/json: schema: $ref: '#/components/schemas/ReadDeviceResponse' printToPrinter: description: | Build sent to printer. NOTE: This is an "asynchronous request". It will respond with a success without checking that the printer successfully accepted the print job. You will need to monitor the state of the Printer or PrintJob to confirm success. content: application/json: schema: $ref: '#/components/schemas/PrintToPrinterResponse' listDeviceQueue: description: List of queued jobs. content: application/json: schema: $ref: '#/components/schemas/ListDeviceQueueResponse' appendToDeviceQueue: description: A single queued job. content: application/json: schema: $ref: '#/components/schemas/AppendToDeviceQueueResponse' readDeviceQueue: description: A single queued job. content: application/json: schema: $ref: '#/components/schemas/ReadDeviceQueueResponse' listPrintJobs: description: A list of print jobs. content: application/json: schema: $ref: '#/components/schemas/ListPrintJobsResponse' readPrintJob: description: A single build. content: application/json: schema: $ref: '#/components/schemas/ReadPrintJobResponse' getPrintJobPartScanReport: description: A list of Inspection report urls. content: application/json: schema: $ref: '#/components/schemas/GetPrintJobPartScanReportResponse' ## parts readPart: description: A single part. content: application/json: schema: $ref: '#/components/schemas/ReadPartResponse' uploadStl: description: The slice job id and part id. content: application/json: schema: $ref: '#/components/schemas/UploadStlResponse' getSliceStatus: description: The status of a slice job. content: application/json: schema: $ref: '#/components/schemas/SliceStatusResponse' getOrgSettingsPresets: description: The Settings Presets of an organization. content: application/json: schema: $ref: '#/components/schemas/OrgSettingsPresetsResponse' # part versions readPartVersion: description: A single part version. content: application/json: schema: $ref: '#/components/schemas/ReadPartVersionResponse' readSignedURL: description: URL to download STL file. content: application/json: schema: $ref: '#/components/schemas/ReadSignedURLResponse' ## printed parts listPrintedParts: description: All printed parts in an organization. content: application/json: schema: $ref: '#/components/schemas/ListPrintedPartsResponse' readPrintedPart: description: A single printed part. content: application/json: schema: $ref: '#/components/schemas/ReadPrintedPartResponse' getPrintedPartScanReport: description: Return URL to download scan report headers: Location: schema: $ref: '#/components/schemas/GetPrintedPartScanReportResponse' # users listUsers: description: A list of users. content: application/json: schema: $ref: '#/components/schemas/ListUsersResponse'