lowpoly zostanie wycofany 30 paź 2026. Zmień model przed tymi datami, aby uniknąć błędów żądań. Zobacz wszystkie wycofania

Creative Lab Keycap API

Zamień zdjęcie w pełnokolorowy, niestandardowy klawisz (keycap) do klawiatury mechanicznej w dwóch etapach. Zadanie prototypu generuje na podstawie zdjęcia obraz gotowego klawisza. Zadanie budowy zamienia ten obraz w teksturowany model 3D klawisza. Pobiera ono identyfikator zadania prototypu jako input_task_id oraz identyfikator kandydata obrazu jako candidate_id.

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

Oba endpointy POST wymagają płatnego planu. Żądanie z konta na planie bezpłatnym zwraca 402.


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

Utwórz zadanie prototypu Keycap

Generuje jeden obraz gotowej nasadki klawisza (keycap) na podstawie zdjęcia. Pole image_urls zadania zawiera obraz, a candidate_ids zawiera jego ID, po jednym wpisie w każdym. Jeśli projekt Ci się nie podoba, utwórz kolejne zadanie prototypu. Meshy nalicza opłatę za każde zadanie prototypu osobno.

Aby zbudować nasadkę klawisza 3D, przekaż ID tego zadania do punktu końcowego budowania jako input_task_id, a wpis candidate_ids jako candidate_id. Informacje o polach zadania znajdziesz w sekcji Obiekt zadania prototypu 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"
}

Parametry

  • Name
    image_url
    Type
    string
    Wymagane
    Description

    Zdjęcie, które ma zostać przekształcone w projekt nasadki klawisza, jako publicznie dostępny URL lub Data URI (data:image/jpeg;base64,<Twoje dane obrazu zakodowane w base64>).

    Obraz musi być plikiem JPG, JPEG, PNG lub WebP o rozmiarze maksymalnie 20 MB (20 000 000 bajtów). Każdy bok musi mieć co najmniej 32 piksele, a obraz może mieć łącznie maksymalnie 178 956 970 pikseli. Obraz przekraczający te limity zwraca 400.

    Meshy wykrywa format na podstawie danych obrazu, a nie na podstawie rozszerzenia pliku w adresie URL. Adres URL bez rozszerzenia również działa, a Meshy podąża za przekierowaniami HTTP. Meshy stosuje orientację EXIF, więc obrócone zdjęcie z telefonu wychodzi tak, jak powinno wyglądać.

    Data URI musi być zakodowane w base64 z typem obrazu, np. data:image/png;base64,..., a zdekodowany obraz musi być w formacie JPEG, PNG lub WebP. Limit 20 MB dotyczy zdekodowanego obrazu, więc tekst base64 może być o około jedną trzecią większy.

  • Name
    name
    Type
    string
    Description

    Nazwa zadania, maksymalnie 100 znaków. Jest zwracana w polu name zadania. Dłuższa nazwa zwraca 400.

  • Name
    remove_background
    Type
    boolean
    domyślne false
    Description

    Określa, czy usunąć tło z obrazu prototypu. true zwraca przezroczysty obraz PNG w formacie RGBA, dzięki czemu możesz umieścić nasadkę klawisza na dowolnym tle. Jeśli Meshy nie może usunąć tła, zwraca obraz z jego tłem, a zadanie nadal kończy się sukcesem.

    Projekt wierzchniej części, który podczas budowania zostaje przekształcony w 3D, zachowuje swoje tło niezależnie od tego ustawienia. Proces budowania maluje podstawę nasadki klawisza na podstawie obrazu w image_urls, bez jego tła, jeśli wysłano true. Proces budowania zwraca ten obraz jako process_image_urls.composite.

Zwracane wartości

Pole result zawiera ID nowego zadania prototypu. Pobierz zadanie lub przesyłaj je strumieniowo, aż status przyjmie wartość SUCCEEDED. Następnie przekaż ID do punktu końcowego budowania jako input_task_id, a wpis z candidate_ids jako candidate_id.

