Creative Lab — Fidget Pixel API

Omvandla ett källfoto till en flerfärgad 3D-utskrivbar pixelkonst-fidgetbräda i två steg: prototype pixeliserar ditt foto till en pixelkonstbild, och sedan build samplar den bilden på ett 16×16- eller 32×32-rutnät och omvandlar varje pixel till en hopfogande fyrkantig eller hexagonal bit, levererad som en enda 3MF-fil vars objekt bär sina färger så att en flerfilaments-slicer skriver ut varje bit i rätt färg. De två stegen länkas via input_task_id.

  • POST /openapi/creative-lab/fidget-pixel/v1/prototype
  • POST /openapi/creative-lab/fidget-pixel/v1/build

POST/openapi/creative-lab/fidget-pixel/v1/prototype

Skapa en Fidget Pixel-prototyptask

Genererar en enda pixelkonstbild från källfotot. Det returnerade task-ID:t är det du skickar som input_task_id till build-endpointen. Anropa denna endpoint igen för ett nytt försök om resultatet inte blir vad du vill ha — varje anrop faktureras separat. Se The Fidget Pixel Prototype Task Object för svarets struktur.

Parametrar

  • Name
    image_url
    Type
    string
    Obligatorisk
    Description

    Källfoto som Meshy ska pixelisera. Vi stöder för närvarande formaten .jpg, .jpeg, .png och .webp.

    Formatet identifieras genom att avkoda bilddatan, inte utifrån URL:ens filändelse — en URL utan filändelse, eller en som omdirigerar, fungerar så länge byten avkodas till ett format som stöds. HTTP-omdirigeringar följs.

    Det finns två sätt att ange bilden:

    • Offentligt tillgänglig URL: En URL som är tillgänglig från det öppna internet.
    • Data URI: En base64-kodad data-URI av bilden. Exempel på en data-URI: data:image/jpeg;base64,<din base64-kodade bilddata>.
  • Name
    type
    Type
    string
    Obligatorisk
    Description

    Vad fotot visar. Väljer pixeliseringsstilen, så välj medvetet — de två ger märkbart olika resultat. Tillgängliga värden:

    • person — motivet är en person (porträtt eller helkropp). Genererar en chibi-stiliserad pixelsprite av motivet.
    • other — allt annat: husdjur, föremål, maskotar, logotyper, landskap. Genererar en pärlplatte-stiliserad pixelikon av motivet.
  • Name
    name
    Type
    string
    Description

    Valfritt tasknamn för visningsändamål. Maximalt 100 tecken.

Returvärden

Svarets egenskap result innehåller task-id för den nyskapade fidget pixel-prototyptasken. Fråga Get a Task-endpointen eller prenumerera på stream tills tasken når SUCCEEDED, och skicka sedan det ID:t till build-endpointen som input_task_id.

Felfall

  • Name
    400 - Bad Request
    Description

    Begäran kunde inte accepteras. Vanliga orsaker:

    • Saknad parameter: Både image_url och type krävs.
    • Ogiltig type: type måste vara person eller other.
    • Ogiltigt bildformat: Den angivna image_url har inte ett format som stöds (.jpg, .jpeg, .png, .webp).
    • Bildmått utanför tillåtet intervall: Bilden är för liten, överskrider den maximala filstorleken eller överskrider det maximala antalet pixlar.
    • Onåbar URL: image_url kunde inte hämtas (404 eller timeout).
    • Ogiltig Data URI: Base64-strängen är felaktigt formaterad.
    • Innehåll flaggat: Den angivna bilden flaggades av NSFW-moderation.
  • Name
    401 - Unauthorized
    Description

    Autentiseringen misslyckades. Kontrollera din API-nyckel.

  • Name
    402 - Payment Required
    Description

    Otillräckligt med credits för att utföra denna task, eller så tillhör API-nyckeln ett konto med gratisplan.

  • Name
    403 - Forbidden
    Description

    Den angivna bilden flaggades av moderation för immaterialrätt (Content flagged for intellectual property violation). Endast Enterprise-konton med immaterialrättsfiltrering aktiverad blockeras; ingenting debiteras.

  • Name
    429 - Too Many Requests
    Description

    Du har överskridit din hastighetsgräns.

  • Name
    500 - Internal Server Error
    Description

    Själva immaterialrättskontrollen kunde inte slutföras (Unable to perform intellectual property check, please try again). Enterprise-konton med immaterialrättsfiltrering aktiverad misslyckas restriktivt vid denna kontroll; ingenting debiteras — försök igen.

