Creative Lab — Keycap API

Bir kaynak fotoğrafı iki aşamada tam renkli, özel bir mekanik klavye tuş kapağına dönüştürün: prototip, girdi fotoğrafınızdan "bitmiş tuş kapağı" tasarım render'ı oluşturur. Bu render'ı onayladıktan sonra, build (yapılandırma) onu tek bir çalıştırmada dokulu bir 3D tuş kapağı modeline dönüştürür — beyaz model oluşturma, kalibre edilmiş varsayılan bir poz üzerinde otomatik yerleştirme ve kesme, tam model renklendirme ve nihai montajın tümü tek bir yapılandırma görevi içinde gerçekleşir. İki aşama, input_task_id ile candidate_id üzerinden birbirine bağlanır.

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

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

Bir Keycap Prototip Görevi Oluşturma

Kaynak fotoğraftan bitmiş bir keycap tasarım render'ı oluşturur. Görev sonucu, bir image_urls dizisi (bitmiş keycap'in görüntüleme render'ı) ve buna paralel bir candidate_ids dizisi taşır; her ikisi de tek bir giriş içerir. Sonuç istediğiniz gibi değilse başka bir render için bu uç noktayı tekrar çağırın — her çağrı ayrı ayrı faturalandırılır. candidate_id'yi prototip görev kimliğiyle birlikte build uç noktasına iletin. Yanıt şekli için Keycap Prototip Görevi Nesnesi başlığına bakın.