Tryby niepowodzenia

  • Name
    400 - Bad Request
    Description

    Żądanie nie może zostać wykonane. Na przykład:

    • Brakuje image_url.
    • Obraz nie jest plikiem JPG, JPEG, PNG ani WebP.
    • Obraz jest zbyt mały, przekracza 20 MB lub przekracza maksymalną liczbę pikseli.
    • Meshy nie może pobrać obrazu, na przykład ponieważ adres URL zwraca 404 lub upłynął limit czasu.
    • Data URI nie jest prawidłowo zakodowane w base64.
    • Obraz został oznaczony jako NSFW.

    Komunikat o błędzie wskazuje, jaki problem został wykryty. Popraw żądanie i wyślij je ponownie.

  • Name
    401 - Unauthorized
    Description

    Brakuje klucza API lub jest on nieprawidłowy. Sprawdź nagłówek Authorization.

  • Name
    402 - Payment Required
    Description

    Zastosowanie ma jedna z poniższych sytuacji:

    • Konto nie ma wystarczającej liczby kredytów.
    • Klucz API, obszar roboczy lub członek osiągnął swój limit kredytów.
    • Konto korzysta z planu darmowego.

    Sprawdź swoje kredyty i plan, a następnie spróbuj ponownie.

  • Name
    403 - Forbidden
    Description

    Twój zespół ma włączone filtrowanie adresów IP, a Meshy oznaczyło obraz jako naruszający prawa własności intelektualnej osób trzecich. Wyślij obraz, do którego masz prawa użytkowania.

  • Name
    429 - Too Many Requests
    Description

    Osiągnięto jeden z poniższych limitów:

    • Wysłano więcej żądań, niż pozwala na to Twój limit szybkości. Odczekaj kilka sekund, a następnie spróbuj ponownie. Zobacz Limity szybkości.
    • Zbyt wiele Twoich zadań znajduje się w kolejce lub jest w trakcie wykonywania. Poczekaj, aż część z nich się zakończy, a następnie spróbuj ponownie.
    • W przypadku planu nielimitowanego bez pozostałych kredytów osiągnięto liczbę zadań, które mogą być uruchamiane bez kredytów. Poczekaj na zakończenie zadania lub dodaj kredyty.
  • Name
    500 - Internal Server Error
    Description

    Wystąpił błąd serwera Meshy, na przykład dlatego, że nie udało się przeprowadzić moderacji treści lub sprawdzenia praw własności intelektualnej, albo Meshy nie mogło zapisać obrazu. Meshy nie tworzy zadania i zwraca wszelkie naliczone kredyty. Spróbuj wysłać żądanie ponownie.


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

Utwórz zadanie budowy Keycap

Generuje teksturowany model 3D keycapa na podstawie zakończonego powodzeniem zadania prototypu i jednego z jego kandydatów. Opis pól znajdziesz w sekcji Obiekt zadania budowy Keycap.

Jedno zadanie budowy wykonuje każdy krok. Generuje model 3D na podstawie projektu i nadaje mu kolory. Następnie osadza i przycina model na podstawie keycapa w skalibrowanej pozycji domyślnej, dzięki czemu nie musisz dostosowywać jej ręcznie. Na koniec składa keycap i eksportuje pliki. Budowa trwa zazwyczaj od 3 do 7 minut.

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"
}

Parametry

  • Name
    input_task_id
    Type
    string
    Wymagane
    Description

    ID zadania prototypu do zbudowania. Musi to być zadanie utworzone przez Twoje konto za pomocą POST /openapi/creative-lab/keycap/v1/prototype, ze statusem SUCCEEDED.

    ID, które nie jest zadaniem prototypu Keycap z API utworzonym przez Twoje konto, zwraca 404, w tym również prototyp utworzony w aplikacji webowej.

  • Name
    candidate_id
    Type
    string
    Wymagane
    Description

    Kandydat do zbudowania, pochodzący z tablicy candidate_ids zadania prototypu. Wartość spoza tej tablicy zwraca 400.

  • Name
    name
    Type
    string
    Description

    Nazwa zadania, do 100 znaków. Jest zwracana w polu name zadania. Dłuższa nazwa zwraca 400.