Request

POST
/openapi/creative-lab/fidget-pixel/v1/prototype
# Stage 1: pixelize the source photo
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "image_url": "<your publicly accessible image url or base64-encoded data URI>",
    "type": "person"
  }'

Response

{
  "result": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7"
}

POST/openapi/creative-lab/fidget-pixel/v1/build

Skapa en Fidget Pixel-byggtask

Genererar de 3D-utskrivbara delarna från en lyckad prototyptask. Byggprocessen samplar prototypens pixelbaserade bild till det begärda rutnätet, kvantiserar den till högst color_count färger och genererar en sammanflätande del per rutnätscell. Leveransen är en enda 3MF-fil där varje del är ett separat objekt taggat med sin färg, redo för en slicer med flera filament. Se The Fidget Pixel Build Task Object för svarets format.

Parametrar

  • Name
    input_task_id
    Type
    string
    Obligatorisk
    Description

    Task-ID för en prototyptask skapad via samma OpenAPI-endpoint. Prototypen måste ha skapats av samma Meshy-konto och måste ha nått SUCCEEDED.

    Prototyptasks som skapats via webbappen accepteras inte — byggendpointen accepterar endast prototyptasks som producerats av POST /openapi/creative-lab/fidget-pixel/v1/prototype och avvisar alla andra källor med 404.

  • Name
    name
    Type
    string
    Description

    Valfritt tasknamn för visningsändamål. Maximalt 100 tecken.

options

Valfri geometri för delarna. Varje fält har ett standardvärde — skicka endast de du vill åsidosätta. Detta är samma kontroller som Creative Lab-webbappen exponerar; pluggens höjd, kapselns skala och de andra tillverkningsförinställningarna härleds från shape och piece_size_mm och exponeras inte.

  • Name
    shape
    Type
    string
    standard square
    Description

    Fotavtryck för varje del. Tillgängliga värden:

    • square (standard) — kvadratiska delar på ett kvadratiskt rutnät.
    • hex — hexagonala delar på ett hexagonalt rutnät. Hexagonala delar finns endast i 6 och 8 mm.
  • Name
    grid_size
    Type
    integer
    standard 32
    Description

    Antal delar längs varje sida av brädan. Tillgängliga värden: 16 eller 32. Ett 32-rutnät bevarar mer detalj; ett 16-rutnät innebär färre, större delar för samma motiv.

  • Name
    piece_size_mm
    Type
    integer
    standard 8
    Description

    Kantlängd för varje del, i millimeter. Tillgängliga värden: 6, 8 eller 10. Tillsammans med grid_size bestämmer detta den utskrivna brädans storlek — till exempel 32 × 8 mm ≈ 26 cm per sida. 10 är inte tillgängligt för shape: "hex" (den sluttande hexagonala ytan skapar överhäng på de flesta konsument-FDM-skrivare).

  • Name
    color_count
    Type
    integer
    standard 8
    Description

    Maximalt antal färger i paletten som bilden kvantiseras till. Intervall: [1, 8]. Varje färg blir ett filament i din slicer.

  • Name
    piece_height_mm
    Type
    integer
    standard 15
    Description

    Höjd för varje del, i millimeter. Intervall: [10, 80].

output

Valfri väljare för överföringsformat. Standardvärdet är 3mf, vilket för närvarande är det enda värdet som stöds.

  • Name
    format
    Type
    string
    standard 3mf
    Description

    Artefakt som returneras av byggprocessen. Tillgängliga värden:

    • 3mf (standard) — returnerar en enda model.3mf under model_urls.3mf, med ett objekt per del och delens färg kopplad till varje objekt.

