lowpoly verrà ritirato il 30 ott 2026. Cambia modello prima di queste date per evitare errori nelle richieste. Vedi tutte le deprecazioni

Creative Lab Keycap API

Trasforma una foto in un keycap personalizzato a colori completi per una tastiera meccanica in due fasi. Un task di prototipazione genera un'immagine del keycap finito a partire dalla foto. Un task di build trasforma quell'immagine in un modello 3D di keycap con texture. Prende l'ID del task di prototipazione come input_task_id e l'ID candidato dell'immagine come candidate_id.

  • POST /openapi/creative-lab/keycap/v1/prototype
  • POST /openapi/creative-lab/keycap/v1/build

Entrambi gli endpoint POST richiedono un piano a pagamento. Una richiesta da un account con piano gratuito restituisce 402.


POST/openapi/creative-lab/keycap/v1/prototype

Creare un'attività di prototipo Keycap

Genera un'immagine del keycap finito a partire da una foto. Il campo image_urls dell'attività contiene l'immagine, e candidate_ids contiene il suo ID, con una voce in ciascuno. Se il design non ti piace, crea un'altra attività di prototipo. Meshy addebita ogni attività di prototipo separatamente.

Per creare il keycap 3D, passa l'ID di questa attività all'endpoint di build come input_task_id, con la voce di candidate_ids come candidate_id. Per i campi dell'attività, vedi L'oggetto attività di prototipo Keycap.

Request

POST
/openapi/creative-lab/keycap/v1/prototype
# Stage 1: generate a finished-keycap design render
curl https://api.meshy.ai/openapi/creative-lab/keycap/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>"
  }'

Response

{
  "result": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef"
}

Parametri

  • Name
    image_url
    Type
    string
    Obbligatorio
    Description

    La foto da trasformare in un design di keycap, come URL pubblico o data URI (data:image/jpeg;base64,<i tuoi dati immagine codificati in base64>).

    L'immagine deve essere un file JPG, JPEG, PNG o WebP di al massimo 20 MB (20.000.000 byte). Ogni lato deve essere di almeno 32 pixel, e l'immagine può avere al massimo 178.956.970 pixel in totale. Un'immagine al di fuori di questi limiti restituisce 400.

    Meshy rileva il formato dai dati dell'immagine, non dall'estensione del file nell'URL. Un URL senza estensione funziona, e Meshy segue i reindirizzamenti HTTP. Meshy applica l'orientamento EXIF, quindi una foto scattata da telefono e ruotata viene visualizzata nel modo in cui appare.

    Un data URI deve essere codificato in base64 con un tipo di immagine, come data:image/png;base64,..., e l'immagine decodificata deve essere JPEG, PNG o WebP. Il limite di 20 MB si applica all'immagine decodificata, quindi il testo base64 può essere circa un terzo più grande.

  • Name
    name
    Type
    string
    Description

    Un nome per l'attività, fino a 100 caratteri. Viene restituito nel campo name dell'attività. Un nome più lungo restituisce 400.

  • Name
    remove_background
    Type
    boolean
    predefinito false
    Description

    Se rimuovere lo sfondo dall'immagine del prototipo. true restituisce un PNG RGBA trasparente, così puoi posizionare il keycap su qualsiasi sfondo. Se Meshy non riesce a rimuovere lo sfondo, restituisce l'immagine con il suo sfondo, e l'attività comunque riesce.

    Il design della testa che la build trasforma in 3D mantiene il suo sfondo in entrambi i casi. La build dipinge la base del keycap a partire dall'immagine in image_urls, senza il suo sfondo se hai inviato true. La build restituisce questa immagine come process_image_urls.composite.

Valori restituiti