options

Opcjonalne ustawienia geometrii. Każde pole ma skalibrowaną wartość domyślną, więc wysyłaj tylko te pola, które chcesz zmienić.

  • Name
    base_model
    Type
    string
    domyślne cherry-mx-1x1-r1
    Description

    Podstawa keycapa, na której następuje budowa. Jedyną wartością jest cherry-mx-1x1-r1, standardowy keycap o profilu Cherry MX 1u. Niestandardowe rozmiary nie są obsługiwane, a każda inna wartość zwraca 400.

  • Name
    head_size_mm
    Type
    number
    domyślne 23
    Description

    Rozmiar główki wzdłuż jej najdłuższego wymiaru, w milimetrach, od 10 do 40. Meshy skaluje główkę tak, aby jej najdłuższy wymiar odpowiadał tej wartości. Wartość spoza tego zakresu zwraca 400.

    Dla wartości powyżej około 32.9 Meshy może zmniejszyć rozmiar, aby główka zmieściła się w granicach ochronnego obszaru podstawy. Główka może wtedy wyjść mniejsza, niż zażądano. Obiekt zadania nie zwraca rozmiaru zastosowanego przez Meshy. Aby go sprawdzić, zmierz prostopadłościan ograniczający siatki keycap-head w modelu.

  • Name
    vertical_offset_mm
    Type
    number
    domyślne 0
    Description

    Przesunięcie pionowe stosowane do główki, zanim Meshy osadzi ją na podstawie, w milimetrach, od -5 do 5. Wartość spoza tego zakresu zwraca 400.

Zwracane dane

Pole result zawiera ID nowego zadania budowy. Pobierz zadanie lub przesyłaj je strumieniowo, dopóki status nie będzie miał wartości SUCCEEDED. Następnie pobierz plik GLB z model_urls.glb oraz pakiet OBJ z model_urls.obj_zip.

Tryby niepowodzenia

  • Name
    400 - Bad Request
    Description

    Żądanie nie może zostać wykonane. Na przykład:

    • input_task_id jest nieobecne lub nie jest prawidłowym ID zadania.
    • Status zadania prototypu nie jest SUCCEEDED. Jeśli nadal trwa, poczekaj i spróbuj ponownie. Jeśli zakończyło się niepowodzeniem lub zostało anulowane, utwórz nowe zadanie prototypu.
    • Zadanie prototypu zakończyło się powodzeniem, ale nie ma kandydatów. Utwórz nowe zadanie prototypu.
    • candidate_id jest nieobecne lub nie znajduje się w candidate_ids zadania prototypu. Wyślij wartość z tej tablicy.
    • Pole w options jest poza dozwolonym zakresem lub base_model nie jest dostępną wartością.

    Komunikat błędu wskazuje, jaki problem wystąpił.

  • Name
    401 - Unauthorized
    Description

    Brak klucza API lub klucz API jest nieprawidłowy. Sprawdź nagłówek Authorization.

  • Name
    402 - Payment Required
    Description

    Zastosowanie ma jedno z poniższych:

    • Konto nie ma wystarczającej liczby kredytów.
    • Klucz API, obszar roboczy lub członek osiągnął limit kredytów.
    • Konto korzysta z planu darmowego.

    Sprawdź swoje kredyty i plan, a następnie spróbuj ponownie.

  • Name
    404 - Not Found
    Description

    input_task_id nie pasuje do żadnego zadania prototypu Keycap utworzonego przez Twoje konto za pomocą API. Prototyp utworzony w aplikacji webowej również zwraca 404. Wyślij ID result z odpowiedzi na utworzenie prototypu.

  • Name
    429 - Too Many Requests
    Description

    Osiągnięto jeden z poniższych limitów:

    • Wysłano więcej żądań, niż pozwala na to limit szybkości. Poczekaj kilka sekund, a następnie spróbuj ponownie. Zobacz Limity szybkości.
    • Zbyt wiele Twoich zadań jest w kolejce lub trwa. Poczekaj, aż część z nich się zakończy, a następnie spróbuj ponownie.
    • W przypadku planu nielimitowanego bez pozostałych kredytów, osiągnięto liczbę zadań, które mogą być uruchomione bez kredytów. Poczekaj na zakończenie zadania lub dodaj kredyty.
  • Name
    500 - Internal Server Error
    Description

    Meshy nie mogło utworzyć zadania z powodu błędu serwera. Meshy zwraca wszelkie pobrane kredyty. Spróbuj ponownie wysłać żądanie.


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