Returer

Svarets result-egenskap innehåller task-id för den nyligen skapade fidget pixel-byggtasken. Fråga Get a Task-endpointen eller prenumerera på strömmen tills tasken når SUCCEEDED, och ladda sedan ner artefakten från model_urls.3mf.

Felscenarier

  • Name
    400 - Bad Request
    Description

    Begäran var inte godtagbar. Vanliga orsaker:

    • Saknad parameter: input_task_id krävs.
    • Ogiltig UUID: input_task_id är inte en giltig UUID.
    • Överordnad task ej lyckad: Den refererade prototyptasken har inte nått SUCCEEDED ännu.
    • Ingen kandidat: Prototyptasken lyckades men producerade ingen pixelbaserad bild; skapa en ny prototyp.
    • Alternativ utanför intervall: Ett av fälten i options är utanför sin tillåtna uppsättning eller intervall — till exempel options.grid_size must be 16 or 32, eller options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
    • Format som inte stöds: output.format måste vara 3mf.
  • Name
    401 - Unauthorized
    Description

    Autentiseringen misslyckades. Kontrollera din API-nyckel.

  • Name
    402 - Payment Required
    Description

    Otillräckliga credits för att utföra denna task, eller så tillhör API-nyckeln ett konto med gratisplan.

  • Name
    403 - Forbidden
    Description

    Den refererade prototypens bild flaggades av moderation för immateriella rättigheter. Endast Enterprise-konton med filtrering av immateriella rättigheter aktiverad blockeras; inget debiteras.

  • Name
    404 - Not Found
    Description

    Den refererade prototyptasken finns inte, tillhör en annan användare eller skapades via webbappen (endast prototyptasks i API-mode kedjas vidare till bygge).

  • Name
    429 - Too Many Requests
    Description

    Du har överskridit din hastighetsgräns.

  • Name
    500 - Internal Server Error
    Description

    Den refererade prototypens utslag för immateriella rättigheter kunde inte fastställas (Unable to perform intellectual property check, please try again). Enterprise-konton med filtrering av immateriella rättigheter aktiverad misslyckas i stängt läge vid denna kontroll; inget debiteras — försök igen med begäran.

Request

POST
/openapi/creative-lab/fidget-pixel/v1/build
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "options": {
      "shape": "square",
      "grid_size": 32,
      "piece_size_mm": 8,
      "color_count": 8,
      "piece_height_mm": 15
    },
    "output": {
      "format": "3mf"
    }
  }'

Response

{
  "result": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98"
}

GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id

Hämta en Fidget Pixel-uppgift

Hämta en prototyp- eller bygguppgift med hjälp av ett giltigt uppgifts-id. URL-sökvägen måste matcha uppgiftens fas — en byggnadsuppgift som hämtas via /prototype/:id returnerar 404, och vice versa.

Se The Fidget Pixel Prototype Task Object och The Fidget Pixel Build Task Object för svarens format.

Parametrar

  • Name
    id
    Type
    path
    Description

    Unik identifierare för den fidget pixel-uppgift som ska hämtas.

Returer

Svaret innehåller objektet för fidget pixel-uppgiften. Formen beror på vilken fas som begärdes.

Felscenarier

  • Name
    400 - Bad Request
    Description

    id är inte ett giltigt UUID (Invalid ID).

  • Name
    403 - Forbidden
    Description

    Uppgiftens bild flaggades av moderation för immateriella rättigheter. Endast Enterprise-konton med filtrering av immateriella rättigheter aktiverad blockeras.

  • Name
    404 - Not Found
    Description

    Uppgiften finns inte, tillhör en annan användare, eller dess fas matchar inte URL-sökvägen.

  • Name
    500 - Internal Server Error
    Description

    Kontrollen av immateriella rättigheter kunde inte slutföras (Unable to perform intellectual property check, please try again); Enterprise-konton med filtrering av immateriella rättigheter aktiverad misslyckas i låst läge (fail closed). Försök igen med begäran.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Build Response

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

