REST-API-referentie
Elk eindpunt hieronder is vanuit elke taal via gewoon HTTP aan te roepen, en de volledige specificatie wordt als OpenAPI 3.1 geleverd voor clientgeneratoren en ChatGPT Custom GPT Actions. De server voert geen solver uit: solve en check-beam valideren het model en geven een link terug die het in een browser doorrekent. Modelgrootheden zijn SI-basiseenheden.
De machineleesbare specificatie
De volledige specificatie staat op ferscloud.com/api/openapi.json, in OpenAPI 3.1. Ze wordt met ruime CORS geleverd en is in robots.txt uitdrukkelijk toegestaan, zodat gereedschappen en agents haar rechtstreeks kunnen ophalen.
Authenticeer met de header X-API-Key (een permanente sleutel van uw profielpagina) of met een Bearer-token uit POST /api/sdk/token. De sleutelvorm werkt voor elke aanmeldmethode; de tokenvorm alleen voor accounts met e-mail en wachtwoord.
# The complete machine-readable spec (OpenAPI 3.1).
# Import it into ChatGPT Custom GPT Actions, Postman, or a client generator.
curl https://ferscloud.com/api/openapi.jsonAuthenticatie en API-sleutels
Maak eenmalig een sleutel aan, houd hem serverzijdig en stuur hem bij elk verzoek als X-API-Key mee. Sleutels worden alleen bij het aanmaken getoond en zijn altijd in te trekken.
POST /api/sdk/token — Een kortlevend JWT ophalen
{
"description": "Exchange email + password for a 1-hour Bearer token. Requires an email/password account. Google/GitHub users should use an API key (X-API-Key header) instead.",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/token",
"body": {
"email": "you@example.com",
"password": "your_password"
}
},
"response": {
"token": "<jwt>",
"expires_at": "2025-01-01T01:00:00Z",
"is_premium": false,
"user": {
"id": "<uuid>",
"email": "you@example.com"
}
}
}GET /api/sdk/me — Een sleutel controleren en gebruikersgegevens ophalen
{
"description": "Check the currently authenticated SDK user. Works with both X-API-Key and Bearer token.",
"request": {
"method": "GET",
"url": "https://ferscloud.com/api/sdk/me",
"headers": {
"X-API-Key": "<keyId>.<secret>"
}
},
"response": {
"user_id": "<uuid>",
"email": "you@example.com",
"is_premium": false,
"token_expires_at": "2026-01-01T01:00:00.000Z"
}
}POST /api/sdk/api-keys — Een permanente API-sleutel aanmaken
{
"description": "Create a named API key (returned once, store it securely). Optionally set expiresInDays for auto-expiry.",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/api-keys",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"name": "My laptop",
"scopes": [],
"expiresInDays": null
}
},
"response": {
"id": "<keyId>",
"name": "My laptop",
"key": "<keyId>.<secret>",
"scopes": [],
"created_at": "2026-01-01T00:00:00.000Z",
"expires_at": null,
"message": "Store this key securely. It will not be shown again."
}
}GET /api/sdk/api-keys — API-sleutels tonen
{
"description": "List all active (non-revoked) API keys. Secrets are never returned.",
"request": {
"method": "GET",
"url": "https://ferscloud.com/api/sdk/api-keys",
"headers": {
"X-API-Key": "<keyId>.<secret>"
}
},
"response": {
"keys": [
{
"id": "<keyId>",
"name": "My laptop",
"scopes": [],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"expiresAt": null
}
]
}
}DELETE /api/sdk/api-keys?id=<keyId> — Een API-sleutel intrekken
{
"description": "Revoke an API key by its ID. Pass the key ID as a query parameter, not a path segment.",
"request": {
"method": "DELETE",
"url": "https://ferscloud.com/api/sdk/api-keys?id=<keyId>",
"headers": {
"X-API-Key": "<keyId>.<secret>"
}
},
"response": {
"message": "API key revoked"
}
}Rekenen
FERS Cloud voert geen solver uit. solve valideert het model, zet het klaar als openbaar concept en antwoordt met HTTP 200, status: "solve_in_browser" en een open_url. Wie die link opent, rekent het model door in de browser, met het abonnement van het account dat hem opent: gratis tot 100 staven, Pro tot 10,000. De link blijft 24 uur geldig. Een model dat niet door de validatie komt, krijgt in plaats van een link 422 invalid_model met de fouten.
check-beam bouwt een ligger met zijn toetsing volgens EN 1993-1-1, antwoordt op dezelfde manier en geeft daarnaast het gebouwde model terug. Wilt u resultaten in uw eigen code, reken dan waar die code draait: met het Python-pakket (fers solve model.json), het JavaScript-pakket of de lokale MCP-server.
Geen van deze eindpunten wordt afgerekend. Het zijn de REST-tweelingen van de tools solve_model en check_beam van de gehoste MCP-server en ze geven hetzelfde antwoord.
POST /api/sdk/solve — Een link krijgen die een model in de browser doorrekent
{
"description": "Validate a FERS model JSON (SI units: metres, newtons, pascals) and get a link that solves it in a browser. FERS Cloud runs no solver: the model is parked as a public draft for 24 hours and solved by whoever opens open_url, at that account's tier. Not metered. A model that fails validation gets 422 { code: \"invalid_model\", errors, warnings } instead. REST twin of the hosted MCP solve_model tool.",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/solve",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"model": "<FERS model JSON object or string>"
}
},
"response": {
"status": "solve_in_browser",
"open_url": "https://ferscloud.com/share/<slug>",
"expires_at": "2026-01-02T00:00:00.000Z",
"model_ref": "draft_<id>",
"members": 1,
"tier": {
"free_member_limit": 100,
"free_use": "non-commercial use only",
"pro_member_limit": 10000,
"pro_use": "commercial and non-commercial use",
"solves_at": "the tier of the account that opens the link"
},
"validation": {
"valid": true,
"warnings": []
},
"local_server": {
"npx": "npx -y @ferscloud/fers-mcp",
"claude_code": "claude mcp add --transport stdio fers --env FERS_API_KEY=<your key> -- npx -y @ferscloud/fers-mcp",
"claude_desktop": "https://ferscloud.com/mcp#local",
"docs": "https://ferscloud.com/mcp#local"
},
"python": "pip install FERS && fers solve model.json",
"note": "This server does not run solves. Open open_url: the model solves in the browser and shows its results there; they are not returned to this chat. For results in the chat, install the local FERS MCP server (local_server) or use the Python SDK. The link lives as long as the draft: 24 hours, or until 50 newer drafts exist."
}
}POST /api/sdk/validate — Een model controleren zonder te rekenen
{
"description": "Validate a FERS model JSON's structure (required keys, basic integrity) without running the solver. Free and unmetered.",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/validate",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"model": "<FERS model JSON object or string>"
}
},
"response": {
"valid": false,
"errors": [
"Missing required key: \"model.materials\""
]
}
}POST /api/sdk/check-beam — Een liggertoetsing volgens EN 1993-1-1 opbouwen en de reken-link ervan krijgen
{
"description": "Build a single-span steel beam with a ULS combination and its EN 1993-1-1 member check (bending, shear, N+M, lateral-torsional buckling), and get a link that evaluates it in a browser, plus the built model so a caller with the FERS engine can solve it directly. Units: span_m in metres, udl in kN/m, point_load in kN (downward). Not metered. REST twin of the hosted MCP check_beam tool. The request below is the published IPE 400 worked example.",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/check-beam",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"span_m": 7.5,
"section": "IPE400",
"material": "steel_S355",
"udl": 13,
"uls_factor": 1.35,
"restrained": false
}
},
"response": {
"status": "solve_in_browser",
"open_url": "https://ferscloud.com/share/<slug>",
"expires_at": "2026-01-02T00:00:00.000Z",
"model_ref": "draft_<id>",
"members": 1,
"tier": {
"free_member_limit": 100,
"free_use": "non-commercial use only",
"pro_member_limit": 10000,
"pro_use": "commercial and non-commercial use",
"solves_at": "the tier of the account that opens the link"
},
"local_server": {
"npx": "npx -y @ferscloud/fers-mcp",
"claude_code": "claude mcp add --transport stdio fers --env FERS_API_KEY=<your key> -- npx -y @ferscloud/fers-mcp",
"claude_desktop": "https://ferscloud.com/mcp#local",
"docs": "https://ferscloud.com/mcp#local"
},
"python": "pip install FERS && fers solve model.json",
"note": "This server does not run solves. Open open_url: the model solves in the browser and shows its results there; they are not returned to this chat. For results in the chat, install the local FERS MCP server (local_server) or use the Python SDK. The link lives as long as the draft: 24 hours, or until 50 newer drafts exist.",
"model": "<the built FERS model: the beam, its ULS combination and the EC3 check>"
}
}Een volledige aanroep
De liggertoetsing is de snelste manier om te bevestigen dat uw sleutel werkt: één verzoek bouwt een enkele overspanning met de toetsing volgens EN 1993-1-1 en geeft de link terug die hem uitrekent, samen met het gebouwde model.
curl -X POST https://ferscloud.com/api/sdk/check-beam \
-H "X-API-Key: <keyId>.<secret>" \
-H "Content-Type: application/json" \
-d '{
"span_m": 7.5,
"section": "IPE400",
"material": "steel_S355",
"udl": 13,
"uls_factor": 1.35,
"restrained": false
}'De eenheden van dit eindpunt zijn pragmatisch in plaats van SI: span_m in meters, udl in kN/m en point_load in kN neerwaarts. De modeleindpunten werken volledig in SI.
Opgeslagen modellen
Cloudopslag is een Pro-functie. In het gratis abonnement bewaart u modellen als lokale JSON — hetzelfde formaat dat deze eindpunten accepteren en teruggeven.
GET /api/sdk/models — Opgeslagen modellen tonen
{
"description": "List all models saved to the authenticated account",
"request": {
"method": "GET",
"url": "https://ferscloud.com/api/sdk/models",
"headers": {
"X-API-Key": "<keyId>.<secret>"
}
},
"response": {
"models": [
{
"id": "<modelId>",
"name": "My cantilever",
"description": null,
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-01T00:00:00Z"
}
]
}
}POST /api/sdk/models — Een nieuw model opslaan
{
"description": "Save a structural model JSON to your account",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/models",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"name": "My cantilever",
"description": "5 m IPE 180 cantilever with −1 kN tip load",
"model": "<model JSON object>"
}
},
"response": {
"id": "<modelId>",
"name": "My cantilever",
"description": "5 m IPE 180 cantilever with −1 kN tip load",
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-01T00:00:00Z"
}
}GET /api/sdk/models/{id} — Een model downloaden
{
"description": "Retrieve the full model JSON for a saved model",
"request": {
"method": "GET",
"url": "https://ferscloud.com/api/sdk/models/<modelId>",
"headers": {
"X-API-Key": "<keyId>.<secret>"
}
},
"response": {
"id": "<modelId>",
"name": "My cantilever",
"description": null,
"model": "<full model JSON object>",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
}PUT /api/sdk/models/{id} — Een model bijwerken
{
"description": "Update the name, description, and/or JSON of an existing model. Send only the fields you want to change.",
"request": {
"method": "PUT",
"url": "https://ferscloud.com/api/sdk/models/<modelId>",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"name": "Updated name"
}
},
"response": {
"id": "<modelId>",
"name": "Updated name",
"description": null,
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-02T00:00:00Z"
}
}DELETE /api/sdk/models/{id} — Een model verwijderen
{
"description": "Permanently delete a saved model",
"request": {
"method": "DELETE",
"url": "https://ferscloud.com/api/sdk/models/<modelId>",
"headers": {
"X-API-Key": "<keyId>.<secret>"
}
},
"response": "204 No Content"
}Foutantwoorden
De statuscode vertelt een client waarom een aanroep geen link opleverde, zodat hij de invoer kan corrigeren in plaats van blind opnieuw te proberen.
| Status | Code | Betekenis |
|---|---|---|
| 400 | — | Een parameter ontbreekt of is tegenstrijdig, of een profiel, materiaal of oplegging is onbekend. |
| 401 | — | Ontbrekende of ongeldige inloggegevens. |
| 413 | — | De model-JSON is groter dan de toegestane omvang. |
| 422 | invalid_model | Alleen solve: het model komt niet door de validatie. errors en warnings geven aan waar. |
Er wordt niets afgerekend en er is geen rekenquotum, dus er zijn geen tegoed- of quotumfouten, en een nieuwe poging kost niets.
Andere ingangen
- MCP-server — dezelfde tools voor AI-agents, met een lokale server die op uw machine rekent.
- JavaScript-pakket — in de browser rekenen, zonder enige HTTP-aanroep.
- Python-pakket — modellen met objecten opbouwen in plaats van met kale JSON, en ze lokaal doorrekenen.
Gerelateerde pagina’s
Zie ook
Veelgestelde vragen
Welke authenticatie moet ik gebruiken?
X-API-Key) voor alles wat geautomatiseerd is. De route POST /api/sdk/token werkt alleen voor accounts die met e-mail en wachtwoord zijn aangemaakt, en het token verloopt na een uur.Welke eenheden gebruikt de model-JSON?
check-beam is de uitzondering — dat neemt meters, kN/m en kN.Wat kost een aanroep?
solve en check-beam geven een link terug, en de berekening draait in de browser die hem opent. Het abonnement bepaalt de modelgrootte en het gebruik: gratis tot 100 staven voor niet-commercieel gebruik, Pro tot 10,000 voor € 19.95 per maand, inclusief commercieel gebruik.Kan ik dit in ChatGPT of Postman importeren?
Hoe krijg ik de resultaten terug in mijn code?
solve geeft een link terug in plaats van resultaten. Reken in plaats daarvan waar uw code draait — met het Python-pakket (pip install FERS, daarna fers solve model.json), het JavaScript-pakket in een browser of in Node, of met de lokale MCP-server @ferscloud/fers-mcp voor een agent. check-beam geeft ook het gebouwde model terug, klaar voor elk van deze routes.