Il campo result contiene l'ID della nuova attività di prototipo. Recupera l'attività o trasmettila in streaming finché status non è SUCCEEDED. Quindi passa l'ID all'endpoint di build come input_task_id, con la voce di candidate_ids come candidate_id.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    La richiesta non può essere eseguita. Ad esempio:

    • image_url è mancante.
    • L'immagine non è un file JPG, JPEG, PNG o WebP.
    • L'immagine è troppo piccola, supera i 20 MB, o supera il numero massimo di pixel.
    • Meshy non riesce a scaricare l'immagine, ad esempio perché l'URL restituisce 404 o va in timeout.
    • Il data URI non è un base64 valido.
    • L'immagine è stata segnalata come NSFW.

    Il messaggio di errore indica quale problema è stato trovato. Correggi la richiesta, quindi inviala di nuovo.

  • Name
    401 - Unauthorized
    Description

    La chiave API è mancante o non valida. Controlla l'header Authorization.

  • Name
    402 - Payment Required
    Description

    Si applica una delle seguenti condizioni:

    • L'account non ha crediti sufficienti.
    • La chiave API, lo spazio di lavoro o il membro ha raggiunto il proprio limite di crediti.
    • L'account è nel piano gratuito.

    Controlla i tuoi crediti e il tuo piano, poi riprova.

  • Name
    403 - Forbidden
    Description

    Il tuo team ha attivato il filtraggio IP, e Meshy ha segnalato l'immagine per proprietà intellettuale di terzi. Invia un'immagine di cui hai i diritti d'uso.

  • Name
    429 - Too Many Requests
    Description

    È stato raggiunto uno dei seguenti limiti:

    • Hai inviato più richieste di quante ne consenta il tuo limite di frequenza. Attendi qualche secondo, poi riprova. Vedi Limiti di frequenza.
    • Troppe delle tue attività sono in coda o in esecuzione. Attendi che alcune terminino, poi riprova.
    • Su un piano illimitato senza crediti residui, hai raggiunto il numero di attività che possono essere eseguite senza crediti. Attendi che un'attività termini, oppure aggiungi crediti.
  • Name
    500 - Internal Server Error
    Description

    Meshy ha riscontrato un errore del server, ad esempio perché la moderazione dei contenuti o il controllo della proprietà intellettuale non è riuscito a essere eseguito, oppure Meshy non è riuscito a memorizzare l'immagine. Meshy non crea l'attività, e rimborsa eventuali crediti addebitati. Riprova la richiesta.


POST/openapi/creative-lab/keycap/v1/build

Creare un'attività di build Keycap

Genera il keycap 3D texturizzato a partire da un'attività di prototipo riuscita e da uno dei suoi candidati. Per i suoi campi, vedi L'oggetto attività di build Keycap.

Un'attività di build esegue ogni passaggio. Genera un modello 3D dal design e lo colora. Quindi posiziona e taglia il modello sulla base del keycap in una posa predefinita calibrata, così non è necessario regolarla manualmente. Infine, assembla il keycap ed esporta i file. Una build richiede in genere da 3 a 7 minuti.

Request

POST
/openapi/creative-lab/keycap/v1/build
# Stage 2: build the chosen candidate into a 3D keycap
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
    "candidate_id": "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b",
    "options": {
      "base_model": "cherry-mx-1x1-r1",
      "head_size_mm": 23,
      "vertical_offset_mm": 0
    }
  }'

Response

{
  "result": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af"
}

Parametri

  • Name
    input_task_id
    Type
    string
    Obbligatorio
    Description

    L'ID dell'attività di prototipo da costruire. Deve essere un'attività creata dal tuo account con POST /openapi/creative-lab/keycap/v1/prototype, con stato SUCCEEDED.

    Un ID che non corrisponde a una delle tue attività di prototipo Keycap create tramite l'API restituisce 404, incluso un prototipo creato nell'app web.

  • Name
    candidate_id
    Type
    string
    Obbligatorio
    Description

    Il candidato da costruire, dall'array candidate_ids dell'attività di prototipo. Un valore che non è presente in quell'array restituisce 400.

  • Name
    name
    Type
    string
    Description

    Un nome per l'attività, fino a 100 caratteri. Viene restituito nel campo name dell'attività. Un nome più lungo restituisce 400.

options

