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

Autenticació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.

EstadoCódigoSignificado
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.
422invalid_modelSolo 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?

Una clave de API (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?

Unidades básicas del SI: metros, newtons y pascales; ángulos en grados. El punto final de conveniencia check-beam es la excepción: toma metros, kN/m y kN.

¿Cuánto cuesta una llamada?

Nada. Ningún punto final se mide y no hay cuota de cálculos: 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?

Sí. /api/openapi.json es un documento OpenAPI 3.1 completo, pensado para importarse como Action de un GPT personalizado de ChatGPT o en cualquier herramienta OpenAPI.

¿Cómo obtengo los resultados en mi código?

No a través de esta API: FERS Cloud no ejecuta ningún solver, así que 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.

¿Cuánto dura un enlace de cálculo?

24 horas, o hasta que haya creado 50 más recientes. El enlace es público —cualquiera que lo tenga puede abrir el modelo— y el cálculo se ejecuta con el plan de la cuenta que lo abre.