Pobierz zadanie Keycap

Zwraca zadanie prototypu lub builda. Ścieżka musi odpowiadać etapowi zadania. Zadanie builda zażądane przez /prototype/:id zwraca 404, podobnie jak zadanie prototypu zażądane przez /build/:id.

Pola opisano w Obiekt zadania prototypu Keycap oraz Obiekt zadania builda Keycap.

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=***"
  }
}

Parametry

  • Name
    id
    Type
    path
    Description

    ID zadania z odpowiedzi tworzenia.

Zwraca

Obiekt zadania prototypu lub obiekt zadania builda, zgodnie z etapem wskazanym w ścieżce.

Tryby błędów

  • Name
    400 - Bad Request
    Description

    id nie jest prawidłowym ID zadania. Wyślij ID result z odpowiedzi tworzenia.

  • Name
    403 - Forbidden
    Description

    Twój zespół ma włączone Filtrowanie IP, a Meshy oznaczyło obraz zadania prototypu jako naruszający prawa własności intelektualnej osób trzecich. Zadania builda oraz zespoły w planie Enterprise nie otrzymują tego błędu. Utwórz zadanie prototypu na podstawie obrazu, do którego posiadasz prawa.

  • Name
    404 - Not Found
    Description

    Żadne zadanie Keycap o tym ID nie należy do Twojego konta, lub etap zadania nie zgadza się ze ścieżką. Sprawdź ID i użyj /prototype lub /build zgodnie z zadaniem.

  • Name
    500 - Internal Server Error
    Description

    Meshy nie mogło przeprowadzić kontroli własności intelektualnej. Ponów żądanie.


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

Usuwanie zadania Keycap

Anuluje zadanie Keycap. Anulowanie zadania o statusie PENDING powoduje zwrot kredytów. Zadanie o statusie IN_PROGRESS jest anulowane bez zwrotu kredytów, ponieważ worker już rozpoczął jego przetwarzanie. Zadania ze statusem końcowym (SUCCEEDED, FAILED lub CANCELED) nie można anulować.

Ścieżka musi odpowiadać etapowi zadania. Na przykład DELETE na /prototype/:id z ID zadania typu build zwróci 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).

Parametry ścieżki

  • Name
    id
    Type
    path
    Description

    ID zadania do anulowania.

Zwraca

204 No Content z pustą treścią.

Tryby błędów

  • Name
    400 - Bad Request
    Description

    Zastosowanie ma jedno z poniższych:

    • id nie jest prawidłowym ID zadania. Wyślij ID result z odpowiedzi tworzenia zadania.
    • Zadanie ma już status końcowy (SUCCEEDED, FAILED lub CANCELED), więc nie można go anulować.
  • Name
    404 - Not Found
    Description

    Żadne zadanie Keycap o tym ID nie należy do Twojego konta lub etap zadania nie odpowiada ścieżce. Sprawdź ID i użyj /prototype lub /build, aby dopasować zadanie.

  • Name
    500 - Internal Server Error
    Description

    Meshy napotkało błąd serwera podczas anulowania zadania, więc zadanie może, ale nie musi zostać anulowane. Pobierz zadanie, aby sprawdzić jego status przed ponowną próbą.


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

Przesyłaj strumieniowo zadanie Keycap