Impostazioni geometriche opzionali. Ogni campo ha un valore predefinito calibrato, quindi invia solo i campi che vuoi modificare.

  • Name
    base_model
    Type
    string
    predefinito cherry-mx-1x1-r1
    Description

    La base del keycap su cui costruire. L'unico valore è cherry-mx-1x1-r1, un keycap standard con profilo Cherry MX 1u. Le dimensioni personalizzate non sono supportate, e qualsiasi altro valore restituisce 400.

  • Name
    head_size_mm
    Type
    number
    predefinito 23
    Description

    La dimensione della testa lungo la sua dimensione più lunga, in millimetri, da 10 a 40. Meshy ridimensiona la testa in modo che la sua dimensione più lunga corrisponda a questo valore. Un valore fuori dall'intervallo restituisce 400.

    Per un valore superiore a circa 32.9, Meshy potrebbe ridurre la dimensione affinché la testa rientri nel limite dell'ingombro protettivo della base. In tal caso la testa potrebbe risultare più piccola di quanto richiesto. L'oggetto attività non restituisce la dimensione applicata da Meshy. Per verificarla, misura la bounding box della mesh keycap-head nel modello.

  • Name
    vertical_offset_mm
    Type
    number
    predefinito 0
    Description

    Lo spostamento verticale da applicare alla testa prima che Meshy la posizioni sulla base, in millimetri, da -5 a 5. Un valore fuori dall'intervallo restituisce 400.

Restituisce

Il campo result contiene l'ID della nuova attività di build. Recupera l'attività o trasmettila in streaming finché status non è SUCCEEDED. Quindi scarica il file GLB da model_urls.glb e il pacchetto OBJ da model_urls.obj_zip.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    La richiesta non può essere eseguita. Ad esempio:

    • input_task_id è mancante o non è un ID attività valido.
    • Lo stato dell'attività di prototipo non è SUCCEEDED. Se è ancora in esecuzione, attendi e riprova. Se è fallita o è stata annullata, crea una nuova attività di prototipo.
    • L'attività di prototipo è riuscita ma non ha candidati. Crea una nuova attività di prototipo.
    • candidate_id è mancante, oppure non è presente in candidate_ids dell'attività di prototipo. Invia un valore da quell'array.
    • Un campo in options è fuori dall'intervallo consentito, oppure base_model non è un valore disponibile.

    Il messaggio di errore indica quale problema ha riscontrato.

  • Name
    401 - Unauthorized
    Description

    La chiave API è mancante o non valida. Controlla l'header Authorization.

  • Name
    402 - Payment Required
    Description

    Si applica una di queste condizioni:

    • L'account non ha crediti sufficienti.
    • La chiave API, lo spazio di lavoro o il membro ha raggiunto il proprio limite di crediti.
    • L'account è nel piano gratuito.

    Controlla i tuoi crediti e il tuo piano, poi riprova.

  • Name
    404 - Not Found
    Description

    input_task_id non corrisponde a nessuna attività di prototipo Keycap creata dal tuo account tramite l'API. Anche un prototipo creato nell'app web restituisce 404. Invia l'ID result ottenuto dalla risposta di creazione del prototipo.

  • Name
    429 - Too Many Requests
    Description

    È stato raggiunto uno di questi limiti:

    • Hai inviato più richieste di quante ne consenta il tuo limite di frequenza. Attendi qualche secondo, poi riprova. Vedi Limiti di frequenza.
    • Troppe delle tue attività sono in coda o in esecuzione. Attendi che alcune si completino, poi riprova.
    • Con un piano illimitato senza crediti residui, hai raggiunto il numero di attività eseguibili senza crediti. Attendi che un'attività si completi, oppure aggiungi crediti.
  • Name
    500 - Internal Server Error
    Description

    Meshy non è riuscita a creare l'attività a causa di un errore del server. Meshy rimborsa eventuali crediti addebitati. Riprova la richiesta.


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

Recupera un task Keycap

Restituisce un task di prototipo o di build. Il percorso deve corrispondere allo stage del task. Un task di build richiesto tramite /prototype/:id restituisce 404, e lo stesso vale per un task di prototipo richiesto tramite /build/:id.

