Référence de l’API REST

Tous les points de terminaison ci-dessous sont appelables depuis n’importe quel langage en HTTP simple, et la spécification complète est servie en OpenAPI 3.1 pour les générateurs de clients et les Actions de GPT personnalisés ChatGPT. Le serveur n’exécute aucun solveur : solve et check-beam valident le modèle et renvoient un lien qui le calcule dans un navigateur. Les grandeurs du modèle sont en unités de base du SI.

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.json

Authentification 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"
  }
}

Calcul

FERS Cloud n’exécute aucun solveur. solve valide le modèle, le dépose comme brouillon public et répond HTTP 200 avec status: "solve_in_browser" et une open_url. L’ouverture de ce lien calcule le modèle dans le navigateur, selon l’offre du compte qui l’ouvre : gratuite jusqu’à 100 barres, Pro jusqu’à 10,000. Le lien reste valable 24 heures. Un modèle qui échoue à la validation reçoit 422 invalid_model avec les erreurs au lieu d’un lien.

check-beam construit une poutre avec sa vérification EN 1993-1-1, répond de la même façon et renvoie en plus le model construit. Pour obtenir des résultats dans votre propre code, calculez là où ce code s’exécute : avec le paquet Python (fers solve model.json), le paquet JavaScript ou le serveur MCP local.

Aucun de ces points de terminaison n’est facturé à l’usage. Ce sont les jumeaux REST des outils solve_model et check_beam du serveur MCP hébergé, et ils renvoient la même réponse.

POST /api/sdk/solve — Obtenir un lien qui calcule un modèle dans le navigateur

{
  "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 — 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 — Construire une vérification de poutre EN 1993-1-1 et obtenir son lien de calcul

{
  "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>"
  }
}

Un appel complet

La vérification de poutre est le moyen le plus rapide de confirmer que votre clé fonctionne : une seule requête construit une travée avec sa vérification EN 1993-1-1 et renvoie le lien qui l’évalue, avec le modèle construit.

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

Le code d’état indique au client pourquoi un appel n’a renvoyé aucun lien, afin qu’il corrige l’entrée au lieu de réessayer à l’aveugle.

ÉtatCodeSignification
400—Un paramètre manque ou est contradictoire, ou une section, un matériau ou un appui est inconnu.
401—Identifiants absents ou invalides.
413—Le JSON du modèle dépasse la taille maximale.
422invalid_modelsolve uniquement : le modèle échoue à la validation. errors et warnings indiquent où.

Rien n’est facturé à l’usage et il n’y a pas de quota de calculs : aucune erreur de crédit ni de quota, et un réessai ne coûte rien.

Autres voies

  • Serveur MCP : les mêmes outils pour les agents IA, avec un serveur local qui calcule sur votre machine.
  • 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, et les calculer en local.

Pages associées

Voir aussi

Questions fréquentes

Quelle authentification utiliser ?

Une clé d’API (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 ?

Les unités de base du SI : mètres, newtons et pascals ; angles en degrés. Le point de terminaison pratique check-beam fait exception : il prend des mètres, des kN/m et des kN.

Combien coûte un appel ?

Rien. Aucun point de terminaison n’est facturé à l’usage et il n’y a pas de quota de calculs : solve et check-beam renvoient un lien, et le calcul s’exécute dans le navigateur qui l’ouvre. L’offre fixe la taille du modèle et l’usage : gratuite jusqu’à 100 barres pour un usage non commercial, Pro jusqu’à 10,000 pour 19.95 € par mois, usage commercial compris.

Puis-je l’importer dans ChatGPT ou Postman ?

Oui. /api/openapi.json est un document OpenAPI 3.1 complet, conçu pour être importé comme Action de GPT personnalisé ChatGPT ou dans n’importe quel outil OpenAPI.

Comment récupérer les résultats dans mon code ?

Pas via cette API : FERS Cloud n’exécute aucun solveur, donc solve renvoie un lien et non des résultats. Calculez plutôt là où votre code s’exécute — avec le paquet Python (pip install FERS, puis fers solve model.json), le paquet JavaScript dans un navigateur ou sous Node, ou le serveur MCP local @ferscloud/fers-mcp pour un agent. check-beam renvoie aussi le model construit, prêt pour chacun d’eux.

Combien de temps un lien de calcul reste-t-il valable ?

24 heures, ou jusqu’à ce que vous en ayez créé 50 plus récents. Le lien est public — toute personne qui l’a peut ouvrir le modèle — et le calcul s’exécute selon l’offre du compte qui l’ouvre.