DELETE/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id

Ta bort en Fidget Pixel-uppgift

Avbryt en fidget pixel-uppgift. Om uppgiften fortfarande är PENDING återbetalas de credits som förbrukades vid skapandet. Uppgifter som redan är IN_PROGRESS avbryts utan återbetalning (arbetaren kan redan hålla på att förbruka resurser). Uppgifter som redan har nått ett slutgiltigt tillstånd (SUCCEEDED, FAILED, CANCELED) kan inte avbrytas.

URL-sökvägen måste matcha uppgiftens steg — DELETE/prototype/:buildId returnerar 404.

Sökvägsparametrar

  • Name
    id
    Type
    path
    Description

    Unik identifierare för fidget pixel-uppgiften som ska avbrytas.

Returnerar

Returnerar 204 No Content vid lyckad förfrågan med en tom brödtext.

Felscenarier

  • Name
    400 - Bad Request
    Description

    Förfrågan kunde inte accepteras. Vanliga orsaker:

    • Ogiltigt ID: id är inte ett giltigt UUID.
    • Slutgiltigt tillstånd: Uppgiften är redan SUCCEEDED, FAILED eller CANCELED och kan inte avbrytas.
  • Name
    404 - Not Found
    Description

    Uppgiften finns inte, tillhör en annan användare, eller dess steg matchar inte URL-sökvägen.

Request

DELETE
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// Returns 204 No Content on success (empty body).

GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id/stream

Streama en Fidget Pixel-uppgift

Streama uppdateringar i realtid för en fidget pixel-uppgift via Server-Sent Events (SSE). URL-sökvägen måste matcha uppgiftens steg — om en ström öppnas på /prototype/:buildId/stream skickas en enda event: error-payload med status_code: 404 och strömmen stängs; ett felaktigt id gör detsamma med status_code: 400 (Invalid ID).

Parametrar

  • Name
    id
    Type
    path
    Description

    Unik identifierare för den fidget pixel-uppgift som ska strömmas.

Returer

Returnerar en ström av Fidget Pixel Prototype- eller Fidget Pixel Build-uppgiftsobjekt som Server-Sent Events. Varje bildruta innehåller hela uppgiftsobjektet för steget — samma form som Get-endpointen returnerar — så medan uppgiften är PENDING eller IN_PROGRESS är utdatafälten helt enkelt inte ifyllda ännu (null, [] eller {}) och finished_at är null.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream
curl -N https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response Stream

// Error event example (wrong stage or task not found)
event: error
data: {
  "status_code": 404,
  "message": "Task not found"
}

// Message event examples illustrate task progress.
// Every frame is the full task object for the stage; fields not yet populated are null / empty.
event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "PENDING",
  "progress": 0,
  "created_at": 1757001300000,
  "started_at": null,
  "finished_at": null,
  "expires_at": 1757260500000,
  "preceding_tasks": 2,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {}
}

event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)

Lista Fidget Pixel-uppgifter

Hämta en paginerad lista över dina fidget pixel-uppgifter för ett enskilt steg. URL-sökvägen väljer steget — /prototype returnerar prototyp-uppgifter; /build returnerar byggnadsuppgifter. Uppgifter från det andra steget ingår inte i något av svaren.

Sökvägsparametrar

  • Name
    stage
    Type
    path
    Obligatorisk
    Description

    Antingen prototype eller build. Samlingen returnerar endast uppgifter vars steg matchar URL:en — att hämta /prototype returnerar aldrig byggnadsuppgifter och vice versa.