Per i campi, vedi The Keycap prototype task object e The Keycap build task object.

Request

GET
/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
  "type": "creative-lab-keycap-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142456000,
  "started_at": 1753142460000,
  "finished_at": 1753142516000,
  "expires_at": 1753401716000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 12,
  "image_urls": [
    "https://assets.meshy.ai/***/design-1.png?Expires=***"
  ],
  "candidate_ids": [
    "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
  ]
}

Build Response

{
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
    "composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
    "base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
  }
}

Parametri

  • Name
    id
    Type
    path
    Description

    L'ID del task dalla risposta di creazione.

Restituisce

L'oggetto task di prototipo o l'oggetto task di build, a seconda dello stage indicato nel percorso.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    id non è un ID di task valido. Invia l'ID result dalla risposta di creazione.

  • Name
    403 - Forbidden
    Description

    Il tuo team ha il Filtraggio IP attivato, e Meshy ha segnalato l'immagine del task di prototipo per proprietà intellettuale di terzi. I task di build e i team con piano Enterprise non ricevono questo errore. Crea un task di prototipo a partire da un'immagine di cui hai i diritti d'uso.

  • Name
    404 - Not Found
    Description

    Nessun task Keycap con questo ID appartiene al tuo account, oppure lo stage del task non corrisponde al percorso. Controlla l'ID e usa /prototype o /build in base al task.

  • Name
    500 - Internal Server Error
    Description

    Meshy non è riuscito a eseguire il controllo sulla proprietà intellettuale. Riprova la richiesta.


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

Elimina un task Keycap

Annulla un task Keycap. Annullare un task PENDING rimborsa i suoi crediti. Un task IN_PROGRESS viene annullato senza rimborso, perché un worker lo ha già avviato. Un task con uno stato finale (SUCCEEDED, FAILED o CANCELED) non può essere annullato.

Il percorso deve corrispondere alla fase del task. Ad esempio, DELETE su /prototype/:id con l'ID di un task di build restituisce 404.

Request

DELETE
/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

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

Parametri del percorso

  • Name
    id
    Type
    path
    Description

    L'ID del task da annullare.

Restituisce

204 No Content con un corpo vuoto.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    Si applica uno dei seguenti casi:

    • id non è un ID di task valido. Invia l'ID result restituito dalla risposta di creazione.
    • Il task ha già uno stato finale (SUCCEEDED, FAILED o CANCELED), quindi non può essere annullato.
  • Name
    404 - Not Found
    Description

    Nessun task Keycap con questo ID appartiene al tuo account, oppure la fase del task non corrisponde al percorso. Controlla l'ID e usa /prototype o /build per far corrispondere il task.

  • Name
    500 - Internal Server Error
    Description

    Meshy ha riscontrato un errore del server durante l'annullamento del task, quindi il task potrebbe essere stato annullato oppure no. Recupera il task per controllare il suo status prima di riprovare.


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

Esegui lo streaming di un task Keycap

Trasmette in streaming gli aggiornamenti di un task Keycap come Server-Sent Events (SSE). Il percorso deve corrispondere alla fase del task. In caso contrario, ad esempio l'ID di un task di build su /prototype/:id/stream, lo stream invia un evento error con status_code: 404 e si chiude.

Request

GET
/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/stream
curl -N https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/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; fields not yet populated are null / empty.
// The following PENDING frame is shortened to the fields that change.
event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***"
  }
}

Parametri

  • Name
    id
    Type
    path
    Description

    L'ID del task dalla risposta di creazione.

Valori restituiti

Uno stream di oggetti task di tipo prototype o build. Ogni evento contiene l'oggetto task completo, così come viene restituito da Recupera un task Keycap. Mentre il task è PENDING o IN_PROGRESS, i suoi campi di output sono ancora vuoti (null, [] o {}), e finished_at è null.

Se il Filtraggio IP blocca il risultato del task, lo stream invia al suo posto un evento error, con lo status_code che una richiesta get restituirebbe.


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

Elenca i task Keycap

