Referință API REST

Fiecare punct final de mai jos poate fi apelat din orice limbaj prin HTTP simplu, iar specificația completă este livrată ca OpenAPI 3.1 pentru generatoare de clienți și Actions de GPT personalizat ChatGPT. Serverul nu rulează niciun solver: solve și check-beam validează modelul și returnează un link care îl calculează într-un browser. Mărimile modelului sunt în unități de bază SI.

Specificația citibilă de mașini

Specificația completă se află la ferscloud.com/api/openapi.json, în format OpenAPI 3.1. Este livrată cu CORS permisiv și este permisă explicit în robots.txt, astfel încât uneltele și agenții o pot descărca direct.

Autentificați-vă fie cu antetul X-API-Key (o cheie permanentă din pagina de profil), fie cu un token Bearer obținut prin POST /api/sdk/token. Varianta cu cheie funcționează pentru orice metodă de autentificare; cea cu token doar pentru conturile cu e-mail și parolă.

# 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

Autentificare și chei API

Creați o cheie o singură dată, păstrați-o pe server și trimiteți-o ca X-API-Key la fiecare cerere. Cheile sunt afișate doar la creare și pot fi revocate oricând.

POST /api/sdk/token — Obținerea unui JWT de scurtă durată

{
  "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 — Verificarea unei chei și datele utilizatorului

{
  "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 — Crearea unei chei 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 — Listarea cheilor 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> — Revocarea unei chei 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 nu rulează niciun solver. solve validează modelul, îl păstrează ca ciornă publică și răspunde HTTP 200 cu status: "solve_in_browser" și un open_url. Deschiderea acestui link calculează modelul în browser, la planul contului care îl deschide: gratuit până la 100 bare, Pro până la 10,000. Linkul rămâne valabil 24 de ore. Un model care nu trece validarea primește, în locul unui link, 422 invalid_model cu erorile.

check-beam construiește o grindă cu verificarea ei EN 1993-1-1, răspunde la fel și returnează în plus model-ul construit. Pentru rezultate în propriul cod, calculați acolo unde rulează codul: cu pachetul Python (fers solve model.json), pachetul JavaScript sau serverul MCP local.

Niciunul dintre aceste puncte finale nu este taxat. Sunt gemenii REST ai instrumentelor solve_model și check_beam de pe serverul MCP găzduit și returnează același răspuns.

POST /api/sdk/solve — Obținerea unui link care calculează un model în browser

{
  "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 — Verificarea unui model fără a-l calcula

{
  "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 — Construirea unei verificări de grindă EN 1993-1-1 și obținerea linkului ei 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 apel complet

Verificarea grinzii este cea mai rapidă cale de a confirma că cheia funcționează: o singură cerere construiește o deschidere simplă cu verificarea ei EN 1993-1-1 și returnează linkul care o evaluează, împreună cu modelul 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
  }'

Unitățile acestui punct final sunt pragmatice, nu SI: span_m în metri, udl în kN/m și point_load în kN, în jos. Punctele finale pentru modele lucrează integral în SI.

Modele salvate

Stocarea în cloud este o funcție Pro. În planul gratuit păstrați modelele ca JSON local — același format pe care aceste puncte finale îl acceptă și îl returnează.

GET /api/sdk/models — Listarea modelelor salvate

{
  "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 — Salvarea unui model nou

{
  "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} — Descărcarea unui model

{
  "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} — Actualizarea unui model

{
  "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} — Ștergerea unui model

{
  "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ăspunsuri de eroare

Codul de stare îi spune clientului de ce un apel nu a returnat niciun link, ca să poată corecta datele de intrare în loc să reîncerce orbește.

StareCodSemnificație
400—Un parametru lipsește sau este contradictoriu, ori o secțiune, un material sau un reazem este necunoscut.
401—Credențiale lipsă sau nevalide.
413—JSON-ul modelului depășește limita de dimensiune.
422invalid_modelDoar solve: modelul nu trece validarea. errors și warnings arată unde.

Nimic nu este taxat și nu există o cotă de calcule, deci nu există erori de credit sau de cotă, iar o reîncercare nu costă nimic.

Alte căi de acces

  • Server MCP — aceleași instrumente pentru agenți AI, cu un server local care calculează pe calculatorul dumneavoastră.
  • Pachetul JavaScript — calcul în browser, fără niciun apel HTTP.
  • Pachetul Python — construirea modelelor cu obiecte, nu cu JSON brut, și calculul lor local.

Pagini conexe

Vezi și

Întrebări frecvente

Ce metodă de autentificare să folosesc?

O cheie API (X-API-Key) pentru tot ce este automatizat. Calea POST /api/sdk/token funcționează doar pentru conturile create cu e-mail și parolă, iar tokenul ei expiră după o oră.

Ce unități folosește JSON-ul modelului?

Unități de bază SI: metri, newtoni și pascali; unghiuri în grade. Punctul final de conveniență check-beam face excepție — acesta primește metri, kN/m și kN.

Cât costă un apel?

Nimic. Niciun punct final nu este taxat și nu există o cotă de calcule: solve și check-beam returnează un link, iar calculul rulează în browserul care îl deschide. Planul stabilește dimensiunea modelului și tipul de utilizare: gratuit până la 100 bare pentru uz necomercial, Pro până la 10,000 pentru 19.95 € pe lună, cu uz comercial inclus.

Pot importa acest lucru în ChatGPT sau Postman?

Da. /api/openapi.json este un document OpenAPI 3.1 complet, gândit să fie importat ca Action de GPT personalizat ChatGPT sau în orice unealtă OpenAPI.

Cum obțin rezultatele în propriul cod?

Nu prin acest API: FERS Cloud nu rulează niciun solver, așa că solve returnează un link, nu rezultate. Calculați acolo unde rulează codul dumneavoastră — cu pachetul Python (pip install FERS, apoi fers solve model.json), cu pachetul JavaScript în browser sau în Node, ori cu serverul MCP local @ferscloud/fers-mcp pentru un agent. check-beam returnează și model-ul construit, gata pentru oricare dintre ele.

Cât timp este valabil un link de calcul?

24 de ore sau până când ați creat alte 50 mai noi. Linkul este public — oricine îl are poate deschide modelul — iar calculul rulează la planul contului care îl deschide.