Frågeparametrar

  • Name
    page_num
    Type
    integer
    standard 1
    Description

    Sidnummer för paginering.

  • Name
    page_size
    Type
    integer
    standard 10
    Description

    Gräns för sidstorlek. Maximalt tillåtet är 100 objekt.

  • Name
    sort_by
    Type
    string
    standard -created_at
    Description

    Fält att sortera efter. Tillgängliga värden:

    • +created_at: Sortera efter skapandetid i stigande ordning.
    • -created_at: Sortera efter skapandetid i fallande ordning.

Returvärden

Returnerar en paginerad lista över uppgiftsobjektet per steg — antingen fidget pixel-prototypuppgiftsobjektet vid listning av /prototype eller fidget pixel-byggnadsuppgiftsobjektet vid listning av /build.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response (List Prototype Tasks)

[
  {
    "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "type": "creative-lab-fidget-pixel-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1757001000000,
    "started_at": 1757001005000,
    "finished_at": 1757001178000,
    "expires_at": 1757260378000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 6,
    "image_urls": [
      "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
    ]
  }
]

Fidget Pixel Prototype-uppgiftsobjektet

Fidget Pixel Prototype-uppgiftsobjektet är en arbetsenhet som Meshy håller reda på för att pixelisera ett källfoto till en pixelkonstbild. Resultatet av detta steg kedjas vidare till byggsteget via input_task_id.

Egenskaper

  • Name
    id
    Type
    string
    Description

    Unik identifierare för uppgiften. Även om vi använder ett k-sorterbart UUID för uppgifts-id som implementationsdetalj bör du inte göra några antaganden om id:ts format.

  • Name
    type
    Type
    string
    Description

    Uppgiftens typ. Värdet är creative-lab-fidget-pixel-prototype.

  • Name
    name
    Type
    string
    Description

    Uppgiftsnamnet som angavs när uppgiften skapades. Tom sträng om inget namn angavs.

  • Name
    status
    Type
    string
    Description

    Uppgiftens status. Möjliga värden är ett av PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Uppgiftens progress. Om uppgiften inte har startat ännu kommer denna egenskap att vara 0. När uppgiften har lyckats blir den 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Tidsstämpel för när uppgiften skapades, i millisekunder.

  • Name
    started_at
    Type
    timestamp
    Description

    Tidsstämpel för när uppgiften startades, i millisekunder. Om uppgiften inte har startat ännu kommer denna egenskap att vara null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Tidsstämpel för när uppgiften avslutades, i millisekunder. Om uppgiften inte är avslutad ännu kommer denna egenskap att vara null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Tidsstämpel för när uppgiftens resultat upphör att gälla, i millisekunder — 3 dagar efter att uppgiften avslutades. Enterprise-konton behåller API-resultat på obestämd tid (se Tillgångslagring); för dem sätts denna tidsstämpel till omkring 100 år framåt.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Antalet föregående uppgifter.

  • Name
    task_error
    Type
    object
    Description

    Felinformation för misslyckade uppgifter. Se Fel för den fullständiga referensen för task_error-objektet.

  • Name
    consumed_credits
    Type
    integer
    Description

    Antalet credits som förbrukats av denna uppgift. En uppgift som når SUCCEEDED debiteras hela beloppet för sitt steg. En uppgift som aldrig skapas (ett 4xx-fel vid förfrågningstillfället, inklusive en avvisning av moderation) debiteras inte alls. En uppgift som når FAILED returnerar 0 — avgiften återbetalas. Avbrytning via DELETE återbetalas endast medan uppgiften fortfarande är PENDING; en uppgift som redan är IN_PROGRESS förblir debiterad, eftersom arbetet redan har utförts.

  • Name
    image_urls
    Type
    array of strings
    Description

    Nedladdningsbara URL:er för pixelkonstbilden som genererats av denna prototypuppgift. Just nu returnerar API:et alltid exakt en bild; fältet är en array så att framtida revisioner kan visa flera kandidater utan en brytande ändring. Tomt tills uppgiften når SUCCEEDED.

    Dessa är signerade URL:er: hämta dem utan en Authorization-header. De förblir giltiga fram till expires_at, vilket är 3 dagar efter finished_at, och att läsa uppgiften igen inom detta tidsfönster returnerar samma URL istället för en nysignerad. Ladda ner och spara filerna själv innan dess — det finns inget sätt att förnya en utgången länk.

