Référence de l’API REST
Tous les points de terminaison ci-dessous sont appelables depuis n’importe quel langage en HTTP simple. Les grandeurs du modèle sont en unités de base du SI : mètres, newtons et pascals. La spécification complète lisible par machine est servie en OpenAPI 3.1 et s’importe directement dans un générateur de clients ou dans une Action de GPT personnalisé ChatGPT.
La spécification lisible par machine
La spécification complète se trouve sur ferscloud.com/api/openapi.json, au format OpenAPI 3.1. Elle est servie avec un CORS permissif et explicitement autorisée dans robots.txt : outils et agents peuvent donc la récupérer directement.
Authentifiez-vous avec l’en-tête X-API-Key (une clé permanente issue de votre page de profil) ou avec un jeton Bearer obtenu par POST /api/sdk/token. La forme par clé fonctionne pour tout mode de connexion ; celle par jeton uniquement pour les comptes e-mail et mot de passe.
# 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.jsonAuthentification et clés d’API
Créez une clé une fois, gardez-la côté serveur et envoyez-la en X-API-Key à chaque requête. Les clés ne sont affichées qu’une fois, à la création, et peuvent être révoquées à tout moment.
POST /api/sdk/token — Obtenir un JWT de courte durée
{
"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 — Vérifier une clé et obtenir les infos utilisateur
{
"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 — Créer une clé d’API permanente
{
"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 — Lister les clés d’API
{
"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> — Révoquer une clé d’API
{
"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"
}
}Solveur
solve et check-beam sont comptabilisés : chaque appel réussi consomme l’un de vos 100 calculs gratuits hebdomadaires, puis du crédit prépayé à 0,01 € par calcul. validate est gratuit et non comptabilisé.
Ce sont les jumeaux REST des outils MCP solve_model et check_beam : un agent et un script empruntent donc exactement le même chemin de code.
POST /api/sdk/solve — Exécuter le solveur éléments finis
{
"description": "Solve a FERS model JSON (SI units: metres, newtons, pascals) and get displacements, member forces and reactions. Metered: uses your weekly free solves or prepaid credits (Pro: unlimited). REST twin of the MCP solve_model tool. Errors: 422 solver_error, 402 insufficient_credit, 429 daily_limit / rate_limited, 409 in_flight (same idempotency_key already running).",
"request": {
"method": "POST",
"url": "https://ferscloud.com/api/sdk/solve",
"headers": {
"X-API-Key": "<keyId>.<secret>"
},
"body": {
"model": "<FERS model JSON object or string>",
"idempotency_key": "optional-unique-id"
}
},
"response": {
"result": "<solver results: displacements, member forces, reactions, unity checks>",
"meta": {
"funding": "free_tier",
"cost_cents": 0,
"balance_cents": 0,
"replayed": false
}
}
}POST /api/sdk/validate — Contrôler un modèle sans le calculer
{
"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 — Vérification acier EN 1993-1-1 clés en main
{
"description": "Build a single-span steel beam, solve it, and return the EN 1993-1-1 utilizations (bending, shear, N+M, lateral-torsional buckling). Units: span_m in metres, udl in kN/m, point_load in kN (downward). Counts as one solve. REST twin of the MCP check_beam tool. The example below reproduces 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": {
"check": {
"section": "IPE400",
"span_m": 7.5,
"status": "Yellow",
"governing_utilization": 0.822,
"governing_check": "LTB (6.3.2)",
"passes": true,
"checks": {
"Bending z (6.2.5)": 0.266,
"Shear y (6.2.6)": 0.071,
"Combined N+M (6.2.1)": 0.266,
"LTB (6.3.2)": 0.822
},
"advice": "Passes (UC 0.822) with lateral-torsional buckling governing. …"
},
"meta": {
"funding": "free_tier",
"cost_cents": 0,
"balance_cents": 0,
"replayed": false
}
}
}Un appel complet
La vérification de poutre clés en main est le moyen le plus rapide de confirmer que votre clé fonctionne : elle construit, calcule et vérifie une travée en une seule requête.
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
}'Les unités de ce point de terminaison sont pragmatiques plutôt que SI : span_m en mètres, udl en kN/m et point_load en kN vers le bas. Les points de terminaison de modèle travaillent en SI de bout en bout.
Modèles enregistrés
L’enregistrement dans le cloud est une fonction Pro. Dans l’offre gratuite, conservez vos modèles en JSON local : c’est le format que ces points de terminaison acceptent et renvoient.
GET /api/sdk/models — Lister les modèles enregistrés
{
"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 — Enregistrer un nouveau modèle
{
"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} — Télécharger un modèle
{
"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} — Mettre à jour un modèle
{
"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} — Supprimer un modèle
{
"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"
}Réponses d’erreur
Les points de terminaison comptabilisés utilisent les codes d’état HTTP pour distinguer les raisons d’un appel non exécuté, afin qu’un client puisse réessayer intelligemment plutôt que de traiter tous les échecs de la même façon.
| État | Code | Signification |
|---|---|---|
| 422 | solver_error | Le modèle a atteint le solveur et n’a pas pu être résolu. |
| 402 | insufficient_credit | Quota gratuit épuisé et plus de crédit prépayé. |
| 429 | daily_limit / rate_limited | Quota ou limite de fréquence atteint. Patientez puis réessayez. |
| 409 | in_flight | Une requête avec le même idempotency_key est déjà en cours. |
Transmettez un idempotency_key à solve pour qu’une requête réessayée soit rejouée plutôt que facturée deux fois ; le champ meta.replayed de la réponse indique ce qui s’est produit.
Autres voies
- Serveur MCP : les mêmes capacités sous forme d’outils qu’un agent IA peut appeler directement.
- Paquet JavaScript : calculer dans le navigateur, sans aucun appel HTTP.
- Paquet Python : construire les modèles avec des objets plutôt qu’avec du JSON brut.
Pages associées
Utiliser FERS depuis JavaScript
Installez le solveur WebAssembly depuis npm, configurez votre bundler et calculez des modèles dans le navigateur ou sous Node.
Exemples traités
Quatre scripts exécutables — console, poutre sur deux appuis, portique et vérification EN 1993-1-1 — chacun avec son calcul manuel.
Voir aussi
Questions fréquentes
Quelle authentification utiliser ?
X-API-Key) pour tout ce qui est automatisé. La voie POST /api/sdk/token ne fonctionne que pour les comptes créés avec e-mail et mot de passe, et son jeton expire au bout d’une heure.Quelles unités le JSON du modèle utilise-t-il ?
check-beam fait exception : il prend des mètres, des kN/m et des kN.Combien coûte un appel ?
validate et les points de terminaison de clés ne sont jamais comptabilisés.Puis-je l’importer dans ChatGPT ou Postman ?
Comment éviter d’être facturé deux fois lors d’un réessai ?
idempotency_key avec la requête de calcul. Une répétition avec la même clé renvoie le résultat mémorisé avec meta.replayed: true au lieu de recalculer, et une répétition simultanée renvoie 409.Y a-t-il une limite de fréquence ?
rate_limited ; patientez puis réessayez.