Restituisce i tuoi task Keycap relativi a una fase, una pagina alla volta. Il percorso seleziona la fase. /prototype restituisce solo i task di prototipo, mentre /build restituisce solo i task di build.

Request

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

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

Response (List Prototype Tasks)

[
  {
    "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
    "type": "creative-lab-keycap-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1753142456000,
    "started_at": 1753142460000,
    "finished_at": 1753142516000,
    "expires_at": 1753401716000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 12,
    "image_urls": [
      "https://assets.meshy.ai/***/design-1.png?Expires=***"
    ],
    "candidate_ids": [
      "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
    ]
  }
]

Parametri del percorso

  • Name
    stage
    Type
    path
    Obbligatorio
    Description

    La fase da elencare, prototype o build.

Parametri della query

  • Name
    page_num
    Type
    integer
    predefinito 1
    Description

    La pagina da restituire, da 1 a 255. 0 restituisce la prima pagina. Un valore al di fuori dell'intervallo 0-255 restituisce 400.

  • Name
    page_size
    Type
    integer
    predefinito 10
    Description

    Numero di task per pagina, fino a 100. Un valore da 101 a 255 restituisce 100 task, mentre 0 utilizza il valore predefinito. Un valore al di fuori dell'intervallo 0-255 restituisce 400.

  • Name
    sort_by
    Type
    string
    predefinito -created_at
    Description

    L'ordine di ordinamento.

    Valori disponibili:

    • -created_at: prima i più recenti
    • +created_at: prima i più vecchi

Restituisce

Un array di oggetti task di prototipo o di oggetti task di build, corrispondenti alla fase specificata nel percorso.


L'oggetto task di prototipo Keycap

Un task di prototipo genera un'immagine del keycap finito a partire da una foto. Per trasformare il design in un keycap 3D, passa l'ID del task all'endpoint di build come input_task_id, con la sua voce candidate_ids come candidate_id.

Proprietà

Example Keycap Prototype Task Object

{
  "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
  "type": "creative-lab-keycap-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142456000,
  "started_at": 1753142460000,
  "finished_at": 1753142516000,
  "expires_at": 1753401716000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 12,
  "image_urls": [
    "https://assets.meshy.ai/***/design-1.png?Expires=***"
  ],
  "candidate_ids": [
    "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
  ]
}
  • Name
    id
    Type
    string
    Description

    L'ID del task. Non fare affidamento sul suo formato.

  • Name
    type
    Type
    string
    Description

    Il tipo di task, sempre creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

    Il name inviato durante la creazione del task, oppure "" se non ne è stato inviato uno.

  • Name
    status
    Type
    string
    Description

    Lo stato del task.

    Valori disponibili:

    • PENDING: in attesa nella coda
    • IN_PROGRESS: generazione del risultato in corso
    • SUCCEEDED: finale, con il risultato
    • FAILED: finale, con il motivo in task_error
    • CANCELED: finale, senza risultato
  • Name
    progress
    Type
    integer
    Description

    Percentuale del lavoro completato, da 0 a 100. È 0 finché il task non inizia e 100 quando ha successo.

  • Name
    created_at
    Type
    timestamp
    Description

    Momento in cui il task è stato creato, in millisecondi Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Momento in cui un worker ha avviato il task, in millisecondi Unix. null fino ad allora.

  • Name
    finished_at
    Type
    timestamp
    Description

    Momento in cui il task ha raggiunto uno stato finale, in millisecondi Unix. null fino ad allora.

  • Name
    expires_at
    Type
    timestamp
    Description

    Momento in cui il risultato del task scade, in millisecondi Unix. Corrisponde a 3 giorni dopo finished_at, oppure a 3 giorni dopo created_at finché il task non termina. Per gli account Enterprise, che conservano i risultati API a tempo indeterminato, corrisponde a circa 100 anni dopo. Vedi Conservazione degli asset.

  • Name
    preceding_tasks
    Type
    integer
    Description

    La posizione del task nella coda mentre è PENDING. 1 significa che inizierà come prossimo. 0 dopo che il task esce dalla coda, e sempre 0 nei risultati di elenco.

  • Name
    task_error
    Type
    object
    Description

    Il motivo per cui il task è fallito. null a meno che status non sia FAILED. Vedi Errori.

  • Name
    consumed_credits
    Type
    integer
    Description

    Numero di crediti addebitati per il task, dopo eventuali rimborsi. Una richiesta che restituisce un errore non viene addebitata. Un task fallito è 0, perché Meshy lo rimborsa. L'annullamento rimborsa un task solo mentre è PENDING. Se Meshy non riesce a leggere l'addebito, una risposta get o stream omette il campo, e una richiesta di elenco restituisce 500. In tal caso, riprova la richiesta.

  • Name
    image_urls
    Type
    array of strings
    Description

    URL di download per l'immagine del keycap finito. L'array contiene un URL dopo che il task ha successo, ed è vuoto fino ad allora. image_urls[i] mostra il candidato in candidate_ids[i].

    Questi URL sono destinati alla visualizzazione. L'endpoint di build accetta una voce da candidate_ids, non un URL. Sono URL firmati, quindi recuperali senza un header Authorization. Restano validi fino a expires_at, e recuperare nuovamente il task restituisce gli stessi URL.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    ID dei candidati, nello stesso ordine di image_urls. Per generare un candidato, invia il suo ID come candidate_id nella richiesta di build. Non fare affidamento sul formato di questi ID.