Example Fidget Pixel Prototype Task Object

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Fidget Pixel Build Task-objektet

Fidget Pixel Build Task-objektet är en arbetsenhet som Meshy håller reda på för att generera de utskrivbara delarna från ett lyckat prototyptask. Byggprocessen samplar prototypens pixel-art-bild till det begärda rutnätet och publicerar en enda färgmärkt 3MF-fil.

Egenskaper

  • Name
    id
    Type
    string
    Description

    Unik identifierare för tasket.

  • Name
    type
    Type
    string
    Description

    Typ av task. Värdet är creative-lab-fidget-pixel-build.

  • Name
    name
    Type
    string
    Description

    Tasknamnet som angavs när tasket skapades. Tom sträng om inget namn angavs.

  • Name
    status
    Type
    string
    Description

    Status för tasket. Möjliga värden är en av PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progress för tasket. Om tasket inte har startats ännu är denna egenskap 0. När tasket har lyckats blir den 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Tidsstämpel för när tasket skapades, i millisekunder.

  • Name
    started_at
    Type
    timestamp
    Description

    Tidsstämpel för när tasket startades, i millisekunder. null tills tasket startar.

  • Name
    finished_at
    Type
    timestamp
    Description

    Tidsstämpel för när tasket avslutades, i millisekunder. null tills tasket avslutas.

  • Name
    expires_at
    Type
    timestamp
    Description

    Tidsstämpel för när taskresultatet upphör att gälla, i millisekunder — 3 dagar efter att tasket avslutades. Enterprise-konton behåller API-resultat på obestämd tid (se tillgångslagring); för dem är denna tidsstämpel satt cirka 100 år framåt.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Antalet föregående tasks. Meningsfull endast när status är PENDING.

  • Name
    task_error
    Type
    object
    Description

    Felinformation för misslyckade tasks. Se Fel för den fullständiga referensen för task_error-objektet.

  • Name
    consumed_credits
    Type
    integer
    Description

    Antalet credits som förbrukats av detta task. Ett task som når SUCCEEDED debiteras hela beloppet för sitt steg. Ett task som aldrig skapas (ett 4xx-fel vid begäranstillfället, inklusive en moderation-avvisning) debiteras inte alls. Ett task som når FAILED returnerar 0 — avgiften återbetalas. Avbrytande via DELETE återbetalar endast medan tasket fortfarande är PENDING; ett task som redan är IN_PROGRESS förblir debiterat, eftersom arbetet redan har utförts.

  • Name
    model_urls
    Type
    object
    Description

    Nedladdningsbara URL:er för den genererade tillgången, sorterade efter format. Innehåller exakt en post — formatet som begärdes via build-begärans output.format. Tom tills tasket når SUCCEEDED.

    Dessa är signerade URL:er: hämta dem utan en Authorization-header. De förblir giltiga fram till expires_at, vilket är 3 dagar efter finished_at, och att läsa tasket igen inom detta fönster returnerar samma URL istället för en nysignerad. Ladda ner och spara filerna själv innan dess — det finns inget sätt att uppdatera en utgången länk.

    • Name
      3mf
      Type
      string
      Description

      Nedladdningsbar URL till 3MF-filen. Ett objekt per del, var och en märkt med sin palettfärg, så en flerfilament-slicer tilldelar filament per färg. Finns när output.format var 3mf (standardvärdet).

Example Fidget Pixel Build Task Object

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

End-to-End Example

Det fullständiga flödet: skapa en prototyp från ett foto, pollar den tills den blir SUCCEEDED, skapa en build från den, pollar builden tills den blir SUCCEEDED, och ladda sedan ner 3MF-filen från model_urls.

En prototyp blir vanligtvis klar inom några minuter; en build slutförs vanligtvis på klart mindre än en minut. I en verklig integration skulle du visa prototypens image_urls-post för slutanvändaren och låta dem bekräfta (eller köra om prototypen) innan du spenderar credits på builden.

