Printables API — Search 3D Models by Keyword
Documentation menu
FetchLayer FetchLayer API

Search models by keyword

Search public Printables models by keyword or phrase. Filter by category, licence, material, printer, design tool, nozzle size, price, print time, finished weight, filament use, featured and contest-winning status, and publication date, then page through the results with a cursor. Every id-shaped filter here takes an id from /filter-values, not a name.

POST /search-models Models
https://api.fetchlayer.dev/printables/search-models
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

query string required

Keyword or phrase to search Printables models for.

sort string optional

best_match, latest, popular, rating, or makes_count. (default: best_match)

licenseIds string[] optional

Restrict to these licences, by id (max 20). Ids come from /filter-values.

printerIds number[] optional

Restrict to models with sliced files for these printers, by id (max 20). There are 639 printer ids — read them from /filter-values.

modelingAppIds string[] optional

Restrict to models made with these design tools, by id (max 20). Ids come from /filter-values.

nozzleDiameters number[] optional

Restrict to sliced files for these nozzle sizes in millimetres, for example 0.4 (max 10).

fileKinds string[] optional

Which ready-to-print files a model must carry: GCODE, SLA, or NONE.

printDuration object optional

Print time range in hours, as { from, to }.

weight object optional

Finished weight range in grams, as { from, to }.

usedMaterial object optional

Filament used range in grams, as { from, to }.

publishedWithinDays number optional

Only models published in the last N days (max 3650).

categoryId string optional

Restrict to one category, by id. Ids come from /filter-values.

materialIds number[] optional

Restrict to models for these materials, by id (max 20). Ids come from /filter-values.

price string optional

all, paid, or free. (default: all)

featured boolean optional

Only models Printables has featured.

hasMake boolean optional

Only models somebody has posted a printed copy of.

aiGenerated boolean optional

Filter on whether the model was AI generated.

contestWinnersOnly boolean optional

Only models that placed in a contest.

limit number optional

Maximum models returned (max 2000), or -1 for everything available. (default: 30)

pages number optional

Pages of results to collect in one request (max 100), or -1 for the maximum allowed.

cursor string optional

Resume from a previous response's nextCursor.

delayMs number optional

Milliseconds to wait between pages (max 30000).

format string optional

json, or markdown to get the result rendered as text. (default: json)

timeoutMs number optional

Per-request time limit in milliseconds (max 600000).

Response Fields

search-models

Search models by keyword

filters object

The filters this search actually ran with, after defaults were resolved.

totalMatches number | null

Models matching the query across all of Printables, before paging.

models object[]

The matching models.

models[].id string

Model id — the handle for /model-detail.

models[].name string | null

Model title as published.

models[].url string

Public Printables permalink for the model.

models[].publishedAt string | null

When the current version was published.

models[].firstPublishedAt string | null

When the model first went public, which can predate publishedAt.

models[].category object

Category the designer filed it under, with its id and name.

models[].designer object

Designer id, handle, display name, profile URL, avatar, verification and company flag.

models[].image object

Cover image, with its absolute URL and dimensions. The full gallery is on /model-detail.

models[].stats object

Downloads, likes, views, makes, comments, rating average and count, collections, file and image counts.

models[].price number | null

Store price, or null for a free model.

models[].clubExclusive boolean

True when the model sits behind a paid membership.

models[].latestContestPlacement object

Most recent contest placing, when the model has one.

modelCount number

Models in this response.

pagesScraped number

Pages actually collected. Each page counts as one request against your plan.

nextCursor string | null

Pass back as cursor to continue, or null when the listing is exhausted.

hasNextPage boolean

Whether more results are available beyond this response.

notes string[]

Caveats about this specific result — a truncated walk, a listing that may be incomplete, an upstream limit. Read it before treating a result set as complete.

requestedUrl string

The Printables page this result corresponds to.

scrapedAt string

ISO 8601 timestamp of when the data was collected.

resultType string

Which shape this response is, e.g. model-search or contest-detail.

blocked boolean

Always false on a successful response.

Request

curl -X POST "https://api.fetchlayer.dev/printables/search-models" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"cable management","sort":"popular","price":"free","hasMake":true,"limit":30}'

Response

{
  "resultType": "model-search",
  "totalMatches": 1842,
  "modelCount": 30,
  "pagesScraped": 1,
  "hasNextPage": true,
  "notes": [],
  "models": [
    {
      "id": "512345",
      "name": "Under-desk cable tray",
      "url": "https://www.printables.com/model/512345-under-desk-cable-tray",
      "designer": {
        "id": "90210",
        "handle": "printsmith",
        "displayName": "PrintSmith"
      },
      "stats": {
        "downloads": 41280,
        "likes": 1832,
        "makes": 214,
        "ratingAverage": 4.9
      },
      "price": null
    }
  ]
}