L'oggetto task di build del keycap

Un task di build genera il keycap 3D con texture a partire da un task di prototipo riuscito e da uno dei suoi candidati. Genera il modello 3D, lo colora, lo posiziona e lo taglia sulla base del keycap, quindi assembla ed esporta il keycap.

Proprietà

Example Keycap Build Task Object

{
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
    "composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
    "base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
  }
}
  • Name
    id
    Type
    string
    Description

    L'ID del task. Non fare affidamento sul suo formato.

  • Name
    type
    Type
    string
    Description

    Il tipo di task, sempre creative-lab-keycap-build.

  • Name
    name
    Type
    string
    Description

    Il name che hai inviato quando hai creato il task, oppure "" se non ne hai inviato uno.

  • Name
    status
    Type
    string
    Description

    Lo stato del task.

    Valori disponibili:

    • PENDING: in attesa nella coda
    • IN_PROGRESS: generazione del risultato in corso
    • SUCCEEDED: definitivo, con il risultato
    • FAILED: definitivo, con il motivo in task_error
    • CANCELED: definitivo, senza risultato
  • Name
    progress
    Type
    integer
    Description

    Percentuale di lavoro completato, da 0 a 100. È 0 finché il task non inizia e 100 quando ha esito positivo.

  • Name
    created_at
    Type
    timestamp
    Description

    Momento in cui il task è stato creato, in millisecondi Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Momento in cui un worker ha avviato il task, in millisecondi Unix. null fino ad allora.

  • Name
    finished_at
    Type
    timestamp
    Description

    Momento in cui il task ha raggiunto uno stato definitivo, in millisecondi Unix. null fino ad allora.

  • Name
    expires_at
    Type
    timestamp
    Description

    Momento in cui il risultato del task scade, in millisecondi Unix. È 3 giorni dopo finished_at, oppure 3 giorni dopo created_at finché il task non termina. Per gli account Enterprise, che conservano i risultati delle API a tempo indeterminato, è circa 100 anni dopo. Consulta Conservazione degli asset.

  • Name
    preceding_tasks
    Type
    integer
    Description

    La posizione del task nella coda mentre è PENDING. 1 significa che inizierà come prossimo. 0 dopo che il task lascia la coda, e sempre 0 nei risultati degli elenchi.

  • Name
    task_error
    Type
    object
    Description

    Il motivo per cui il task è fallito. null a meno che status non sia FAILED. Consulta Errori.

  • Name
    consumed_credits
    Type
    integer
    Description

    Numero di crediti addebitati per il task, dopo eventuali rimborsi. Una richiesta che restituisce un errore non viene addebitata. Un task fallito è 0, perché Meshy lo rimborsa. L'annullamento rimborsa un task solo mentre è PENDING. Se Meshy non riesce a leggere l'addebito, una risposta get o stream omette il campo, e una richiesta di elenco restituisce 500. In quel caso, ripeti la richiesta.

  • Name
    model_urls
    Type
    object
    Description

    URL di download per il modello 3D. Meshy esporta il file GLB e il pacchetto OBJ in scala reale in millimetri, con Y verso l'alto, con la parte anteriore del keycap rivolta verso +Z.

    Il modello ha mesh denominate keycap-head e keycap-base. Quando Meshy ricorre a un riempimento a pattern per la base, il modello include anche una mesh keycap-base-interior per la cavità dello stelo. Non dare per scontato che il modello abbia esattamente due mesh.

    Questi sono URL firmati, quindi recuperali senza un header Authorization. Restano validi fino a expires_at, e richiedere di nuovo il task prima di allora restituisce gli stessi URL. Un URL scaduto non può essere rinnovato, quindi scarica e salva i file prima di allora.

    • Name
      glb
      Type
      string
      Description

      URL di download per il file GLB con texture, model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      URL di download per il pacchetto OBJ, un file ZIP con model.obj, model.mtl e le texture PNG utilizzate da model.mtl. Con una base a colore pieno, l'unica texture è keycap-head.png. Con una base a pattern, il file ZIP include anche keycap-base.png.

  • Name
    process_image_urls
    Type
    object
    Description

    URL di download per le immagini delle fasi di build, organizzate per tipo. Come model_urls, sono URL firmati, quindi recuperali senza un header Authorization. Restano validi fino a expires_at, e richiedere di nuovo il task restituisce gli stessi URL.

    Può avere queste chiavi:

    • head_design: l'immagine di design del candidato scelto, che la build ha trasformato in 3D. Sempre presente.
    • composite: l'immagine del keycap finito per il candidato scelto, da cui la build ha dipinto la base. Può essere assente.
    • base_canvas: la base del keycap dipinta. Può essere assente.

    Meshy potrebbe aggiungere delle chiavi, quindi ignora una chiave che non riconosci.


