Referencia de la API REST
Todos los puntos finales de abajo se pueden invocar desde cualquier lenguaje por HTTP simple, y la especificación completa se sirve como OpenAPI 3.1 para generadores de clientes y Actions de GPT personalizados de ChatGPT. El servidor no ejecuta ningún solver: solve y check-beam validan el modelo y devuelven un enlace que lo calcula en un navegador. Las magnitudes del modelo van en unidades básicas del SI.
La especificación legible por máquina
La especificación completa está en ferscloud.com/api/openapi.json, en formato OpenAPI 3.1. Se sirve con CORS permisivo y está explícitamente permitida en robots.txt, de modo que herramientas y agentes pueden descargarla directamente.
Autentíquese con la cabecera X-API-Key (una clave permanente de su página de perfil) o con un token Bearer de POST /api/sdk/token. La forma con clave funciona con cualquier método de acceso; la del token, solo con cuentas de correo y contraseña.
# 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.jsonAutenticación y claves de API
Cree una clave una vez, guárdela en el servidor y envíela como X-API-Key en cada petición. Las claves se muestran una sola vez al crearlas y pueden revocarse en cualquier momento.
POST /api/sdk/token — Obtener un JWT de corta duración
{
"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 — Verificar una clave y obtener datos del usuario
{
"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 — Crear una clave de 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 — Listar claves de 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> — Revocar una clave de 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"
}
}Cálculo
FERS Cloud no ejecuta ningún solver. solve valida el modelo, lo guarda como borrador público y responde HTTP 200 con status: "solve_in_browser" y una open_url. Al abrir ese enlace, el modelo se calcula en el navegador con el plan de la cuenta que lo abre: gratuito hasta 100 barras, Pro hasta 10,000. El enlace es válido durante 24 horas. Un modelo que no supera la validación recibe 422 invalid_model con los errores en lugar de un enlace.
check-beam construye una viga con su comprobación EN 1993-1-1, responde del mismo modo y además devuelve el model construido. Para obtener resultados en su propio código, calcule donde se ejecuta ese código: con el paquete de Python (fers solve model.json), el paquete de JavaScript o el servidor MCP local.
Ninguno de estos puntos finales se mide. Son los gemelos REST de las herramientas solve_model y check_beam del servidor MCP alojado y devuelven la misma respuesta.
POST /api/sdk/solve — Obtener un enlace que calcula un modelo en el navegador
{
"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 — Revisar un modelo sin calcularlo
{
"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 — Construir una comprobación de viga EN 1993-1-1 y obtener su enlace de cálculo
{
"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>"
}
}Una llamada completa
La comprobación de viga es la forma más rápida de confirmar que su clave funciona: una sola petición construye un vano con su comprobación EN 1993-1-1 y devuelve el enlace que la evalúa, junto con el modelo construido.
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
}'Las unidades de este punto final son pragmáticas en lugar de SI: span_m en metros, udl en kN/m y point_load en kN hacia abajo. Los puntos finales de modelo trabajan en SI de principio a fin.
Modelos guardados
El almacenamiento en la nube es una función Pro. En el plan gratuito conserve los modelos como JSON local: es el mismo formato que estos puntos finales aceptan y devuelven.
GET /api/sdk/models — Listar modelos guardados
{
"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 — Guardar un modelo nuevo
{
"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} — Descargar un modelo
{
"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} — Actualizar un modelo
{
"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} — Eliminar un modelo
{
"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"
}Respuestas de error
El código de estado indica a un cliente por qué una llamada no devolvió un enlace, para que pueda corregir la entrada en lugar de reintentar a ciegas.
| Estado | Código | Significado |
|---|---|---|
| 400 | — | Falta un parámetro o hay parámetros contradictorios, o se desconoce una sección, un material o un apoyo. |
| 401 | — | Credenciales ausentes o no válidas. |
| 413 | — | El JSON del modelo supera el límite de tamaño. |
| 422 | invalid_model | Solo solve: el modelo no supera la validación. errors y warnings indican dónde. |
No se mide nada y no hay cuota de cálculos, así que no hay errores de saldo ni de cuota, y un reintento no cuesta nada.
Otras vías
- Servidor MCP: las mismas herramientas para agentes de IA, con un servidor local que calcula en su equipo.
- Paquete de JavaScript: calcular en el navegador sin ninguna llamada HTTP.
- Paquete de Python: construir modelos con objetos en lugar de JSON en bruto y calcularlos localmente.
Páginas relacionadas
Véase también
Preguntas frecuentes
¿Qué método de autenticación debo usar?
X-API-Key) para todo lo automatizado. La vía POST /api/sdk/token solo funciona en cuentas creadas con correo y contraseña, y su token caduca en una hora.¿Qué unidades usa el JSON del modelo?
check-beam es la excepción: toma metros, kN/m y kN.¿Cuánto cuesta una llamada?
solve y check-beam devuelven un enlace, y el cálculo se ejecuta en el navegador que lo abre. El plan fija el tamaño del modelo y el uso: gratuito hasta 100 barras para uso no comercial, Pro hasta 10,000 por 19.95 € al mes, uso comercial incluido.¿Puedo importar esto en ChatGPT o Postman?
¿Cómo obtengo los resultados en mi código?
solve devuelve un enlace en lugar de resultados. Calcule donde se ejecuta su código: con el paquete de Python (pip install FERS y después fers solve model.json), el paquete de JavaScript en un navegador o en Node, o con el servidor MCP local @ferscloud/fers-mcp para un agente. check-beam también devuelve el model construido, listo para cualquiera de ellos.