Przesyła strumieniowo aktualizacje zadania Keycap jako zdarzenia Server-Sent Events (SSE). Ścieżka musi odpowiadać etapowi zadania. Jeśli tak nie jest, na przykład identyfikator zadania build pod adresem /prototype/:id/stream, strumień wysyła jedno zdarzenie error z status_code: 404 i zamyka się.

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=***"
  }
}

Parametry

  • Name
    id
    Type
    path
    Description

    Identyfikator zadania z odpowiedzi na żądanie utworzenia.

Zwraca

Strumień obiektów zadania prototype lub build. Każde zdarzenie zawiera pełny obiekt zadania, taki jak zwraca go Pobierz zadanie Keycap. Gdy zadanie ma status PENDING lub IN_PROGRESS, jego pola wyjściowe są nadal puste (null, [] lub {}), a finished_at ma wartość null.

Jeśli IP Filtering blokuje wynik zadania, strumień wysyła w jego miejsce jedno zdarzenie error, z status_code, który zwróciłoby żądanie get.


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

Lista zadań Keycap

Zwraca Twoje zadania Keycap z jednego etapu, po jednej stronie na raz. Ścieżka określa etap. /prototype zwraca tylko zadania prototypowe, a /build zwraca tylko zadania budowania.

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"
    ]
  }
]

Parametry ścieżki

  • Name
    stage
    Type
    path
    Wymagane
    Description

    Etap do wylistowania, prototype lub build.

Parametry zapytania

  • Name
    page_num
    Type
    integer
    domyślne 1
    Description

    Strona do zwrócenia, od 1 do 255. 0 zwraca pierwszą stronę. Wartość spoza zakresu 0 do 255 zwraca 400.

  • Name
    page_size
    Type
    integer
    domyślne 10
    Description

    Liczba zadań na stronę, maksymalnie 100. Wartość od 101 do 255 zwraca 100 zadań, a 0 używa wartości domyślnej. Wartość spoza zakresu 0 do 255 zwraca 400.

  • Name
    sort_by
    Type
    string
    domyślne -created_at
    Description

    Kolejność sortowania.

    Dostępne wartości:

    • -created_at: od najnowszych
    • +created_at: od najstarszych

Zwraca

Tablicę obiektów zadań prototypowych lub obiektów zadań budowania, odpowiadających etapowi podanemu w ścieżce.


Obiekt zadania prototypu Keycap

Zadanie prototypu generuje jeden obraz gotowego keycapa na podstawie zdjęcia. Aby przekształcić projekt w trójwymiarowy keycap, przekaż identyfikator zadania do punktu końcowego build jako input_task_id, wraz z odpowiednim wpisem candidate_ids jako candidate_id.