Esempio end-to-end

L'esempio esegue l'intero flusso:

  1. Crea un task di prototipo da una foto.
  2. Recupera il task finché il suo status è SUCCEEDED.
  3. Scegli un candidato da candidate_ids.
  4. Crea un task di build con quel candidato.
  5. Recupera il task di build finché il suo status è SUCCEEDED.
  6. Scarica il file GLB e il bundle OBJ da model_urls.

L'esempio sceglie il primo candidato. Nella tua app, mostra le voci di image_urls ai tuoi utenti e lasciali scegliere. L'indice di un'immagine scelta in image_urls è l'indice del suo ID in candidate_ids.

Complete flow

POST
/openapi/creative-lab/keycap/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://...
: "${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

BASE="https://api.meshy.ai/openapi/creative-lab/keycap/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 '{"image_url":"data:%s;base64,' "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  printf '{"image_url":"%s"}' "$IMAGE_URL" >"$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 design render
poll prototype "$PROTO_ID"

# 3. Pick a candidate (first one here; show image_urls to a user in production)
CANDIDATE_ID=$(api GET "$BASE/prototype/$PROTO_ID" | jq -r '.candidate_ids[0]')

# 4. Create the build task
jq -n --arg p "$PROTO_ID" --arg c "$CANDIDATE_ID" \
  '{input_task_id: $p, candidate_id: $c}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 5. Wait for the model (a build usually takes 3-7 minutes)
poll build "$BUILD_ID"

# 6. Download the artifacts. These are signed URLs: no Authorization header,
#    and they stay valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o keycap.glb "$(jq -r '.model_urls.glb' <<<"$TASK")"
curl --silent --show-error --fail --max-time 900 \
  -o keycap-obj.zip "$(jq -r '.model_urls.obj_zip' <<<"$TASK")"
echo "Done: keycap.glb + keycap-obj.zip"