REST-API-referentie

Elk eindpunt hieronder is vanuit elke taal via gewoon HTTP aan te roepen. Modelgrootheden zijn SI-basiseenheden — meters, newton en pascal. De volledige machineleesbare specificatie wordt als OpenAPI 3.1 geleverd en is direct te importeren in een clientgenerator of in een ChatGPT Custom GPT Action.

De machineleesbare specificatie

De volledige specificatie staat op ferscloud.com/api/openapi.json, in OpenAPI 3.1. Ze wordt met ruime CORS geleverd en is in robots.txt uitdrukkelijk toegestaan, zodat gereedschappen en agents haar rechtstreeks kunnen ophalen.

Authenticeer met de header X-API-Key (een permanente sleutel van uw profielpagina) of met een Bearer-token uit POST /api/sdk/token. De sleutelvorm werkt voor elke aanmeldmethode; de tokenvorm alleen voor accounts met e-mail en wachtwoord.

# 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

Authenticatie en API-sleutels

Maak eenmalig een sleutel aan, houd hem serverzijdig en stuur hem bij elk verzoek als X-API-Key mee. Sleutels worden alleen bij het aanmaken getoond en zijn altijd in te trekken.

POST /api/sdk/tokenEen kortlevend JWT ophalen

{
  "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/meEen sleutel controleren en gebruikersgegevens ophalen

{
  "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-keysEen permanente API-sleutel aanmaken

{
  "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-keysAPI-sleutels tonen

{
  "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>Een API-sleutel intrekken

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

Solver

solve en check-beam worden geteld: elke geslaagde aanroep gebruikt één van uw 100 gratis wekelijkse berekeningen, daarna prepaid tegoed à € 0,01 per berekening. validate is gratis en wordt niet geteld.

Het zijn de REST-tweelingen van de MCP-gereedschappen solve_model en check_beam, dus een agent en een script volgen exact hetzelfde codepad.

POST /api/sdk/solveDe eindige-elementensolver uitvoeren

{
  "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/validateEen model controleren zonder te rekenen

{
  "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-beamKant-en-klare staaltoetsing volgens EN 1993-1-1

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

Een volledige aanroep

De kant-en-klare liggertoetsing is de snelste manier om te bevestigen dat uw sleutel werkt — ze bouwt, rekent en toetst één overspanning in één verzoek.

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
  }'

De eenheden van dit eindpunt zijn pragmatisch in plaats van SI: span_m in meters, udl in kN/m en point_load in kN neerwaarts. De modeleindpunten werken volledig in SI.

Opgeslagen modellen

Cloudopslag is een Pro-functie. In het gratis abonnement bewaart u modellen als lokale JSON — hetzelfde formaat dat deze eindpunten accepteren en teruggeven.

GET /api/sdk/modelsOpgeslagen modellen tonen

{
  "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/modelsEen nieuw model opslaan

{
  "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}Een model downloaden

{
  "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}Een model bijwerken

{
  "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}Een model verwijderen

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

Foutantwoorden

De getelde eindpunten gebruiken HTTP-statuscodes om te onderscheiden waarom een aanroep niet is uitgevoerd, zodat een client gericht opnieuw kan proberen in plaats van elke fout gelijk te behandelen.

StatusCodeBetekenis
422solver_errorHet model bereikte de solver en kon niet worden opgelost.
402insufficient_creditGratis quotum op en geen prepaid tegoed meer.
429daily_limit / rate_limitedQuotum of snelheidslimiet bereikt. Wacht en probeer opnieuw.
409in_flightEr loopt al een verzoek met dezelfde idempotency_key.

Geef solve een idempotency_key mee zodat een herhaald verzoek opnieuw wordt afgespeeld in plaats van dubbel geteld; meta.replayed in het antwoord vertelt wat er is gebeurd.

Andere ingangen

  • MCP-server — dezelfde mogelijkheden als gereedschappen die een AI-agent rechtstreeks kan aanroepen.
  • JavaScript-pakket — in de browser rekenen, zonder enige HTTP-aanroep.
  • Python-pakket — modellen bouwen met objecten in plaats van ruw JSON.

Gerelateerde pagina’s

Zie ook

Veelgestelde vragen

Welke authenticatie moet ik gebruiken?

Een API-sleutel (X-API-Key) voor alles wat geautomatiseerd is. De route POST /api/sdk/token werkt alleen voor accounts die met e-mail en wachtwoord zijn aangemaakt, en het token verloopt na een uur.

Welke eenheden gebruikt de model-JSON?

SI-basiseenheden: meters, newton en pascal; hoeken in graden. Het gemakseindpunt check-beam is de uitzondering — dat neemt meters, kN/m en kN.

Wat kost een aanroep?

100 geslaagde berekeningen per voortschrijdende week zijn gratis. Daarna € 0,01 per berekening uit prepaid tegoed, of onbeperkt met Pro voor € 19.95 per maand. validate en de sleuteleindpunten worden nooit geteld.

Kan ik dit in ChatGPT of Postman importeren?

Ja. /api/openapi.json is een volledig OpenAPI 3.1-document, bedoeld om te importeren als ChatGPT Custom GPT Action of in willekeurig OpenAPI-gereedschap.

Hoe voorkom ik dubbele kosten bij een nieuwe poging?

Stuur een idempotency_key mee met het rekenverzoek. Een herhaling met dezelfde sleutel geeft het opgeslagen resultaat terug met meta.replayed: true in plaats van opnieuw te rekenen, en een gelijktijdige herhaling geeft 409.

Is er een snelheidslimiet?

Ja, per account en per minuut, om een op hol geslagen agentlus af te remmen. Bij overschrijding volgt 429 met rate_limited; wacht en probeer opnieuw.