Parametreler

  • Name
    image_url
    Type
    string
    Zorunlu
    Description

    Meshy'nin keycap tasarım görsellerine dönüştürmesi için kaynak fotoğraf. Şu anda .jpg, .jpeg, .png ve .webp biçimlerini destekliyoruz.

    Biçim, görsel verisi çözümlenerek algılanır, URL'nin dosya uzantısından değil — uzantısı olmayan veya yönlendirme yapan bir URL, baytlar desteklenen bir biçime çözümlendiği sürece çalışır. HTTP yönlendirmeleri takip edilir. EXIF yönlendirmesi normalize edilir, böylece döndürülmüş bir telefon fotoğrafı göründüğü gibi kullanılır.

    Sınırlar: her kenarda en az 32 piksel, toplamda en fazla 178.956.970 piksel ve indirildikten sonra en fazla 20.000.000 bayt. Bir data URI için sınır çözümlenmiş baytlara uygulanır, dolayısıyla kaynak dosyanın kendisi bu boyuta kadar olabilir — yaklaşık üçte bir daha büyük olan base64 metnidir ve bu, istek gövdeniz için önemlidir, bu sınır için değil. Bir data URI, bir image/* içerik türü ve ;base64 bildirmelidir.

    Görseli sağlamanın iki yolu vardır:

    • Herkese açık erişilebilir URL: Genel internetten erişilebilen bir URL.
    • Data URI: Görselin base64 ile kodlanmış bir data URI'si. Data URI örneği: data:image/jpeg;base64,<base64 ile kodlanmış görsel verileriniz>.
  • Name
    name
    Type
    string
    Description

    Görüntüleme amaçlı isteğe bağlı görev adı. En fazla 100 karakter.

  • Name
    remove_background
    Type
    boolean
    varsayılan false
    Description

    true olarak ayarlandığında, image_urls içinde döndürülen görüntüleme render'ı, arka planı kaldırılmış şeffaf bir RGBA PNG olur; böylece herhangi bir arka plan üzerine yerleştirebilirsiniz.

    Bu yalnızca görüntüleme render'ı için geçerlidir. Build uç noktasının tükettiği aday bundan etkilenmez, dolayısıyla 3D sonuç her iki durumda da aynıdır.

Döndürülenler

Yanıtın result özelliği, yeni oluşturulan keycap prototip görevinin id'sini içerir. Görev SUCCEEDED durumuna ulaşana kadar Bir Görev Alma uç noktasını yoklayın veya stream'e abone olun, ardından candidate_ids içindeki girişi alın ve görev kimliğiyle birlikte build uç noktasına iletin.

Hata Modları

  • Name
    400 - Bad Request
    Description

    İstek kabul edilemedi. Yaygın nedenler:

    • Eksik parametre: image_url gereklidir.
    • Geçersiz görsel biçimi: Sağlanan image_url desteklenen bir biçim değil (.jpg, .jpeg, .png, .webp).
    • Görsel boyutları aralık dışında: Görsel çok küçük, maksimum dosya boyutunu aşıyor veya maksimum piksel sayısını aşıyor.
    • Erişilemeyen URL: image_url indirilemedi (404 veya timeout).
    • Geçersiz Data URI: Base64 dizesi hatalı biçimlendirilmiş.
    • İçerik işaretlendi: Girdi görseli NSFW moderation tarafından işaretlendi.
  • Name
    401 - Unauthorized
    Description

    Kimlik doğrulama başarısız oldu. Lütfen API anahtarınızı kontrol edin.

  • Name
    402 - Payment Required
    Description

    Hesap ücretsiz plandadır (görev oluşturmak için ücretli bir plan gereklidir) veya yeterli krediye sahip değildir.

  • Name
    403 - Forbidden
    Description

    Girdi görseli fikri mülkiyet moderation tarafından işaretlendi.

  • Name
    429 - Too Many Requests
    Description

    Hız sınırınızı aştınız.

  • Name
    500 - Internal Server Error
    Description

    Beklenmeyen bir sunucu tarafı hatası oluştu — örneğin içerik moderation hizmeti kullanılamıyordu, girdi görselinin hazırlanması başarısız oldu veya görev oluşturulamadı. Bu durumda hiçbir görev oluşturulmaz, dolayısıyla yeniden denemek güvenlidir.

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

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

Bir Keycap Build Görevi Oluştur

Başarılı bir prototip görevinden ve onun adaylarından biri kullanılarak nihai dokulu 3D keycap modelini oluşturur. Tek bir build görevi, tüm boru hattını uçtan uca çalıştırır — seçilen tasarımdan beyaz model üretimi, kalibre edilmiş bir varsayılan poz kullanılarak keycap tabanına otomatik oturtma ve kesme (etkileşimli ayarlama gerekmez), tüm modelin renklendirilmesi ve nihai montaj ile dışa aktarma. Bir build işlemi genellikle 3–7 dakika sürer; birden çok build eşzamanlı çalıştığında bu süre üst sınıra yaklaşır. Yanıt şekli için Keycap Build Görevi Nesnesi bölümüne bakın.

Parametreler

  • Name
    input_task_id
    Type
    string
    Zorunlu
    Description

    Aynı OpenAPI uç noktası üzerinden oluşturulmuş bir prototip görevinin görev kimliği. Prototip aynı Meshy hesabı tarafından oluşturulmuş olmalı, SUCCEEDED durumuna ulaşmış olmalı ve en az bir aday üretmiş olmalıdır.

    Webapp üzerinden oluşturulan prototip görevleri kabul edilmez — build uç noktası yalnızca POST /openapi/creative-lab/keycap/v1/prototype tarafından üretilen prototip görevlerini kabul eder ve başka herhangi bir kaynağı 404 ile reddeder.

  • Name
    candidate_id
    Type
    string
    Zorunlu
    Description

    Başarılı prototip görevinin candidate_ids dizisinden alınan, oluşturulacak aday. O göreve ait olmalıdır; başka herhangi bir değer 400 ile reddedilir.

  • Name
    name
    Type
    string
    Description

    Görüntüleme amaçlı isteğe bağlı görev adı. En fazla 100 karakter.

options

İsteğe bağlı geometri ayarları. Her alanın kalibre edilmiş bir varsayılanı vardır — yalnızca geçersiz kılmak istediklerinizi gönderin.

  • Name
    base_model
    Type
    string
    varsayılan cherry-mx-1x1-r1
    Description

    Üzerine inşa edilecek keycap tabanı. Şu anda mevcut olan tek değer cherry-mx-1x1-r1 — standart bir Cherry MX profilli 1u keycap. 3–5 ek yaygın standart boyut planlanmaktadır; özel boyutlar desteklenmemektedir.

  • Name
    head_size_mm
    Type
    number
    varsayılan 23
    Description

    Şekillendirilmiş kafanın hedef boyutu, milimetre cinsinden: en uzun boyutu bu değere ölçeklenir. Aralık: [10, 40]. Yaklaşık 32.9 üzerindeki değerler, kafanın hâlâ tabanın koruyucu ayak izi sınırına sığması için azaltılabilir; bu nedenle teslim edilen en uzun boyut istenenden küçük olabilir. Uygulanan değer bugün itibarıyla görev nesnesinde geri yansıtılmaz — gerçekte aldığınız boyutu doğrulamanız gerekiyorsa, indirilen modeldeki keycap-head ağının sınırlayıcı kutusunu ölçün.

  • Name
    vertical_offset_mm
    Type
    number
    varsayılan 0
    Description

    Kafa tabana oturtulmadan önce uygulanan dikey ofset, milimetre cinsinden. Aralık: [-5, 5].

Dönüş Değerleri

Yanıtın result özelliği, yeni oluşturulan keycap build görevinin id değerini içerir. Görev SUCCEEDED durumuna ulaşana kadar Bir Görev Al uç noktasını yoklayın veya stream'e abone olun, ardından çıktıları model_urls.glb ve model_urls.obj_zip üzerinden indirin.

Hata Modları

  • Name
    400 - Bad Request
    Description

    İstek kabul edilemedi. Yaygın nedenler:

    • Eksik parametre: input_task_id ve candidate_id zorunludur.
    • Geçersiz UUID: input_task_id geçerli bir UUID değil.
    • Üst görev başarılı değil: Referans verilen prototip görevi henüz SUCCEEDED durumuna ulaşmadı.
    • Aday yok: Prototip görevi başarılı oldu ancak hiçbir aday üretmedi.
    • Bilinmeyen aday: candidate_id, girdi görevinin adaylarından biri değil.
    • Seçenekler aralık dışında: options alanlarından biri izin verilen aralığın veya enum kümesinin dışında kaldı.
  • Name
    401 - Unauthorized
    Description

    Kimlik doğrulama başarısız oldu. Lütfen API anahtarınızı kontrol edin.

  • Name
    402 - Payment Required
    Description

    Hesap ücretsiz plan üzerinde (görev oluşturmak için ücretli bir plan gereklidir) veya yetersiz kredisi var.

  • Name
    404 - Not Found
    Description

    Referans verilen prototip görevi mevcut değil, farklı bir kullanıcıya ait veya webapp üzerinden oluşturulmuş (yalnızca API modundaki prototip görevleri build'e zincirlenebilir).

  • Name
    429 - Too Many Requests
    Description

    Hız sınırınızı aştınız.

  • Name
    500 - Internal Server Error
    Description

    Beklenmeyen bir sunucu tarafı hatası oluştu — örneğin içerik moderation hizmeti kullanılamadı, girdi görüntüsünün hazırlanması başarısız oldu veya görev oluşturulamadı. Bu durumda hiçbir görev oluşturulmaz, bu nedenle yeniden denemek güvenlidir.

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

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

Bir Keycap Görevini Getir

Geçerli bir görev id değeri verildiğinde bir prototip veya build görevini getirir. URL yolu, görevin aşamasıyla eşleşmelidir — /prototype/:id üzerinden getirilen bir build görevi 404 döndürür ve bunun tersi de geçerlidir.

Yanıt biçimleri için The Keycap Prototype Task Object ve The Keycap Build Task Object sayfalarına bakın.

Parametreler

  • Name
    id
    Type
    path
    Description

    Getirilecek keycap görevinin benzersiz tanımlayıcısı.

Dönüş Değerleri

Yanıt, keycap görev nesnesini içerir. Biçim, hangi aşamanın istendiğine bağlıdır.

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

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

Bir Keycap Görevini Sil

Bir keycap görevini iptal eder. Görev hâlâ PENDING durumundaysa, oluşturma sırasında tüketilen kredi iade edilir. Zaten IN_PROGRESS durumunda olan görevler iade yapılmadan iptal edilir (worker zaten kaynak tüketiyor olabilir). Zaten bir sonlanmış duruma (SUCCEEDED, FAILED, CANCELED) ulaşmış görevler iptal edilemez.

URL yolu, görevin aşamasıyla eşleşmelidir — /prototype/:buildId üzerinde DELETE işlemi 404 döndürür.

Yol Parametreleri

  • Name
    id
    Type
    path
    Description

    İptal edilecek keycap görevi için benzersiz tanımlayıcı.

Dönüş Değerleri

Başarılı olması durumunda boş bir gövdeyle 204 No Content döndürür.

Hata Modları

  • Name
    400 - Bad Request
    Description

    Görev zaten sonlanmış bir durumda ve iptal edilemez.

  • Name
    404 - Not Found
    Description

    Görev mevcut değil, farklı bir kullanıcıya ait veya aşaması URL yoluyla eşleşmiyor.

  • Name
    500 - Internal Server Error
    Description

    İptal işlemi sırasında beklenmeyen bir sunucu tarafı hatası oluştu. Görev iptal edilmiş veya edilmemiş olabilir — yeniden denemeden önce doğrulamak için görevi tekrar okuyun.

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).

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

Bir Keycap Görevini Akış Olarak Al

Server-Sent Events (SSE) aracılığıyla bir keycap görevi için gerçek zamanlı güncellemeleri akış olarak alın. URL yolu, görevin aşamasıyla eşleşmelidir — /prototype/:buildId/stream adresinde bir akış açmak, status_code: 404 ile tek bir event: error yükü yayınlar ve akışı kapatır.

Parametreler

  • Name
    id
    Type
    path
    Description

    Akış olarak alınacak keycap görevi için benzersiz tanımlayıcı.

Dönüş Değerleri

Server-Sent Events olarak bir Keycap Prototype veya Keycap Build görev nesnesi akışı döndürür. Her çerçeve, ilgili aşama için tam görev nesnesini taşır — bu, Get uç noktasının döndürdüğü ile aynı şekildir — bu nedenle görev PENDING veya IN_PROGRESS durumundayken çıktı alanları henüz doldurulmamıştır (null, [] veya {}) ve finished_at değeri null'dur.

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 PENDING frame below is abbreviated 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=***"
  }
}

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

Keycap Görevlerini Listele

Tek bir aşamaya ait keycap görevlerinizin sayfalanmış bir listesini alın. URL yolu aşamayı seçer — /prototype prototip görevlerini döndürür; /build üretim (build) görevlerini döndürür. Diğer aşamaya ait görevler her iki yanıta da dahil edilmez.

Yol Parametreleri

  • Name
    stage
    Type
    path
    Zorunlu
    Description

    prototype veya build olabilir. Koleksiyon yalnızca aşaması URL ile eşleşen görevleri döndürür — /prototype çağrısı asla build görevlerini döndürmez ve bunun tersi de geçerlidir.

Sorgu Parametreleri

  • Name
    page_num
    Type
    integer
    varsayılan 1
    Description

    Sayfalama için sayfa numarası.

  • Name
    page_size
    Type
    integer
    varsayılan 10
    Description

    Sayfa boyutu sınırı. İzin verilen maksimum 100 öğedir.

  • Name
    sort_by
    Type
    string
    varsayılan -created_at
    Description

    Sıralama yapılacak alan. Kullanılabilir değerler:

    • +created_at: Oluşturulma zamanına göre artan sırayla sırala.
    • -created_at: Oluşturulma zamanına göre azalan sırayla sırala.

Dönüş Değerleri

Aşama başına görev nesnesinin sayfalanmış bir listesini döndürür — /prototype listelenirken keycap prototip görevi nesnesi, /build listelenirken ise keycap üretim görevi nesnesi döndürülür.

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

Keycap Prototip Görevi Nesnesi

Keycap Prototip Görevi nesnesi, Meshy'nin bir kaynak fotoğraftan bitmiş keycap tasarım görüntüsü üretmek için takip ettiği bir iş birimidir. Bu aşamanın çıktısı, input_task_id ile candidate_id aracılığıyla derleme aşamasına zincirlenir.

Özellikler

  • Name
    id
    Type
    string
    Description

    Görev için benzersiz tanımlayıcı. Uygulama detayı olarak görev id'leri için k-sıralanabilir bir UUID kullansak da, id'nin formatı hakkında hiçbir varsayımda bulunmamalısınız.

  • Name
    type
    Type
    string
    Description

    Görevin türü. Değer creative-lab-keycap-prototype şeklindedir.

  • Name
    name
    Type
    string
    Description

    Görev oluşturulduğunda sağlanan görev adı. Ad sağlanmadıysa boş dizedir.

  • Name
    status
    Type
    string
    Description

    Görevin durumu. Olası değerler PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED değerlerinden biridir.

  • Name
    progress
    Type
    integer
    Description

    Görevin progress'i. Görev henüz başlamadıysa, bu özellik 0 olacaktır. Görev başarılı olduğunda, bu 100 olacaktır.

  • Name
    created_at
    Type
    timestamp
    Description

    Görevin oluşturulduğu zamanın milisaniye cinsinden zaman damgası.

  • Name
    started_at
    Type
    timestamp
    Description

    Görevin başladığı zamanın milisaniye cinsinden zaman damgası. Görev henüz başlamadıysa, bu özellik 0 olacaktır.

  • Name
    finished_at
    Type
    timestamp
    Description

    Görevin tamamlandığı zamanın milisaniye cinsinden zaman damgası. Görev henüz tamamlanmadıysa, bu özellik 0 olacaktır.

  • Name
    expires_at
    Type
    timestamp
    Description

    Görev sonucunun süresinin dolacağı zamanın milisaniye cinsinden zaman damgası.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Önceki görevlerin sayısı.

  • Name
    task_error
    Type
    object
    Description

    Başarısız görevler için hata detayları. Tam task_error nesne referansı için Hatalar bölümüne bakın.

  • Name
    consumed_credits
    Type
    integer
    Description

    Bu görev tarafından tüketilen kredi sayısı. SUCCEEDED durumuna ulaşan bir görevden, aşaması için tam tutar tahsil edilir. Hiç oluşturulmamış bir görevden (istek sırasında 4xx, moderation reddi dahil) hiç ücret alınmaz. FAILED durumuna ulaşan bir görev 0 döner — ücret iade edilir, asenkron moderation engeli dahil. DELETE ile iptal etmek yalnızca görev hâlâ PENDING durumundayken ücreti iade eder; zaten IN_PROGRESS durumundaki bir görev ücretlendirilmeye devam eder, çünkü iş harcanmıştır.

  • Name
    image_urls
    Type
    array of strings
    Description

    Bitmiş keycap tasarım render'ının indirilebilir URL'si — adayın bitmiş bir keycap olarak nasıl göründüğü. Tek bir giriş tutar; image_urls[i], candidate_ids[i]'ye karşılık gelir. Görev SUCCEEDED durumuna ulaşana kadar boştur. URL yalnızca görüntüleme amaçlıdır; derleme uç noktası bu URL'leri değil, candidate_ids'i tüketir. model_urls ile aynı URL yaşam döngüsüne sahiptir: imzalıdır, Authorization başlığı gerektirmez, expires_at'e kadar geçerlidir ve görev yeniden okunduğunda değişmez.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    image_urls ile paralel, opak aday tanımlayıcıları. Seçtiğiniz tasarıma karşılık gelen girişi derleme isteğinin candidate_id'si olarak geçirin. Bu id'lerin formatı hakkında hiçbir varsayımda bulunmayın.

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

Keycap Oluşturma Görevi Nesnesi

Keycap Oluşturma Görevi nesnesi, Meshy'nin başarılı bir prototip görevinden ve seçilen bir adaydan nihai dokulu 3D keycap'i oluşturmak için takip ettiği bir çalışma birimidir. Tek bir oluşturma işlemi, tüm iş akışını çalıştırır — beyaz model üretimi, otomatik oturtma ve kesme, renklendirme, montaj ve dışa aktarma.

Özellikler

  • Name
    id
    Type
    string
    Description

    Görev için benzersiz tanımlayıcı.

  • Name
    type
    Type
    string
    Description

    Görevin türü. Değer creative-lab-keycap-build şeklindedir.

  • Name
    name
    Type
    string
    Description

    Görev oluşturulurken belirtilen görev adı. Ad belirtilmemişse boş dizedir.

  • Name
    status
    Type
    string
    Description

    Görevin durumu. Olası değerler PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED değerlerinden biridir.

  • Name
    progress
    Type
    integer
    Description

    Görevin ilerlemesi (progress). Görev henüz başlamadıysa bu özellik 0 olur. Görev başarıyla tamamlandığında bu değer 100 olur.

  • Name
    created_at
    Type
    timestamp
    Description

    Görevin oluşturulduğu zaman damgası, milisaniye cinsinden.

  • Name
    started_at
    Type
    timestamp
    Description

    Görevin başladığı zaman damgası, milisaniye cinsinden.

  • Name
    finished_at
    Type
    timestamp
    Description

    Görevin tamamlandığı zaman damgası, milisaniye cinsinden.

  • Name
    expires_at
    Type
    timestamp
    Description

    Görev sonucunun süresinin dolduğu zaman damgası, milisaniye cinsinden.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Önceki görevlerin sayısı. Yalnızca durum PENDING olduğunda anlamlıdır.

  • Name
    task_error
    Type
    object
    Description

    Başarısız görevler için hata ayrıntıları. Tam task_error nesnesi referansı için Hatalar bölümüne bakın.

  • Name
    consumed_credits
    Type
    integer
    Description

    Bu görev tarafından tüketilen kredi sayısı. SUCCEEDED durumuna ulaşan bir görevden, aşamasına ait tam tutar tahsil edilir. Hiç oluşturulmamış bir görevden (istek anında bir 4xx hatası, moderation reddi dahil) hiçbir ücret alınmaz. FAILED durumuna ulaşan bir görev 0 döndürür — ücret, asenkron bir moderation engeli dahil olmak üzere iade edilir. DELETE ile iptal etme yalnızca görev hâlâ PENDING durumundayken ücreti iade eder; zaten IN_PROGRESS durumundaki bir görev, iş harcandığı için ücretlendirilmeye devam eder.

  • Name
    model_urls
    Type
    object
    Description

    Oluşturulan model dosyaları için indirilebilir URL'ler. Hem GLB hem de OBJ paketi gerçek dünya milimetre ölçeğinde, Y-yukarı olarak ve keycap'in ön yüzü +Z yönüne bakacak şekilde dışa aktarılır. Ağlar (mesh) keycap-head ve keycap-base olarak adlandırılır; taban bir desen doldurmasına geri döndüğünde, sap boşluğu için üçüncü bir ağ olan keycap-base-interior de bulunur. Tam olarak iki ağ olduğunu varsaymayın.

    Bunlar imzalı URL'lerdir: bunları bir Authorization başlığı olmadan getirin. expires_at değerine kadar geçerli kalırlar; bu değer finished_at'ten 3 gün sonrasıdır ve bu süre içinde görevi yeniden okumak, yeni imzalanmış bir URL yerine aynı URL'yi döndürür. Dosyaları bu süre dolmadan kendiniz indirip saklayın — süresi dolmuş bir bağlantıyı yenilemenin bir yolu yoktur.

    • Name
      glb
      Type
      string
      Description

      Nihai dokulu model.glb için indirilebilir URL.

    • Name
      obj_zip
      Type
      string
      Description

      model.obj, model.mtl ve MTL'sinin gerçekten referans verdiği doku PNG'lerini içeren bir zip paketi için indirilebilir URL. Tek renkli bir taban yalnızca keycap-head.png içerir; desenli bir taban ayrıca keycap-base.png de içerir.

  • Name
    process_image_urls
    Type
    object
    Description

    Türe göre anahtarlandırılmış, ara işlem görüntüleri için indirilebilir URL'ler. model_urls ile aynı URL yaşam döngüsüne sahiptir: imzalıdır, Authorization başlığı gerektirmez, expires_at'e kadar geçerlidir ve görev yeniden okunduğunda değişmez kalır. Şu anda üretilen türler:

    • head_design — oluşturma işleminin tükettiği, seçilen adayın tasarım görüntüsü (her zaman mevcuttur).
    • composite — seçilen adayın tamamlanmış keycap görüntüleme render'ı (mevcut olduğunda bulunur).
    • base_canvas — boyanmış keycap tabanı tuvali (mevcut olduğunda bulunur).

    Anahtar kümesini açık uçlu olarak değerlendirin; yeni türler kırıcı bir değişiklik olmadan eklenebilir.

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

Uçtan Uca Örnek

Eksiksiz akış: bir fotoğraftan prototip oluşturma, SUCCEEDED durumuna kadar sorgulama, candidate_ids içinden bir aday seçme, bu adayla bir yapı (build) oluşturma, yapıyı SUCCEEDED durumuna kadar sorgulama, ardından model_urls üzerinden GLB ve OBJ paketini indirme.

Örnek, ilk adayı programatik olarak seçer. Gerçek bir entegrasyonda, image_urls girdisini son kullanıcıya gösterip seçim yapmasına izin verirsiniz; seçilen indeks candidate_ids ile birebir eşleşir.

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"