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.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/tokenObtenir 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/meVé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-keysCré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-keysLister 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/solveExé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/validateContrô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-beamVé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/modelsLister 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/modelsEnregistrer 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.

ÉtatCodeSignification
422solver_errorLe modèle a atteint le solveur et n’a pas pu être résolu.
402insufficient_creditQuota gratuit épuisé et plus de crédit prépayé.
429daily_limit / rate_limitedQuota ou limite de fréquence atteint. Patientez puis réessayez.
409in_flightUne 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

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 ?

100 calculs réussis par semaine glissante sont gratuits. Au-delà, 0,01 € par calcul sur crédit prépayé, ou illimités avec Pro à 19.95 € par mois. validate et les points de terminaison de clés ne sont jamais comptabilisés.

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 éviter d’être facturé deux fois lors d’un réessai ?

Envoyez un 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 ?

Oui, par compte et par minute, pour freiner une boucle d’agent emballée. Le dépassement renvoie 429 avec rate_limited ; patientez puis réessayez.