Complete flow

POST
/openapi/creative-lab/fidget-pixel/v1
#!/usr/bin/env bash
set -euo pipefail

# Requires curl and jq. Point IMAGE_PATH at a local photo, or IMAGE_URL at a public one:
#   export MESHY_API_KEY=msy_...
#   export IMAGE_PATH=./portrait.jpg          # or: export IMAGE_URL=https://...
#   export PIXEL_TYPE=person                  # or: other
: "${MESHY_API_KEY:?export MESHY_API_KEY first}"
if [[ -z "${IMAGE_PATH:-}" && -z "${IMAGE_URL:-}" ]]; then
  echo "export IMAGE_PATH (local file) or IMAGE_URL (public url) first" >&2
  exit 1
fi
PIXEL_TYPE=${PIXEL_TYPE:-person}

BASE="https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1"
AUTH="Authorization: Bearer $MESHY_API_KEY"

# api METHOD URL [curl args...] -> prints the response body, non-zero on failure.
# Note we do not use -f/--fail: it discards the body, and the body is the only
# place the reason appears.
api() {
  local method=$1 url=$2 out http_code body
  shift 2
  out=$(curl --silent --show-error --max-time 60 --write-out $'\n%{http_code}' \
    -X "$method" "$url" -H "$AUTH" "$@") || return 1
  http_code=${out##*$'\n'}
  body=${out%$'\n'*}
  if ((http_code >= 400)); then
    echo "HTTP $http_code for $url: $body" >&2
    return 1
  fi
  printf '%s' "$body"
}

# Each task gets its own 40-minute budget.
poll() {
  local kind=$1 id=$2 delay=5 task_status deadline
  deadline=$(($(date +%s) + 2400))
  while :; do
    if (($(date +%s) >= deadline)); then
      echo "gave up waiting for $kind $id" >&2
      return 1
    fi
    task_status=$(api GET "$BASE/$kind/$id" | jq -r '.status')
    echo "$kind: $task_status"
    case "$task_status" in
    SUCCEEDED) return 0 ;;
    FAILED | CANCELED) return 1 ;;
    esac
    sleep "$delay"
    delay=$((delay * 2 > 30 ? 30 : delay * 2))
  done
}

# Build the request body in a file. A base64 data URI must never go on the
# command line or into an exported variable - a photo of any real size will
# exceed the OS argument limit.
BODY=$(mktemp)
trap 'rm -f "$BODY"' EXIT
if [[ -n "${IMAGE_PATH:-}" ]]; then
  # Declare the real type: the API accepts JPEG, PNG and WebP.
  case "$(printf '%s' "${IMAGE_PATH##*.}" | tr 'A-Z' 'a-z')" in
    png) MIME=image/png ;;
    webp) MIME=image/webp ;;
    *) MIME=image/jpeg ;;
  esac
  {
    printf '{"type":"%s","image_url":"data:%s;base64,' "$PIXEL_TYPE" "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  jq -n --arg t "$PIXEL_TYPE" --arg u "$IMAGE_URL" \
    '{type: $t, image_url: $u}' >"$BODY"
fi

# 1. Create the prototype task
PROTO_ID=$(api POST "$BASE/prototype" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 2. Wait for the pixel-art image (show image_urls[0] to a user in production)
poll prototype "$PROTO_ID"

# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)
jq -n --arg p "$PROTO_ID" \
  '{input_task_id: $p, options: {shape: "square", grid_size: 32, piece_size_mm: 8, color_count: 8, piece_height_mm: 15}, output: {format: "3mf"}}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 4. Wait for the pieces
poll build "$BUILD_ID"

# 5. Download the 3MF. This is a signed URL: no Authorization header,
#    and it stays valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o fidget-pixel.3mf "$(jq -r '.model_urls["3mf"]' <<<"$TASK")"
echo "Done: fidget-pixel.3mf"