Printago API

Querying Data

Filter, sort, paginate, and shape API responses using query parameters or the POST search endpoint.

Overview

There are two ways to query data from the Printago API:

GET with query params
Simple filtering via URL query parameters, e.g. GET /v1/parts?status=pending
POST /search
Advanced filtering with a JSON body, supporting AND/OR logic, e.g. POST /v1/parts/search

Filtering (Simple GET)

Add filter parameters directly to the URL. A bare field=value defaults to an equality check. You can also use the explicit field.operator=value format.

Examples
# Equality (implicit — defaults to eq)
GET /v1/parts?status=pending

# Equality (explicit)
GET /v1/parts?status.eq=pending

# Contains
GET /v1/parts?name.contains=benchy

# Multiple filters (AND)
GET /v1/parts?status=pending&name.contains=benchy

# In (comma-separated)
GET /v1/orders?status.in=pending,processing

Filtering (POST Search)

For complex queries, use the POST /search endpoint with a JSON body. Each entity that supports GET listing also has a /search endpoint.

JSON Body — Simple Filter
{
  "filter": {
    "status": { "eq": "pending" },
    "name": { "contains": "benchy" }
  },
  "limit": 20,
  "offset": 0
}
JSON Body — OR Conditions
{
  "filter": {
    "OR": [
      { "status": { "eq": "pending" } },
      { "status": { "eq": "processing" } }
    ]
  }
}

Filter Operators

The following operators are available for both query-parameter and POST-body filters:

eq
any
Equal to — ?status.eq=active or just ?status=active
ne
any
Not equal to — ?status.ne=deleted
gt
number / date
Greater than — ?quantity.gt=10
gte
number / date
Greater than or equal — ?quantity.gte=10
lt
number / date
Less than — ?quantity.lt=100
lte
number / date
Less than or equal — ?quantity.lte=100
contains
string
Contains substring (case-insensitive) — ?name.contains=benchy
startsWith
string
Starts with — ?name.startsWith=PLA
endsWith
string
Ends with — ?name.endsWith=.3mf
in
array
In list — ?status.in=pending,active
notIn
array
Not in list — ?status.notIn=deleted,archived
isNull
boolean
Is null — ?folderId.isNull=true
between
array
Between two values (POST body only) — { "quantity": { "between": [10, 100] } }

Pagination

Control the number of results returned and paginate through large data sets.

limit
number
Maximum number of results to return (max 1000, default 1000)
offset
number
Number of results to skip (default 0)
meta
boolean
Set to true to include pagination metadata in the response
Example
GET /v1/parts?limit=20&offset=40&meta=true

Sorting

Sort results by one or more fields. Use :asc or :desc suffix. Multiple sort fields are comma-separated.

Examples
# Sort by creation date (newest first)
GET /v1/parts?sort=createdAt:desc

# Sort by multiple fields
GET /v1/parts?sort=status:asc,createdAt:desc

Field Selection

Request only specific fields to reduce response size. Provide a comma-separated list of field names.

Example
GET /v1/parts?fields=id,name,status

Including Relations

Load related entities in a single request using the include parameter. Supports up to 4 relations and a max nesting depth of 2 levels.

Examples
# Include a single relation
GET /v1/parts?include=folder

# Include multiple relations
GET /v1/parts?include=folder,linkedParts

# Include nested relations (dot notation)
GET /v1/parts?include=linkedParts.part

Response Format

By default, list endpoints return a plain JSON array. When meta=true, the response wraps results with pagination metadata.

Without meta (default)
[
  { "id": "abc123", "name": "Benchy", "status": "pending" },
  { "id": "def456", "name": "Calibration Cube", "status": "active" }
]
With meta=true
{
  "data": [
    { "id": "abc123", "name": "Benchy", "status": "pending" },
    { "id": "def456", "name": "Calibration Cube", "status": "active" }
  ],
  "total": 42,
  "limit": 20,
  "offset": 0
}