Innan du börjar
API:t fungerar utan konto via en gästsession. API:t finns på webbplatsens egen adress under /api. Ställ in det en gång:
API=https://dev.uliketechnology.com/api
F=board.zip
board.zip är ett plant zip-arkiv med dina Gerber- och borrfiler. Vad som ska finnas i det läser du i Filer för tillverkning och bestyckning. Exemplen behöver curl och jq.
Varje begäran till API:t efter gästsessionen tar Authorization: Bearer <token>. Varje fel har samma form:
{ "error": { "code": "VALIDATION_FAILED", "message": "…", "details": {}, "requestId": "…" } }
Grena på code. message är för utvecklare.
- Gästsession: token visas en gång.
- Uppladdning:
PUTzip-arkivet till adressen som API:t anger, med de headers det anger. - Slutför, polla sedan tills analysen är klar.
- Rapporten: observationer, vilka kontroller som kördes och vilka som inte gjorde det.
- Prisförhandsvisningen.
Flödet med curl
Läs vad som kan beställas. Detta behöver ingen token:
curl -s $API/v1/capabilities | jq '.options[].id'
Öppna en gästsession. Token visas en gång och gäller i 30 dagar:
T=$(curl -s -X POST $API/v1/guest-sessions | jq -r .token)
Anmäl filen. Svaret innehåller uploadId, designId, uploadUrl och requiredHeaders:
J=$(curl -s -X POST $API/v1/uploads -H "authorization: Bearer $T" -H 'content-type: application/json' \
-d "{\"fileName\":\"board.zip\",\"sizeBytes\":$(stat -c %s $F),\"sha256\":\"$(sha256sum $F | cut -d' ' -f1)\",\"purpose\":\"design\"}")
Skicka filen till adressen som svaret anger, med varje header i requiredHeaders (content type, längd och checksumma; utan dem avvisas uppladdningen med 403). Slutför sedan uppladdningen:
curl -s -X PUT --data-binary @$F \
$(echo $J | jq -r '.requiredHeaders | to_entries[] | "-H \(.key):\(.value)"') \
"$(echo $J | jq -r .uploadUrl)"
curl -s -X POST $API/v1/uploads/$(echo $J | jq -r .uploadId)/complete -H "authorization: Bearer $T" | jq .design.status
Statusen är först analysing. Läs konstruktionen tills den ändras. När den är ready finns rapporten i svaret:
D=$(echo $J | jq -r .designId)
curl -s $API/v1/designs/$D -H "authorization: Bearer $T" | jq '.design.status, .report.headline, .report.counts'
Rubriken är no_problems_in_checks_run, problems_found eller could_not_check. Läs också checksRun och checksNotRun: en kontroll som inte kördes är inte godkänd. De andra statusarna är needs_mapping (ställ in lagren med PUT /v1/designs/{designId}/layer-mapping), needs_engineer och rejected.
Begär en prisförhandsvisning. selection och destinationCountry krävs; en tom selection tar standardvärdena:
curl -s -X POST $API/v1/quote-previews -H "authorization: Bearer $T" -H 'content-type: application/json' \
-d "{\"designId\":\"$D\",\"quantities\":{\"boardsFabricated\":10,\"boardsAssembled\":0},\"selection\":{},\"destinationCountry\":\"DE\"}" \
| jq '.mode, .reviewReasons, .totalMinor'
mode är instant (priset gäller som visat) eller review (en ingenjör bekräftar det); reviewReasons säger varför. totalMinor är i mindre enheter av svarets currency och saknas när en ingenjör måste prissätta jobbet. För att spara en offert tar POST /v1/quotes samma body.
Samma flöde med JavaScript-klienten
Klienten @ulike/sdk omsluter dessa rutter. Den är ännu inte publicerad som paket; detta är dess form, så att du kan skriva samma anrop med fetch. Metodnamn:
import { createClient } from '@ulike/sdk';
let token;
const api = createClient({ baseUrl: 'https://dev.uliketechnology.com/api', token: () => token });
const caps = await api.capabilities();
token = (await api.createGuestSession()).token;
const started = await api.uploadDesign({ name: 'board.zip', bytes }); // announce, PUT, complete
const view = await api.waitForDesign(started.design.id); // polls getDesign
const preview = await api.previewQuote({
designId: view.design.id,
quantities: { boardsFabricated: 10, boardsAssembled: 0 },
selection: {},
destinationCountry: 'DE',
});
De andra metoderna är createUpload, completeUpload, getDesign, setLayerMapping, validateDesign, getValidation, waitForValidation, createQuote, getQuote och reviseQuote. Fel kastas som ApiClientError med en status och en code.
Kontrollen för en beställning
Rapporten du får efter uppladdning görs bara från filerna. För att kontrollera filerna mot en beställning anropar du POST /v1/designs/{designId}/validations (validateDesign) med order som håller quantities och selection. Svaret är ett tillstånd: running, failed eller done. Medan det är running läser du GET /v1/validations/{reportId} (getValidation) varje sekund eller varannan tills det är done.
- Ladda upp zip-arkivet.
- Läs rapporten.
- Rätta och ladda upp som ny konstruktion. Stanna och fråga personen när en rättning ändrar funktionen, priset eller ledtiden.
- Rena filer: kör kontrollen för beställningen.
En offert eller förhandsvisning med alternativ som medför andra gränsvärden (tjockare koppar, annan tjocklek) behöver en kontroll för det valet. Om ingen finns startas en, och förhandsvisningen bär granskningsorsaken file_check_pending och en check med dess reportId. Priset visas genast, men offerten stannar i review tills den kontrollen är klar. Läs kontrollen som ovan och begär sedan förhandsvisningen igen.
Fel du kommer att möta
| Kod | Status | Vad det betyder | Vad du ska göra |
|---|---|---|---|
DESIGN_NOT_READY |
422 | Konstruktionen läses fortfarande (details.status säger i vilket tillstånd), eller har ännu ingen rapport. |
Läs konstruktionen tills statusen inte längre är analysing, fråga sedan igen. |
VALIDATION_FAILED |
400 | Begäran har inte den förväntade formen, eller anger ett alternativ eller värde som katalogen inte har. details listar punkterna eller problemen. |
Rätta fältet som anges i details och skicka igen. Ta alternativ-id:n och värden från GET /v1/capabilities. |
NOT_MANUFACTURABLE |
422 | Valet är något vi inte tillverkar. details.because bär orsakerna. |
Ändra valet; försök inte samma igen. Fråga personen om ändringen skulle ändra kortet. |
ANONYMOUS_BUDGET_SPENT |
429 | Dagskvoten utan konto är förbrukad. details.resetsOn är datumet. |
Stanna. Berätta för personen; hen kan logga in eller vänta till det datumet. |
REVISION_CONFLICT |
409 | En revision angav en bas som inte längre är offertens huvud. details bär båda huvudena. |
Läs huvudet med GET /v1/quotes/{quoteId}, tillämpa din ändring på det och skicka igen. |
Möjliga är också DESIGN_REJECTED (uppladdningen avvisades; se details.reason), UNAUTHENTICATED för en saknad eller fel token (en fel token avvisas även på offentliga rutter) och FEATURE_DISABLED för en rutt som ännu inte är öppen.
Dagskvoten utan konto
En gästsession har en dagskvot av beräkning. Uppladdningar och startade kontroller kostar mer än en vanlig läsning, och att öppna många gästsessioner från en nätverksadress räknas också. En kontroll som webbplatsen startar själv för ett nytt val debiteras samma kvot. När den är förbrukad får du ANONYMOUS_BUDGET_SPENT med datumet då den återställs. Inloggade anropare räknas inte så.
Vad API:t inte kan idag: beställning, betalning, API-nycklar och inloggning för agenter är planerade och inte tillgängliga. Den planerade MCP-servern beskrivs i Vad MCP är och hur agenter beställer.