Właściwości

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

    Identyfikator zadania. Nie polegaj na jego formacie.

  • Name
    type
    Type
    string
    Description

    Typ zadania, zawsze creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

    Wartość name wysłana podczas tworzenia zadania lub "", jeśli jej nie wysłano.

  • Name
    status
    Type
    string
    Description

    Status zadania.

    Dostępne wartości:

    • PENDING: oczekuje w kolejce
    • IN_PROGRESS: generowanie wyniku
    • SUCCEEDED: zakończone, z wynikiem
    • FAILED: zakończone, z powodem w task_error
    • CANCELED: zakończone, bez wyniku
  • Name
    progress
    Type
    integer
    Description

    Procent wykonanej pracy, od 0 do 100. Wynosi 0 do momentu rozpoczęcia zadania i 100, gdy zakończy się powodzeniem.

  • Name
    created_at
    Type
    timestamp
    Description

    Czas utworzenia zadania, w milisekundach Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Czas, w którym pracownik rozpoczął zadanie, w milisekundach Unix. Do tego momentu null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Czas, w którym zadanie osiągnęło status końcowy, w milisekundach Unix. Do tego momentu null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Czas wygaśnięcia wyniku zadania, w milisekundach Unix. Wynosi 3 dni po finished_at, lub 3 dni po created_at, dopóki zadanie się nie zakończy. W przypadku kont Enterprise, które przechowują wyniki API bezterminowo, jest to około 100 lat później. Zobacz Przechowywanie zasobów.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Pozycja zadania w kolejce, gdy ma status PENDING. 1 oznacza, że zostanie uruchomione jako następne. 0 po opuszczeniu kolejki przez zadanie, i zawsze 0 w wynikach list.

  • Name
    task_error
    Type
    object
    Description

    Powód niepowodzenia zadania. null, chyba że status to FAILED. Zobacz Błędy.

  • Name
    consumed_credits
    Type
    integer
    Description

    Liczba kredytów naliczonych za zadanie, po uwzględnieniu ewentualnego zwrotu. Żądanie zwracające błąd nie jest obciążane opłatą. Nieudane zadanie ma wartość 0, ponieważ Meshy zwraca za nie kredyty. Anulowanie powoduje zwrot kredytów tylko wtedy, gdy zadanie ma status PENDING. Jeśli Meshy nie może odczytać naliczonej opłaty, odpowiedź typu get lub stream pomija to pole, a żądanie listy zwraca 500. W takim przypadku ponów żądanie.

  • Name
    image_urls
    Type
    array of strings
    Description

    Adresy URL do pobrania obrazu gotowego keycapa. Tablica zawiera jeden adres URL po pomyślnym zakończeniu zadania, a do tego momentu jest pusta. image_urls[i] pokazuje kandydata z candidate_ids[i].

    Te adresy URL służą do wyświetlania. Punkt końcowy build przyjmuje wpis z candidate_ids, a nie adres URL. Są to podpisane adresy URL, więc pobieraj je bez nagłówka Authorization. Pozostają ważne do expires_at, a ponowne pobranie zadania zwraca te same adresy URL.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    Identyfikatory kandydatów, w tej samej kolejności co image_urls. Aby zbudować kandydata, wyślij jego identyfikator jako candidate_id w żądaniu build. Nie polegaj na formacie tych identyfikatorów.


Obiekt zadania budowy Keycap

Zadanie budowy generuje teksturowany model 3D keycapa na podstawie zakończonego powodzeniem zadania prototypu i jednego z jego kandydatów. Generuje model 3D, koloruje go, osadza i wycina otwór na trzpień w podstawie keycapa, a następnie składa i eksportuje keycap.

