GetFacade aracı API'si
MCP ve HTTP üzerinden cephe tasarımı. Her tasarım, binanın bulunduğu ülkeye göre işlenir: orada uygulanabilir malzemeler, üreticilerin orada gerçekten sattığı ürünler ve yüzeyin ardındaki teknik katman kurgusu. Render bunu evin fotoğrafı üzerinde gösterir, maliyet tahmini kalem kalem fiyatlandırır, PDF albüm ise uygulamayı yapacak ekip için kayda geçirir. Aşağıdaki her yol mevcut bir GetFacade uç noktasıdır, iOS, Android ve web uygulamalarının çağırdığının aynısı. Ajan anahtarı yalnızca kimin çağırabileceğini daraltır, harcamayı ölçer ve kendi tavanında durur.
- Temel URL
- https://api.getfacade.ai/api/v1
- Kimlik doğrulama
- Bearer <agent key>
- Paket
- @getfacade/mcp
- Çalışma ortamı
- Node.js 20+
- Taşıma
- stdio (MCP), HTTPS (REST)
- Belirtim
- OpenAPI 3.1, v1.0.0
Hızlı başlangıç
Bir anahtar oluşturun
app.getfacade.aiHesapAyarlarAPIAnahtar oluştur
Değer bir kez gösterilir; geri alınamaz, yalnızca değiştirilebilir. Harcama tavanı oluşturma anında belirlenir ve her ücretli çağrıda uygulanır.
Aracı anahtarı oluşturMCP sunucusunu tanımlayın
İstemci yapılandırmasına tek bir kayıt, sonra istemciyi yeniden başlatın. Claude Desktop bunu claude_desktop_config.json içinde tutar; diğer her MCP istemcisi aynı üç alanı kabul eder.
{ "mcpServers": { "getfacade": { "command": "npx", "args": ["-y", "@getfacade/mcp"], "env": { "GETFACADE_API_KEY": "your-key" } } } }Ortam değişkenleri Değişken Zorunlu Varsayılan GETFACADE_API_KEYEvet —GETFACADE_API_BASE_URLHayır https://api.getfacade.ai/api/v1Ya da HTTP API'sini doğrudan çağırın
Aynı anahtar Bearer jetonu olarak çalışır. İstekler ve yanıtlar JSON:API belgeleridir; id üst düzey bir alandır ve hiçbir zaman attributes içinde yer almaz.
curl -X POST https://api.getfacade.ai/api/v1/projects \ -H "Authorization: Bearer $GETFACADE_API_KEY" \ -H "Content-Type: application/json" \ -d '{"data":{"type":"project","attributes":{"name":"Maple Street 14"}}}'
Araçlar
Yirmi bir araç. MCP sunucusu durum tutmaz ve kendine ait kural taşımaz: her araç, yanında yazan uç noktalara yapılan bir veya birkaç çağrıdır ve aracının aktardığı her mesajı API yazar.
create_buildingcreate_building(name, goals?, construction_region?) -> { building_id, name }Bir bina oluşturur. Ad hesap içinde benzersizdir ve en fazla 50 karakterdir; yinelenen ad 422 ile reddedilir.
Çağırır
POST /projectsupload_photoupload_photo(building_id, file_path, wait_for_validation? = true) -> { view_id, validation: { status, reason? } }Bir görünüm kaydeder, baytları önceden imzalanmış bir adrese yükler, onaylar ve fotoğraf kabul veya reddedilene kadar sorgular. Genişlik, yükseklik ve md5 yerelde hesaplanır; en boy oranını sunucu çıkarır.
Çağırır
POST /projects/{project}/angles → PUT (presigned) → POST /angles/{angle}/confirm → GET /angles/{angle}/validationstart_designeşzamansızstart_design(building_id, view_id, prompt?, style_ids?, colors?, brand_selections?, render_effort?, seed?) -> { design_id, job_id, status, seed }Seçilen görünüş üzerinde cepheyi tasarlar ve fotoğrafta gösterir: binanın bulunduğu ülkede uygulanabilir malzemeler, orada gerçekten satılan ürünler ve yüzeyin ardındaki katman kurgusu. Bir tasarım oluşturur, işi kuyruğa alır ve iş id'sini döndürür. Seed isteğe bağlıdır: verilmezse sunucu kendisi üretir ve geri döndürür.
Çağırır
POST /projects/{project}/concepts → POST /concepts/{concept}/angles/{conceptAngle}/rendersrefine_designeşzamansızrefine_design(render_id | design_id + building_id, instruction, style_ids?, colors?, brand_selections?, render_effort?, seed?) -> { design_id, job_id, status, parent_render_id, seed }Bitmiş bir tasarımı sözle revize eder. Talimat bitmiş tasarıma uygulanır, dolayısıyla değinilmeyen her şey olduğu gibi kalır. Ana görünüşü revize etmek yeni bir tasarım oluşturur, böylece önceki asla üzerine yazılmaz.
Çağırır
GET /renders/{render} → POST /concepts/{concept}/angles/{conceptAngle}/renders (mode: refine)get_jobget_job(job_id, kind: "render" | "album" | "estimate" = "render") -> { status, expected_seconds?, result_url?, error?, error_code? }Tek bir render'ın, tahminin veya albümün durumunu okur.
Çağırır
GET /renders/{render} · GET /estimates/{estimate}list_jobslist_jobs(kind?, limit? = 20) -> [{ job_id, kind, status, building_id, created_at }]Hesaptaki son işler, tamamlanmamışlar üstte.
Çağırır
GET /historylist_designslist_designs(building_id) -> [{ design_id, note, has_main_render, main_render_id, main_render_url, renders }]Bir binanın tasarımları ve render'ları. Tahmin ve albüm için gereken render kimlikleri buradan gelir.
Çağırır
GET /projects/{project}/conceptsorder_estimateeşzamansızorder_estimate(design_id, render_ids, currency?, measurement_system?, special_requirements?) -> { job_id, status }Tasarımı kalem kalem, malzeme ve işçilik olarak fiyatlandırır; fiyatlar belirtilen malzemelerin binanın bulunduğu ülkedeki karşılığıdır. Para birimi ve ölçü sistemi varsayılan olarak o ülkeden alınır.
Çağırır
POST /projects/{project}/concepts/{concept}/estimatesorder_albumeşzamansızorder_album(design_id, render_ids, language?, include_blueprints?, include_estimate?, requirements?) -> { job_id, status }Tasarımı, uygulamayı yapacak ekip için kayda geçirir: malzemeler, cephenin katman kurgusu, güvenlik notları ve bunların dayandığı normlar. Tamamlanmış bir ana render gerektirir.
Çağırır
POST /concepts/{concept}/album/generateupscale_rendereşzamansızupscale_render(render_id) -> { job_id, status }Tamamlanmış bir görselleştirmeyi büyütür. Jeton harcar ve asenkron çalışır.
Çağırır
POST /renders/{render}/upscaleget_estimateget_estimate(estimate_id) -> { status, currency, facade_area, materials_total, labor_total, grand_total, notes, lines: [{ line_id, section, name, quantity, unit, unit_price, line_total }] }Keşfin kendisi: toplamlar, arkalarındaki varsayımlar ve miktarı, birimi ve fiyatıyla her satır. get_job bir keşfin durumunu bildirir, içeriğini asla.
Çağırır
GET /estimates/{estimate}add_estimate_lineadd_estimate_line(estimate_id, section, name, quantity, unit_price, unit?, category?) -> { line_id }Keşfe bir satır ekler. Birimler keşfin kendi ölçü sisteminden gelir.
Çağırır
POST /estimates/{estimate}/itemsupdate_estimate_lineupdate_estimate_line(estimate_id, line_id, name?, quantity?, unit_price?, unit?, category?, section?) -> { line_id }Keşfin bir satırını değiştirir. Yalnızca gönderilen alanlar değişir; toplamları sunucu yeniden hesaplar.
Çağırır
PATCH /estimates/{estimate}/items/{item}delete_estimate_linedelete_estimate_line(estimate_id, line_id) -> { deleted }Keşiften bir satırı kaldırır.
Çağırır
DELETE /estimates/{estimate}/items/{item}delete_renderdelete_render(render_id) -> { deleted }Bir görselleştirmeyi siler. Ana görselleştirme silinirse tasarımı taslağa döner.
Çağırır
DELETE /renders/{render}delete_designdelete_design(building_id, design_id) -> { deleted }Bir tasarımı, altındaki görselleştirmelerle birlikte siler.
Çağırır
DELETE /projects/{project}/concepts/{concept}delete_buildingdelete_building(building_id) -> { deleted }Bir binayı içindeki her şeyle siler. Harcanmış jetonlar iade edilmez.
Çağırır
DELETE /projects/{project}list_token_packageslist_token_packages() -> [{ package, tokens, price, currency }]Bu hesabın satın alabileceği paketler, fiyat ve jeton sayısıyla.
Çağırır
GET /tokens/packagesbuy_tokenseşzamansızbuy_tokens(package) -> { status, transaction_id, tokens, checkout_url?, detail }Bu anahtarın cüzdanına bir paket satın alır. Satın alma izniyle oluşturulmuş bir anahtar gerektirir ve anahtarın hâlâ harcayabileceğini asla aşmaz.
Çağırır
POST /tokens/purchaseget_balanceget_balance() -> { balance, scope: "api", spend_cap, spent, remaining, is_admissible }Aracı cüzdanı, bu anahtarın tavanı ve bir sonraki ücretli çağrının kabul edilip edilmeyeceği.
Çağırır
GET /tokens/balancereport_problemreport_problem(message, category?, context?: { tool, endpoint, status_code, job_id, expected, actual }) -> { reference, message }Bu API'deki bir kusuru bildirir: burada anlatılan ama hiç gelmeyen bir alan, ifadesinden sonraki adım çıkmayan bir ret, istenene uymayan bir sonuç. Ücretsizdir ve boş cüzdanla da kabul edilir; geriye bir referans döner, yanıt değil.
Çağırır
POST /feedback
Kimlik doğrulama ve anahtarlar
- Anahtar,
Authorizationbaşlığında Bearer jetonu olarak taşınır. MCP sunucusu onuGETFACADE_API_KEYdeğişkeninden okur ve başka bir şey göndermez. - Değer oluşturma anında bir kez gösterilir ve yalnızca özeti saklanır. Döndürme, yeni bir anahtar oluşturup eskisini iptal etmek demektir.
- Her anahtar bir harcama tavanı taşır; bu tavan, çağrı bir denetleyiciye ulaşmadan önce sunucuda uygulanır. Tavana ulaşmak o anahtarı durdurur, hesabı değil.
- Anahtarlar anahtar yönetmez: bu bir insan eylemidir ve ilgili uç noktalar aracı anahtarına 403 yanıtı verir.
- İptal hemen geçerli olur. İptal edilmiş anahtarla yapılan çağrılar 401 döndürür.
Eşzamansız iş ve durum sorgulama
start_design,order_estimateveorder_albumbir iş kimliği döndürüp biter. Render dakikalar sürer: durum kesinleşene kadarGET /renders/{render}veyaGET /estimates/{estimate}sorgulayın.- Fotoğraf doğrulamasının bittiğini, aracıda bulunmayan bir websocket bildirir.
GET /angles/{angle}/validationsorgulayın vevalidation.is_in_progressalanını okuyun; kesinliği durum metninden kendiniz çıkarmayın. - Tamamlanmış render ve albüm kalıcı genel adreslerde durur: imzasız ve süresiz. Bu bağlantı doğrudan bir kişiye verilebilir; «sonucu göster» sorusunun yanıtı budur. İmzasız olduğu için kimseden izin istemez: eline geçen herkeste çalışmayı sürdürür ve sonradan geri alınamaz.
GET /renders/{render}/downloadbaşka bir şeydir: dakikalar içinde geçerliliğini yitiren ve dosya adı taşıyan imzalı bir URL. Dosyayı kaydetmek içindir, paylaşmak için değil.
Anahtar başına hız sınırları
Aracı anahtarının, aynı hesabın insan oturumlarından ayrı kendi kotaları vardır; böylece döngüye giren bir aracı, ekran başındaki kişinin kotasını yemez. Ret ucuzdur: ara katmanda, herhangi bir veritabanı işinden önce verilir.
| Kapsam | Dakikada | Saatte |
|---|---|---|
| Okuma ve olağan yazma | 120 | 2000 |
| Durum ve doğrulama sorguları | 120 | 2000 |
| Render, tahmin ve albüm siparişleri | 10 | 200 |
Idempotency
Ücretli bir çağrı bir iş oluşturur ve ücret işi takip eder. Çağrıya ad vermek, tekrarın ikinci bir iş oluşturmak yerine aynı işi döndürmesini sağlayan şeydir.
- API anahtarıyla yapılan her ücretli çağrıda
Idempotency-Keyzorunludur: tasarım başlatma veya iyileştirme, render büyütme, keşif ya da albüm siparişi, keşfi yeniden üretme. Başlık olmadan çağrı 422IDEMPOTENCY_KEY_REQUIREDyanıtı verir ve sıraya hiçbir şey girmez. - 8 ile 191 karakter arasında herhangi bir değer, sipariş başına bir tane; genellikle UUID kullanılır. Yeni sipariş yeni değer alır: iki değer altındaki iki aynı çağrı, iki tasarımdır.
- Aynı değer ve aynı gövdeyle çağrıyı tekrarlamak, yanıtta
Idempotent-Replay: trueile birlikte özgün durumu ve gövdeyi döndürür. Sıraya hiçbir şey girmez ve iki kez ücret alınmaz. - Aynı değer farklı bir gövdeyle 422
IDEMPOTENCY_KEY_REUSEDyanıtı verir. İlk çağrı sürerken gelen tekrar 409IDEMPOTENCY_IN_PROGRESSyanıtı verir: bekleyin ve aynı çağrıyı yeniden gönderin. - Herhangi bir 4xx değeri serbest bırakır; neden giderildiğinde aynı değer yeniden gönderilebilir. Değerler hesap bazında 24 saat hatırlanır.
@getfacade/mcpdeğeri kendisi üretir ve çağrıyı onunla kendisi yineler, bu yüzden araç çağrısında iletilecek bir şey yoktur.
Hatalar
Başarısızlıklar JSON:API hata belgeleri olarak gelir. Laravel doğrulama yanıtları JSON:API biçiminde değildir ve metinlerini message alanında taşır.
| Durum | Kod | Anlamı | Yeniden denenebilir |
|---|---|---|---|
401 | — | Anahtar yok, iptal edilmiş ya da süresi dolmuş. | Hayır |
402 | AGENT_CREDITS_EXHAUSTED | Hesapta api kapsamında kredi kalmadı. | Hayır |
402 | AGENT_KEY_CAP_REACHED | Bu anahtar tavanını harcadı. Başka bir anahtar oluşturun ya da tavanı yükseltin. | Hayır |
403 | — | Bu uç nokta API anahtarlarına açık değildir. Aracı API'si binaları, fotoğrafları, tasarımları, render'ları, keşifleri, albümleri ve API cüzdanını kapsar. Hesap, oturum açma ve ödeme ayarlarını uygulamada oturum açmış bir kişi değiştirir. | Hayır |
403 | AGENT_PURCHASE_NOT_ALLOWED | Bu anahtar, jeton satın alma izni olmadan oluşturuldu. | Hayır |
403 | AGENT_PURCHASE_EXCEEDS_CAP | Satın alma, anahtarı harcama tavanının ötesine taşırdı. | Hayır |
409 | IDEMPOTENCY_IN_PROGRESS | Bu Idempotency-Key ile gönderilen ilk çağrı henüz yanıt vermedi. Bekleyin ve aynı çağrıyı yeniden gönderin. | Evet |
422 | — | İstek anlaşıldı ve reddedildi: yinelenen bina adı, reddedilen fotoğraf, ana render bitmeden sipariş edilen albüm. | Hayır |
422 | IDEMPOTENCY_KEY_REQUIRED | API anahtarıyla yapılan, Idempotency-Key başlığı olmayan ücretli bir çağrı. Sıraya bir şey girmedi; başlıkla yeniden gönderin. | Hayır |
422 | IDEMPOTENCY_KEY_REUSED | Bu Idempotency-Key başka bir istek için kullanılmış. Yeni bir sipariş için yeni bir değer kullanın. | Hayır |
429 | — | Bu anahtarın kendi kotası tükendi. Bekleyin, sıkı bir döngüde yeniden denemeyin. | Evet |
Okunabilir metni API yazar, çağıranın dilinde. errors[].detail alanını olduğu gibi gösterin, kendi mesajınızı kurmayın.
Ücretlendirme ve kabul
- Ücretli çağrılar
apikapsamındaki kredilerden düşer ve kabul yalnızca bu bakiyeye bakar: her anahtar kredi öder. - Etkin bir Pro Plan,
apicüzdanını her fatura döneminde bir kez 1.000 krediye tamamlar. Bunun ötesinde krediler satın alınır. - Bir anahtar kendi cüzdanını yalnızca satın alma izniyle oluşturulmuşsa doldurur ve en fazla hâlâ harcayabileceği kadar; yani satın alma harcama tavanını asla yükseltmez.
apikapsamı ayrı bir cüzdandır. Uygulamanın kredileri, ücretsiz kademe dahil, bir anahtar tarafından asla harcanmaz.- Harcama anahtar başına sayılır; böylece her asistanın tüketimi ayrı görünür.
- Ön kontrol
GET /tokens/balance, alandata.attributes.agent.is_admissible. Blok yalnızca aracı anahtarlarında bulunur ve bayrak kabul ara katmanını birebir yansıtır. Bakiyeyi tavanla kendiniz karşılaştırmak yerine bu bayrağı okuyun. - Kabul, iş kuyruğa alınmadan önce verilir; bu yüzden reddedilen çağrı hiçbir şey harcamaz.
Renk ve marka jetonları
start_design, her biri en fazla on kayıtlık iki bağımsız liste alır. Sıra 60/30/10 rolünü taşır: ilk kayıt duvarların baskın rengidir.
colors
| Jeton | Anlamı |
|---|---|
palette:1 | Hazır bir GetFacade şeması, kimliğiyle. |
#8A8F7D | Serbest bir renk, altı onaltılık basamak. |
paint:412 | Üretici renk kartelası, uyumluluk için korunan iki bölümlü biçimde. |
brand_selections
| Jeton | Anlamı |
|---|---|
siding:brand:12 | O üreticinin bu kategorideki herhangi bir ürünü. |
siding:line:40@double-4-dutchlap | Tek bir seri, tek bir geometride. |
siding:product:88@double-4-dutchlap | Tam olarak belirtilmiş tek bir ürün. |
paint:brand:3 | O boya markasının herhangi bir rengi. |
paint:product:412 | Tek bir boya rengi. |
Dilbilgisi şudur: category:level:id[@value][.value]. @ işaretinden sonraki bölüm, kendi kategorisi içinde benzersiz olan geometri değeri kısa adlarını taşır; bu yüzden ait oldukları eksen jetona yazılmaz, aranır. Bilinmeyen jeton 422 ile reddedilir, sessizce yok sayılmaz.
Uçtan uca oturum
Bir bina, bir fotoğraf, bir tasarım ve ardından iki belge. Bunu üreten yönerge:
Maple Street 14 adında bir bina oluştur, ./front.jpg dosyasını görünümü olarak yükle ve sıcak gri duvarlar ile beyaz denizliklerle bir tasarım başlat. Sonuç için tahmini ve albümü sipariş et.
create_building(name: "Maple Street 14")
-> { building_id: "0f8c…" }
upload_photo(building_id: "0f8c…", file_path: "./front.jpg")
-> { view_id: "41ab…", validation: { status: "approved" } }
start_design(building_id: "0f8c…", view_id: "41ab…",
colors: ["#8A8F7D", "#F2F0EB"],
brand_selections: ["siding:line:40@double-4-dutchlap"])
-> { design_id: "7d21…", job_id: "b933…", status: "queued" }
get_job(job_id: "b933…")
-> { status: "completed", result_url: "https://…" }
refine_design(render_id: "b933…",
instruction: "put a canopy over the front door")
-> { design_id: "9e44…", job_id: "c07f…", status: "queued" }
order_estimate(design_id: "9e44…", render_ids: ["c07f…"])
order_album(design_id: "9e44…", render_ids: ["c07f…"], include_estimate: true)