GetFacades agent-API
Facadeprojektering via MCP og HTTP. Hvert design udarbejdes til det land, bygningen står i: materialer, der kan bruges der, produkter, som producenterne faktisk sælger der, og den tekniske opbygning bag overfladen. En render viser det på fotoet af huset, prisoverslaget sætter pris på det linje for linje, og PDF-albummet dokumenterer det for det sjak, der bygger. Hver sti nedenfor er et eksisterende GetFacade-endpoint, det samme som iOS-, Android- og webappen kalder. En agentnøgle begrænser blot, hvem der må kalde det, måler forbruget og stopper ved sit loft.
- Basis-URL
- https://api.getfacade.ai/api/v1
- Godkendelse
- Bearer <agent key>
- Pakke
- @getfacade/mcp
- Kørselsmiljø
- Node.js 20+
- Transport
- stdio (MCP), HTTPS (REST)
- Specifikation
- OpenAPI 3.1, v1.0.0
Hurtig start
Opret en nøgle
app.getfacade.aiKontoIndstillingerAPIOpret nøgle
Værdien vises én gang og kan ikke gendannes, kun erstattes. Forbrugsloftet sættes ved oprettelsen og gælder ved hvert betalt kald.
Opret en agentnøgleRegistrér MCP-serveren
Én post i klientens konfiguration og derefter genstart af klienten. Claude Desktop gemmer den i claude_desktop_config.json; enhver anden MCP-klient tager de samme tre felter.
{ "mcpServers": { "getfacade": { "command": "npx", "args": ["-y", "@getfacade/mcp"], "env": { "GETFACADE_API_KEY": "your-key" } } } }Miljøvariabler Variabel Påkrævet Standardværdi GETFACADE_API_KEYJa —GETFACADE_API_BASE_URLNej https://api.getfacade.ai/api/v1Eller kald HTTP-API'et direkte
Samme nøgle fungerer som bearer-token. Forespørgsler og svar er JSON:API-dokumenter, hvor id er et felt på øverste niveau og aldrig ligger inde 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"}}}'
Værktøjer
Enogtyve værktøjer. MCP-serveren holder ingen tilstand og ingen egne regler: hvert værktøj er et eller flere kald til de endpoints, der står ved siden af, og hver besked, agenten gengiver, er skrevet af API'et.
create_buildingcreate_building(name, goals?, construction_region?) -> { building_id, name }Opretter en bygning. Navnet er unikt inden for kontoen og højst 50 tegn; en dublet afvises med 422.
Kalder
POST /projectsupload_photoupload_photo(building_id, file_path, wait_for_validation? = true) -> { view_id, validation: { status, reason? } }Registrerer en visning, uploader bytes til en forhåndssigneret URL, bekræfter dem og spørger, indtil fotoet godkendes eller afvises. Bredde, højde og md5 beregnes lokalt; billedforholdet udleder serveren.
Kalder
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 }Projekterer facaden på en valgt visning og viser den på fotoet: materialer, der kan bruges i bygningens land, produkter, der faktisk sælges der, og opbygningen bag overfladen. Opretter et design, sætter arbejdet i kø og returnerer job-id. Seed er valgfrit: udelades det, genererer serveren et og returnerer det.
Kalder
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 }Retter et færdigt design med ord. Instruktionen anvendes på det færdige design, så alt, den ikke nævner, bevares. At rette en hovedvisning opretter et nyt design, så det tidligere aldrig overskrives.
Kalder
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? }Læser tilstanden for én rendering, ét overslag eller ét album.
Kalder
GET /renders/{render} · GET /estimates/{estimate}list_jobslist_jobs(kind?, limit? = 20) -> [{ job_id, kind, status, building_id, created_at }]Seneste job på tværs af kontoen, ufærdige først.
Kalder
GET /historylist_designslist_designs(building_id) -> [{ design_id, note, has_main_render, main_render_id, main_render_url, renders }]Bygningens designs med deres renderinger. Herfra kommer render-id'erne til overslag og album.
Kalder
GET /projects/{project}/conceptsorder_estimateasynkronorder_estimate(design_id, render_ids, currency?, measurement_system?, special_requirements?) -> { job_id, status }Sætter pris på designet linje for linje, i materialer og arbejdsløn, til det de angivne materialer koster i bygningens land. Valuta og målesystem følger som standard det land.
Kalder
POST /projects/{project}/concepts/{concept}/estimatesorder_albumasynkronorder_album(design_id, render_ids, language?, include_blueprints?, include_estimate?, requirements?) -> { job_id, status }Dokumenterer designet for det sjak, der bygger: materialerne, facadens opbygning, sikkerhedsnoter og de normer, de hviler på. Kræver en færdig hovedrender.
Kalder
POST /concepts/{concept}/album/generateupscale_renderasynkronupscale_render(render_id) -> { job_id, status }Forstørrer en færdig rendering. Koster tokens og kører asynkront.
Kalder
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: totaler, forudsætningerne bag dem og hver linje med mængde, enhed og pris. get_job melder et overslags status, aldrig dets indhold.
Kalder
GET /estimates/{estimate}add_estimate_lineadd_estimate_line(estimate_id, section, name, quantity, unit_price, unit?, category?) -> { line_id }Tilføjer en linje til overslaget. Enhederne kommer fra dets eget målesystem.
Kalder
POST /estimates/{estimate}/itemsupdate_estimate_lineupdate_estimate_line(estimate_id, line_id, name?, quantity?, unit_price?, unit?, category?, section?) -> { line_id }Ændrer en linje i overslaget. Kun de sendte felter ændres; serveren regner totalerne om.
Kalder
PATCH /estimates/{estimate}/items/{item}delete_estimate_linedelete_estimate_line(estimate_id, line_id) -> { deleted }Fjerner en linje fra overslaget.
Kalder
DELETE /estimates/{estimate}/items/{item}delete_renderdelete_render(render_id) -> { deleted }Sletter en rendering. Slettes hovedrenderingen, går designet tilbage til kladde.
Kalder
DELETE /renders/{render}delete_designdelete_design(building_id, design_id) -> { deleted }Sletter et design med de renderinger, der hører til.
Kalder
DELETE /projects/{project}/concepts/{concept}delete_buildingdelete_building(building_id) -> { deleted }Sletter en bygning med alt indhold. Allerede brugte tokens refunderes ikke.
Kalder
DELETE /projects/{project}list_token_packageslist_token_packages() -> [{ package, tokens, price, currency }]De pakker, kontoen kan købe, med pris og antal tokens.
Kalder
GET /tokens/packagesbuy_tokensasynkronbuy_tokens(package) -> { status, transaction_id, tokens, checkout_url?, detail }Køber en pakke til denne nøgles tegnebog. Kræver en nøgle udstedt med køb slået til og går aldrig ud over det, nøglen stadig må bruge.
Kalder
POST /tokens/purchaseget_balanceget_balance() -> { balance, scope: "api", spend_cap, spent, remaining, is_admissible }Agentpungen, denne nøgles loft og om næste betalte kald bliver lukket igennem.
Kalder
GET /tokens/balancereport_problemreport_problem(message, category?, context?: { tool, endpoint, status_code, job_id, expected, actual }) -> { reference, message }Rapporterer en fejl i dette API: et felt der er beskrevet her, men aldrig kommer, et afslag hvis ordlyd ikke viser en vej videre, et resultat der ikke svarer til det, der blev bedt om. Gratis og accepteres med tom pengepung; tilbage kommer en reference, ikke et svar.
Kalder
POST /feedback
Godkendelse og nøgler
- Nøglen sendes som bearer-token i
Authorization-headeren. MCP-serveren læser den fraGETFACADE_API_KEYog sender ikke andet. - Værdien vises én gang, ved oprettelsen, og kun dens hash gemmes. Rotation betyder at oprette en ny nøgle og tilbagekalde den gamle.
- Hver nøgle bærer et forbrugsloft, der håndhæves på serveren, før kaldet når en controller. Et nået loft standser den nøgle, ikke kontoen.
- Nøgler administrerer ikke nøgler: det er en menneskelig handling, og de endpoints svarer 403 på en agentnøgle.
- Tilbagekaldelse virker med det samme. Kald med en tilbagekaldt nøgle svarer 401.
Asynkront arbejde og polling
start_design,order_estimateogorder_albumreturnerer et job-id og er dermed færdige. En rendering tager minutter: pollGET /renders/{render}ellerGET /estimates/{estimate}, indtil tilstanden er endelig.- At fotokontrollen er færdig, meldes over en websocket, agenten ikke har. Poll
GET /angles/{angle}/validationog læsvalidation.is_in_progress; udled ikke selv sluttilstanden af statusteksten. - En færdig render og et færdigt album ligger på permanente offentlige URL'er: uden signatur og uden udløb. Linket kan gives direkte til en person som svar på “vis mig resultatet”. Da det ikke er signeret, spørger det ingen om lov: det bliver ved med at virke for enhver, der modtager det, og kan ikke trækkes tilbage.
GET /renders/{render}/downloader noget andet: en signeret URL, der udløber i løbet af minutter og bærer et filnavn. Den er til at gemme filen, ikke til at dele den.
Hastighedsgrænser pr. nøgle
En agentnøgle har sine egne kvoter, adskilt fra de menneskelige sessioner på samme konto, så en agent i løkke ikke æder kvoten for personen foran skærmen. Afvisningen er billig: den træffes i mellemlaget, før alt databasearbejde.
| Område | Pr. minut | Pr. time |
|---|---|---|
| Læsninger og almindelige skrivninger | 120 | 2000 |
| Status- og kontrolpolling | 120 | 2000 |
| Bestilling af rendering, overslag og album | 10 | 200 |
Idempotens
Et betalt kald opretter et job, og betalingen følger jobbet. At give kaldet et navn er det, der lader en gentagelse returnere det samme job i stedet for at oprette et nummer to.
Idempotency-Keyer påkrævet ved ethvert betalt kald med en API-nøgle: start eller finpudsning af et design, forstørrelse af et render, bestilling af et overslag eller et album, ny beregning af et overslag. Uden den svarer kaldet 422IDEMPOTENCY_KEY_REQUIRED, og intet sættes i kø.- Enhver værdi på 8 til 191 tegn, én pr. bestilling; typisk en UUID. En ny bestilling får en ny værdi: to ens kald under to værdier er to designs.
- Gentager du et kald med samme værdi og samme body, får du den oprindelige status og body tilbage, med
Idempotent-Replay: truei svaret. Intet sættes i kø, og intet betales to gange. - Samme værdi med en anden body svarer 422
IDEMPOTENCY_KEY_REUSED. En gentagelse, der ankommer mens det første kald stadig kører, svarer 409IDEMPOTENCY_IN_PROGRESS: vent, og send det samme kald igen. - Ethvert 4xx-svar frigiver værdien, så den samme kan sendes igen, når årsagen er rettet. Værdier huskes i 24 timer, pr. konto.
@getfacade/mcpdanner værdien og gentager kaldet under den af sig selv, så der er intet at sende med i et værktøjskald.
Fejl
Fejl kommer som JSON:API-fejldokumenter. Laravels valideringssvar har ikke JSON:API-form og bærer teksten i message.
| Status | Kode | Betydning | Kan gentages |
|---|---|---|---|
401 | — | Nøglen mangler, er tilbagekaldt eller udløbet. | Nej |
402 | AGENT_CREDITS_EXHAUSTED | Kontoen har ikke flere kreditter i api-omfanget. | Nej |
402 | AGENT_KEY_CAP_REACHED | Denne nøgle har brugt sit loft. Opret en anden nøgle, eller hæv loftet. | Nej |
403 | — | Dette endpoint er ikke tilgængeligt for API-nøgler. Agent-API'et dækker bygninger, fotos, designs, renderinger, overslag, albums og API-tegnebogen. Indstillinger for konto, login og betaling ændres af en person, der er logget ind i appen. | Nej |
403 | AGENT_PURCHASE_NOT_ALLOWED | Denne nøgle blev udstedt uden ret til at købe tokens. | Nej |
403 | AGENT_PURCHASE_EXCEEDS_CAP | Købet ville føre nøglen forbi dens forbrugsloft. | Nej |
409 | IDEMPOTENCY_IN_PROGRESS | Det første kald med denne Idempotency-Key har ikke svaret endnu. Vent, og send det samme kald igen. | Ja |
422 | — | Forespørgslen blev forstået og afvist: dubleret bygningsnavn, afvist foto, album bestilt før hovedrenderingen var færdig. | Nej |
422 | IDEMPOTENCY_KEY_REQUIRED | Et betalt kald med API-nøgle uden Idempotency-Key-header. Intet blev sat i kø; send det igen med headeren. | Nej |
422 | IDEMPOTENCY_KEY_REUSED | Denne Idempotency-Key er brugt til en anden anmodning. Brug en ny værdi til en ny bestilling. | Nej |
429 | — | Nøglens egen kvote er brugt op. Vent lidt, gentag ikke i tæt løkke. | Ja |
Den læsbare tekst skrives af API'et, på kalderens sprog. Vis errors[].detail, som den står, i stedet for at formulere din egen besked.
Betaling og adgang
- Betalte kald trækker på
api-scope-kreditter, og adgangen ser kun på den saldo: hver nøgle betaler i kreditter. - Et aktivt Pro Plan fylder
api-tegnebogen op til 1.000 kreditter en gang pr. faktureringsperiode. Derudover købes kreditter. - En nøgle fylder kun sin egen tegnebog op, hvis den blev udstedt med køb slået til, og højst med det, den stadig må bruge, så et køb hæver aldrig forbrugsloftet.
api-området er en selvstændig pung. Appens kreditter, gratisniveauet inklusive, bruges aldrig af en nøgle.- Forbruget tælles pr. nøgle, så hver assistents forbrug ses for sig.
- Forhåndstjekket er
GET /tokens/balance, feltetdata.attributes.agent.is_admissible. Blokken findes kun for agentnøgler, og flaget spejler adgangsmellemlaget nøjagtigt. Læs det i stedet for selv at sammenligne saldo og loft. - Adgangen afgøres, før arbejde sættes i kø, så et afvist kald koster ingenting.
Farve- og mærketokens
start_design tager to uafhængige lister med højst ti poster hver. Rækkefølgen bærer rollen 60/30/10: første post er den dominerende vægfarve.
colors
| Token | Betydning |
|---|---|
palette:1 | Et kurateret GetFacade-skema, efter id. |
#8A8F7D | En fri farve, seks hexadecimale tegn. |
paint:412 | En producentkulør, i den todelte form der beholdes af hensyn til kompatibilitet. |
brand_selections
| Token | Betydning |
|---|---|
siding:brand:12 | Ethvert produkt fra den producent i den kategori. |
siding:line:40@double-4-dutchlap | Én serie, på én geometri. |
siding:product:88@double-4-dutchlap | Ét produkt, fuldt bestemt. |
paint:brand:3 | Enhver kulør fra det malingsmærke. |
paint:product:412 | Én malingskulør. |
Grammatikken er category:level:id[@value][.value]. Delen efter @ bærer slugs for geometriværdier, unikke inden for deres kategori, så aksen, de hører til, slås op i stedet for at blive skrevet i tokenet. Et ukendt token afvises med 422 og forbigås aldrig i stilhed.
Fuld session
Én bygning, ét foto, ét design og så de to dokumenter. Instruktionen, der giver det:
Opret en bygning ved navn Maple Street 14, upload ./front.jpg som dens visning, og start et design med varmgrå vægge og hvide lister. Bestil overslaget og albummet 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)