GetFacades agent-API
Fasadeprosjektering via MCP og HTTP. Hver design arbeides fram for landet bygget står i: materialer som kan brukes der, produkter produsentene faktisk selger der, og den tekniske oppbygningen bak overflaten. En render viser det på bildet av huset, kostnadsoverslaget priser det linje for linje, og PDF-albumet dokumenterer det for laget som bygger. Hver sti nedenfor er et eksisterende GetFacade-endepunkt, det samme som iOS-, Android- og webappen kaller. En agentnøkkel begrenser bare hvem som får kalle det, måler forbruket og stopper ved taket sitt.
- Basis-URL
- https://api.getfacade.ai/api/v1
- Autentisering
- Bearer <agent key>
- Pakke
- @getfacade/mcp
- Kjøremiljø
- Node.js 20+
- Transport
- stdio (MCP), HTTPS (REST)
- Spesifikasjon
- OpenAPI 3.1, v1.0.0
Hurtigstart
Opprett en nøkkel
app.getfacade.aiKontoInnstillingerAPIOpprett nøkkel
Verdien vises én gang og kan ikke gjenopprettes, bare erstattes. Forbrukstaket settes ved opprettelsen og gjelder ved hvert betalte kall.
Opprett en agentnøkkelRegistrer MCP-serveren
Én oppføring i klientens konfigurasjon, så omstart av klienten. Claude Desktop holder den i claude_desktop_config.json; enhver annen MCP-klient tar de samme tre feltene.
{ "mcpServers": { "getfacade": { "command": "npx", "args": ["-y", "@getfacade/mcp"], "env": { "GETFACADE_API_KEY": "your-key" } } } }Miljøvariabler Variabel Påkrevd Standardverdi GETFACADE_API_KEYJa —GETFACADE_API_BASE_URLNei https://api.getfacade.ai/api/v1Eller kall HTTP-API-et direkte
Samme nøkkel fungerer som bearer-token. Forespørsler og svar er JSON:API-dokumenter, der id er et felt på øverste nivå og aldri ligger inne i attributes.
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"}}}'
Verktøy
Tjueen verktøy. MCP-serveren holder ingen tilstand og ingen egne regler: hvert verktøy er ett eller flere kall til endepunktene ved siden av, og hver melding agenten gjengir er skrevet av API-et.
create_buildingcreate_building(name, goals?, construction_region?) -> { building_id, name }Oppretter en bygning. Navnet er unikt innenfor kontoen og maks 50 tegn; en duplikat avvises med 422.
Kaller
POST /projectsupload_photoupload_photo(building_id, file_path, wait_for_validation? = true) -> { view_id, validation: { status, reason? } }Registrerer en visning, laster opp bytene til en forhåndssignert URL, bekrefter dem og spør til bildet er godtatt eller avvist. Bredde, høyde og md5 beregnes lokalt; sideforholdet utleder serveren.
Kaller
POST /projects/{project}/angles → PUT (presigned) → POST /angles/{angle}/confirm → GET /angles/{angle}/validationstart_designasynkronstart_design(building_id, view_id, prompt?, style_ids?, colors?, brand_selections?, render_effort?, seed?) -> { design_id, job_id, status, seed }Prosjekterer fasaden på en valgt visning og viser den på bildet: materialer som kan brukes i byggets land, produkter som faktisk selges der, og oppbygningen bak overflaten. Oppretter en design, køer arbeidet og returnerer jobb-id. Seed er valgfritt: utelates det, genererer serveren en og returnerer den.
Kaller
POST /projects/{project}/concepts → POST /concepts/{concept}/angles/{conceptAngle}/rendersrefine_designasynkronrefine_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 }Reviderer en ferdig design med ord. Instruksjonen brukes på den ferdige designen, så alt den ikke nevner beholdes. Å revidere en hovedvisning oppretter en ny design, så den forrige overskrives aldri.
Kaller
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? }Leser tilstanden til én rendering, ett overslag eller ett album.
Kaller
GET /renders/{render} · GET /estimates/{estimate}list_jobslist_jobs(kind?, limit? = 20) -> [{ job_id, kind, status, building_id, created_at }]Nylige jobber på tvers av kontoen, uferdige først.
Kaller
GET /historylist_designslist_designs(building_id) -> [{ design_id, note, has_main_render, main_render_id, main_render_url, renders }]Bygningens design med sine renderinger. Herfra kommer render-id-ene til overslag og album.
Kaller
GET /projects/{project}/conceptsorder_estimateasynkronorder_estimate(design_id, render_ids, currency?, measurement_system?, special_requirements?) -> { job_id, status }Priser designen linje for linje, i materialer og arbeid, til det de angitte materialene koster i byggets land. Valuta og målesystem følger som standard det landet.
Kaller
POST /projects/{project}/concepts/{concept}/estimatesorder_albumasynkronorder_album(design_id, render_ids, language?, include_blueprints?, include_estimate?, requirements?) -> { job_id, status }Dokumenterer designen for laget som bygger: materialene, fasadens oppbygning, sikkerhetsnotater og normene bak dem. Krever en ferdig hovedrender.
Kaller
POST /concepts/{concept}/album/generateupscale_renderasynkronupscale_render(render_id) -> { job_id, status }Forstørrer en ferdig rendering. Koster tokens og kjøres asynkront.
Kaller
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 }] }Selve overslaget: summer, forutsetningene bak dem og hver linje med mengde, enhet og pris. get_job melder statusen til et overslag, aldri innholdet.
Kaller
GET /estimates/{estimate}add_estimate_lineadd_estimate_line(estimate_id, section, name, quantity, unit_price, unit?, category?) -> { line_id }Legger til en linje i kalkylen. Enhetene kommer fra dens eget målesystem.
Kaller
POST /estimates/{estimate}/itemsupdate_estimate_lineupdate_estimate_line(estimate_id, line_id, name?, quantity?, unit_price?, unit?, category?, section?) -> { line_id }Endrer en linje i kalkylen. Bare feltene som sendes endres; serveren regner ut summene på nytt.
Kaller
PATCH /estimates/{estimate}/items/{item}delete_estimate_linedelete_estimate_line(estimate_id, line_id) -> { deleted }Fjerner en linje fra kalkylen.
Kaller
DELETE /estimates/{estimate}/items/{item}delete_renderdelete_render(render_id) -> { deleted }Sletter en rendering. Slettes hovedrenderingen, går designet tilbake til utkast.
Kaller
DELETE /renders/{render}delete_designdelete_design(building_id, design_id) -> { deleted }Sletter et design med renderingene under det.
Kaller
DELETE /projects/{project}/concepts/{concept}delete_buildingdelete_building(building_id) -> { deleted }Sletter en bygning med alt innholdet. Allerede brukte tokens refunderes ikke.
Kaller
DELETE /projects/{project}list_token_packageslist_token_packages() -> [{ package, tokens, price, currency }]Pakkene kontoen kan kjøpe, med pris og antall tokens.
Kaller
GET /tokens/packagesbuy_tokensasynkronbuy_tokens(package) -> { status, transaction_id, tokens, checkout_url?, detail }Kjøper én pakke til lommeboken til denne nøkkelen. Krever en nøkkel utstedt med kjøp slått på, og går aldri utover det nøkkelen fortsatt kan bruke.
Kaller
POST /tokens/purchaseget_balanceget_balance() -> { balance, scope: "api", spend_cap, spent, remaining, is_admissible }Agentlommeboken, taket for denne nøkkelen og om neste betalte kall blir sluppet gjennom.
Kaller
GET /tokens/balancereport_problemreport_problem(message, category?, context?: { tool, endpoint, status_code, job_id, expected, actual }) -> { reference, message }Rapporterer en feil i dette API-et: et felt som er beskrevet her, men aldri kommer, et avslag der ordlyden ikke viser veien videre, et resultat som ikke svarer til bestillingen. Gratis og godtatt med tom saldo; tilbake kommer en referanse, ikke et svar.
Kaller
POST /feedback
Autentisering og nøkler
- Nøkkelen sendes som bearer-token i
Authorization-hodet. MCP-serveren leser den fraGETFACADE_API_KEYog sender ikke noe annet. - Verdien vises én gang, ved opprettelsen, og bare hashen lagres. Rotering betyr å opprette en ny nøkkel og trekke tilbake den gamle.
- Hver nøkkel bærer et forbrukstak som håndheves på serveren før kallet når en kontroller. Et nådd tak stopper den nøkkelen, ikke kontoen.
- Nøkler administrerer ikke nøkler: det er en menneskelig handling, og de endepunktene svarer 403 på en agentnøkkel.
- Tilbaketrekking virker umiddelbart. Kall med en tilbaketrukket nøkkel svarer 401.
Asynkront arbeid og polling
start_design,order_estimateogorder_albumreturnerer en jobb-id og er dermed ferdige. En rendering tar minutter: pollGET /renders/{render}ellerGET /estimates/{estimate}til tilstanden er endelig.- At bildekontrollen er ferdig, meldes over en websocket agenten ikke har. Poll
GET /angles/{angle}/validationog lesvalidation.is_in_progress; utled ikke selv sluttilstanden fra statusteksten. - En ferdig render og et ferdig album ligger på permanente offentlige URL-er: uten signatur og uten utløp. Lenken kan gis direkte til en person, som svar på «vis meg resultatet». Siden den ikke er signert, spør den ingen om lov: den fortsetter å virke for alle som får den, og kan ikke trekkes tilbake.
GET /renders/{render}/downloader noe annet: en signert URL som utløper i løpet av minutter og bærer et filnavn. Den er til for å lagre filen, ikke for å dele den.
Ratebegrensninger per nøkkel
En agentnøkkel har egne kvoter, atskilt fra de menneskelige øktene på samme konto, slik at en agent i løkke ikke spiser opp kvoten til personen foran skjermen. Avslaget er billig: det tas i mellomvaren, før alt databasearbeid.
| Område | Per minutt | Per time |
|---|---|---|
| Lesing og vanlig skriving | 120 | 2000 |
| Status- og kontrollpolling | 120 | 2000 |
| Bestilling av rendering, overslag og album | 10 | 200 |
Idempotens
Et betalt kall oppretter en jobb, og betalingen følger jobben. Å gi kallet et navn er det som lar en gjentakelse returnere den samme jobben i stedet for å opprette en nummer to.
Idempotency-Keykreves i ethvert betalt kall med en API-nøkkel: starte eller forbedre et design, forstørre et render, bestille et kostnadsoverslag eller et album, generere et overslag på nytt. Uten den svarer kallet 422IDEMPOTENCY_KEY_REQUIRED, og ingenting legges i kø.- Enhver verdi på 8 til 191 tegn, én per bestilling; vanligvis en UUID. En ny bestilling får en ny verdi: to like kall under to verdier er to design.
- Gjentar du et kall med samme verdi og samme body, får du den opprinnelige statusen og bodyen tilbake, med
Idempotent-Replay: truei svaret. Ingenting legges i kø, og ingenting belastes to ganger. - Samme verdi med en annen body svarer 422
IDEMPOTENCY_KEY_REUSED. En gjentakelse som kommer mens det første kallet fortsatt går, svarer 409IDEMPOTENCY_IN_PROGRESS: vent, og send det samme kallet på nytt. - Ethvert 4xx-svar frigjør verdien, så den samme kan sendes igjen når årsaken er rettet. Verdier huskes i 24 timer, per konto.
@getfacade/mcplager verdien og gjentar kallet under den på egen hånd, så et verktøykall trenger ikke sende noe.
Feil
Feil kommer som JSON:API-feildokumenter. Laravels valideringssvar har ikke JSON:API-form og bærer teksten i message.
| Status | Kode | Betydning | Kan gjentas |
|---|---|---|---|
401 | — | Nøkkelen mangler, er trukket tilbake eller utløpt. | Nei |
402 | AGENT_CREDITS_EXHAUSTED | Kontoen har ingen kreditter igjen i api-omfanget. | Nei |
402 | AGENT_KEY_CAP_REACHED | Denne nøkkelen har brukt opp taket sitt. Opprett en annen nøkkel eller hev taket. | Nei |
403 | — | Dette endepunktet er ikke tilgjengelig for API-nøkler. Agent-API-et dekker bygninger, bilder, design, renderinger, kalkyler, album og API-lommeboken. Innstillinger for konto, innlogging og betaling endres av en person som er logget inn i appen. | Nei |
403 | AGENT_PURCHASE_NOT_ALLOWED | Denne nøkkelen ble utstedt uten rett til å kjøpe tokens. | Nei |
403 | AGENT_PURCHASE_EXCEEDS_CAP | Kjøpet ville ta nøkkelen forbi forbrukstaket sitt. | Nei |
409 | IDEMPOTENCY_IN_PROGRESS | Det første kallet med denne Idempotency-Key har ikke svart ennå. Vent, og send det samme kallet på nytt. | Ja |
422 | — | Forespørselen ble forstått og avvist: duplisert bygningsnavn, avvist bilde, album bestilt før hovedrenderingen var ferdig. | Nei |
422 | IDEMPOTENCY_KEY_REQUIRED | Et betalt kall med API-nøkkel uten Idempotency-Key-header. Ingenting ble lagt i kø; send det på nytt med headeren. | Nei |
422 | IDEMPOTENCY_KEY_REUSED | Denne Idempotency-Key er brukt til en annen forespørsel. Bruk en ny verdi til en ny bestilling. | Nei |
429 | — | Nøkkelens egen kvote er brukt opp. Vent litt, ikke gjenta i tett løkke. | Ja |
Den lesbare teksten skrives av API-et, på språket til den som kaller. Vis errors[].detail som den står i stedet for å lage din egen melding.
Betaling og adgang
- Betalte kall trekker på krediter i
api-omfanget, og adgangen ser bare på den saldoen: hver nøkkel betaler i krediter. - Et aktivt Pro Plan fyller
api-lommeboken opp til 1 000 krediter én gang per faktureringsperiode. Utover det kjøpes krediter. - En nøkkel fyller bare på sin egen lommebok hvis den ble utstedt med kjøp slått på, og høyst med det den fortsatt kan bruke, så et kjøp hever aldri forbrukstaket.
api-området er en egen lommebok. Appens kreditter, gratisnivået inkludert, brukes aldri av en nøkkel.- Forbruket telles per nøkkel, så hver assistents bruk er synlig for seg.
- Forhåndssjekken er
GET /tokens/balance, feltetdata.attributes.agent.is_admissible. Blokken finnes bare for agentnøkler, og flagget speiler adgangsmellomvaren nøyaktig. Les det i stedet for selv å sammenligne saldo og tak. - Adgangen avgjøres før arbeid legges i kø, så et avvist kall koster ingenting.
Farge- og merketokener
start_design tar to uavhengige lister med maks ti oppføringer hver. Rekkefølgen bærer rollen 60/30/10: første oppføring er den dominerende veggfargen.
colors
| Token | Betydning |
|---|---|
palette:1 | Et kuratert GetFacade-skjema, etter id. |
#8A8F7D | En fri farge, seks heksadesimale tegn. |
paint:412 | En produsentkulør, i den todelte formen som beholdes av hensyn til kompatibilitet. |
brand_selections
| Token | Betydning |
|---|---|
siding:brand:12 | Ethvert produkt fra den produsenten i den kategorien. |
siding:line:40@double-4-dutchlap | Én serie, på én geometri. |
siding:product:88@double-4-dutchlap | Ett produkt, fullt bestemt. |
paint:brand:3 | Enhver kulør fra det malingsmerket. |
paint:product:412 | Én malingskulør. |
Grammatikken er category:level:id[@value][.value]. Delen etter @ bærer slugger for geometriverdier, unike innenfor kategorien sin, så aksen de hører til slås opp i stedet for å skrives ut i tokenet. Et ukjent token avvises med 422 og forbigås aldri i stillhet.
Full økt
Én bygning, ett bilde, ett design og så de to dokumentene. Instruksjonen som gir det:
Opprett en bygning som heter Maple Street 14, last opp ./front.jpg som visningen dens og start et design med varmgrå vegger og hvite lister. Bestill overslaget og albumet for resultatet.
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)