Właściwości

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

    ID zadania. Nie polegaj na jego formacie.

  • Name
    type
    Type
    string
    Description

    Typ zadania, zawsze creative-lab-keycap-build.

  • Name
    name
    Type
    string
    Description

    Wartość name wysłana podczas tworzenia zadania lub "", jeśli jej nie wysłano.

  • Name
    status
    Type
    string
    Description

    Status zadania.

    Dostępne wartości:

    • PENDING: oczekiwanie w kolejce
    • IN_PROGRESS: generowanie wyniku
    • SUCCEEDED: wynik końcowy, z rezultatem
    • FAILED: wynik końcowy, z powodem w task_error
    • CANCELED: wynik końcowy, bez rezultatu
  • Name
    progress
    Type
    integer
    Description

    Procent wykonanej pracy, od 0 do 100. Wynosi 0 do czasu rozpoczęcia zadania i 100, gdy zakończy się powodzeniem.

  • Name
    created_at
    Type
    timestamp
    Description

    Czas utworzenia zadania, w milisekundach Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Czas rozpoczęcia zadania przez workera, w milisekundach Unix. Do tego czasu wartość to null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Czas osiągnięcia przez zadanie statusu końcowego, w milisekundach Unix. Do tego czasu wartość to null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Czas wygaśnięcia wyniku zadania, w milisekundach Unix. Przypada 3 dni po finished_at lub 3 dni po created_at, dopóki zadanie się nie zakończy. W przypadku kont Enterprise, które przechowują wyniki API bezterminowo, jest to około 100 lat później. Zobacz Przechowywanie zasobów.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Pozycja zadania w kolejce, gdy ma status PENDING. 1 oznacza, że zostanie uruchomione jako następne. 0 po opuszczeniu kolejki przez zadanie i zawsze 0 w wynikach listy.

  • Name
    task_error
    Type
    object
    Description

    Powód niepowodzenia zadania. null, chyba że status to FAILED. Zobacz Błędy.

  • Name
    consumed_credits
    Type
    integer
    Description

    Liczba kredytów naliczonych za zadanie, po uwzględnieniu ewentualnego zwrotu. Żądanie zwracające błąd nie jest obciążane opłatą. Nieudane zadanie ma wartość 0, ponieważ Meshy zwraca za nie kredyty. Anulowanie powoduje zwrot kredytów za zadanie tylko wtedy, gdy ma ono status PENDING. Jeśli Meshy nie może odczytać opłaty, odpowiedź typu get lub stream pomija to pole, a żądanie listy zwraca 500. W takim przypadku ponów żądanie.

  • Name
    model_urls
    Type
    object
    Description

    Adresy URL do pobrania modelu 3D. Meshy eksportuje plik GLB oraz pakiet OBJ w rzeczywistej skali w milimetrach, z osią Y skierowaną w górę, przy czym przód keycapa jest skierowany w stronę +Z.

    Model zawiera siatki o nazwach keycap-head i keycap-base. Gdy Meshy stosuje zastępcze wypełnienie wzorem dla podstawy, model zawiera również siatkę keycap-base-interior dla wnęki trzpienia. Nie zakładaj, że model ma dokładnie dwie siatki.

    Są to podpisane adresy URL, więc pobieraj je bez nagłówka Authorization. Pozostają ważne do expires_at, a ponowne pobranie zadania przed tym czasem zwraca te same adresy URL. Wygasłego adresu URL nie można odnowić, więc pobierz i zapisz pliki przed tym terminem.

    • Name
      glb
      Type
      string
      Description

      Adres URL do pobrania teksturowanego pliku GLB, model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      Adres URL do pobrania pakietu OBJ, pliku ZIP zawierającego model.obj, model.mtl oraz tekstury PNG używane przez model.mtl. Przy jednolitej kolorystycznie podstawie jedyną teksturą jest keycap-head.png. Przy podstawie z wzorem plik ZIP zawiera również keycap-base.png.

  • Name
    process_image_urls
    Type
    object
    Description

    Adresy URL do pobrania obrazów z poszczególnych etapów budowy, indeksowane według rodzaju. Podobnie jak model_urls, są to podpisane adresy URL, więc pobieraj je bez nagłówka Authorization. Pozostają ważne do expires_at, a ponowne pobranie zadania zwraca te same adresy URL.

    Może zawierać następujące klucze:

    • head_design: obraz projektu wybranego kandydata, który budowa przekształciła w model 3D. Zawsze obecny.
    • composite: obraz gotowego keycapa dla wybranego kandydata, na podstawie którego budowa pomalowała podstawę. Może być nieobecny.
    • base_canvas: pomalowana podstawa keycapa. Może być nieobecna.

    Meshy może dodawać kolejne klucze, więc ignoruj klucze, których nie rozpoznajesz.


Kompletny przykład end-to-end

Przykład realizuje cały przepływ:

  1. Utworzenie zadania prototypu ze zdjęcia.
  2. Pobieranie zadania do momentu, gdy jego status osiągnie wartość SUCCEEDED.
  3. Wybór kandydata z candidate_ids.
  4. Utworzenie zadania budowy z tym kandydatem.
  5. Pobieranie zadania budowy do momentu, gdy jego status osiągnie wartość SUCCEEDED.
  6. Pobranie pliku GLB oraz paczki OBJ z model_urls.

Przykład wybiera pierwszego kandydata. W swojej aplikacji wyświetl pozycje image_urls użytkownikom i pozwól im dokonać wyboru. Indeks wybranego obrazu w image_urls jest indeksem jego identyfikatora w 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"