{"openapi":"3.1.0","info":{"title":"StructureCalcs API","version":"1.0.0","summary":"Solve beams and trusses, query the steel section library, and render diagrams — the whole website’s engine, over HTTP.","description":"The StructureCalcs public API: the same WASM solver that powers structurecalcs.com, at the edge.\n\n**Units** — every request takes `\"units\": \"SI\"` (default) or `\"imperial\"`; each field documents its unit. SI = m · kN · kN/m · kPa · kN·m · GPa · mm⁴ · mm² · mm. Imperial = ft · kip · k/ft · ksf · k·ft · ksi · in⁴ · in² · in. Conversions are identical to the website’s.\n**Sign conventions** — loads negative = downward; applied moments clockwise-positive; support settlements DOWN IS NEGATIVE; truss member forces tension-positive.\n**Auth & limits** — anonymous (no key) is a real, free, rate-limited tier. `Authorization: Bearer sc_live_…` lifts the limits. See the tiers below.\n\n**Accuracy** — every result is held to the same hand-calculation standard as the website’s Learn examples (a permanent golden test reproduces the classical solutions through this API).\n\nNOT in v1 (roadmap, named so nobody infers omission): server-side PDF or PNG export, the report-builder document endpoints, batch/bulk solving, async jobs, webhooks, and file storage/share links.","contact":{"name":"StructureCalcs Support","url":"https://structurecalcs.com/contact"},"termsOfService":"https://structurecalcs.com/api#terms"},"servers":[{"url":"https://api.structurecalcs.com","description":"Production"}],"x-tiers":{"description":"Six flat tiers, no per-call metering. Published prices; a free tier that works in ten seconds with no signup; no identity checks; every result verified against classical hand calculations; an MCP endpoint. Paid tiers are self-serve: subscribe, pay by card, and your key is shown once — manage or cancel any time in the Stripe billing portal. Student keys are issued by hand. See https://structurecalcs.com/api#pricing","tiers":{"anonymous":{"name":"Anonymous","price":"Free","priceUnit":"","burstPerMin":10,"dayQuota":30,"monthQuota":300,"blurb":"Try it instantly, no signup. Shared per IP address.","action":"none"},"student":{"name":"Student","price":"Free","priceUnit":"","burstPerMin":60,"dayQuota":null,"monthQuota":2000,"blurb":"For students, learning, and evaluation.","valueProp":"Your own budget — the anonymous tier is shared per IP, so on a campus or office network it is consumed by whoever else is on it.","action":"request-key"},"pro":{"name":"Pro","price":"$19","priceUnit":"/mo","burstPerMin":300,"dayQuota":null,"monthQuota":50000,"blurb":"For commercial projects — includes diagram rendering.","action":"subscribe"},"consultancy":{"name":"Consultancy","price":"$79","priceUnit":"/mo","burstPerMin":600,"dayQuota":null,"monthQuota":250000,"blurb":"Team use for a practice or consultancy.","action":"subscribe"},"institution":{"name":"Institution","price":"$499","priceUnit":"/yr","burstPerMin":600,"dayQuota":null,"monthQuota":100000,"blurb":"A yearly site licence for a school or department.","action":"subscribe"},"enterprise":{"name":"AI / Enterprise","price":"$499","priceUnit":"/mo","burstPerMin":1200,"dayQuota":null,"monthQuota":1000000,"blurb":"For AI assistants and platforms calling at scale, plus custom volumes.","action":"subscribe"}}},"x-engine-version":"0.1.0+2ddec34","tags":[{"name":"solve","description":"Structural analysis."},{"name":"diagrams","description":"SVG diagrams (the website’s figures)."},{"name":"sections","description":"The steel section library (2,686 sections; 6 standards)."},{"name":"meta","description":"Health & the spec."}],"paths":{"/v1/health":{"get":{"tags":["meta"],"summary":"Liveness + the engine version.","security":[],"responses":{"200":{"description":"OK.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"engineVersion":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}}}}}}}},"/v1/openapi.json":{"get":{"tags":["meta"],"summary":"This document.","security":[],"responses":{"200":{"description":"The OpenAPI 3.1 spec."}}}},"/v1/beam/solve":{"post":{"tags":["solve"],"summary":"Solve a beam.","operationId":"solveBeam","description":"Reactions, the four diagram series (shear · moment · rotation · deflection, in the website’s display convention: sagging-positive BMD), and `extremes` (max/min with positions). Multi-span with per-span E·I and internal hinges is supported. Every response carries `links.view` — a URL that opens this exact model, solved, on structurecalcs.com.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeamSolveRequest"}}}},"responses":{"200":{"description":"The solved beam.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"X-RateLimit-Window":{"description":"The most-constraining window these counts describe: \"day\" or \"month\".","schema":{"type":"string","enum":["day","month"]}},"X-RateLimit-Limit":{"description":"Cap for that window (compute endpoints).","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeamSolveResponse"}}}},"400":{"description":"Invalid input — the body failed schema validation (see issues[]).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"The Authorization header carried an API key that is not valid. Omit it to use the anonymous tier.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"The request body exceeds 102400 bytes.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The structure is unstable (a mechanism/singular system), or the engine rejected the model.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/truss/solve":{"post":{"tags":["solve"],"summary":"Solve a 2-D pin-jointed truss.","operationId":"solveTruss","description":"Reactions, member forces (tension-positive), and node displacements. Materials take E+A or a steel-library `section` name (fills A). Supports settlements and fabrication errors (lack-of-fit, thermal). Every response carries `links.view` — a URL that opens this exact model, solved, on structurecalcs.com.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrussSolveRequest"}}}},"responses":{"200":{"description":"The solved truss.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"X-RateLimit-Window":{"description":"The most-constraining window these counts describe: \"day\" or \"month\".","schema":{"type":"string","enum":["day","month"]}},"X-RateLimit-Limit":{"description":"Cap for that window (compute endpoints).","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrussSolveResponse"}}}},"400":{"description":"Invalid input — the body failed schema validation (see issues[]).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"The Authorization header carried an API key that is not valid. Omit it to use the anonymous tier.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"The request body exceeds 102400 bytes.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The structure is unstable (a mechanism/singular system), or the engine rejected the model.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/beam/diagram":{"post":{"tags":["diagrams"],"summary":"Render a beam diagram (SVG).","operationId":"beamDiagram","description":"The same figure the website draws — `view`: problem · setup · results · shear · moment · deflection.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeamDiagramRequest"}}}},"responses":{"200":{"description":"The diagram as an SVG document, in the site’s exact figure style (light theme). Byte-identical to the figure the website renders for the same model, plus a trailing one-line attribution comment.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input — the body failed schema validation (see issues[]).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"The Authorization header carried an API key that is not valid. Omit it to use the anonymous tier.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"The request body exceeds 102400 bytes.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The structure is unstable (a mechanism/singular system), or the engine rejected the model.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/truss/diagram":{"post":{"tags":["diagrams"],"summary":"Render a truss diagram (SVG).","operationId":"trussDiagram","description":"The website’s truss figure — `view`: problem · results (tension-red / compression-blue members + deflected shape).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrussDiagramRequest"}}}},"responses":{"200":{"description":"The diagram as an SVG document, in the site’s exact figure style (light theme). Byte-identical to the figure the website renders for the same model, plus a trailing one-line attribution comment.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input — the body failed schema validation (see issues[]).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"The Authorization header carried an API key that is not valid. Omit it to use the anonymous tier.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"The request body exceeds 102400 bytes.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The structure is unstable (a mechanism/singular system), or the engine rejected the model.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/standards":{"get":{"tags":["sections"],"summary":"The standards + the coverage note.","description":"Lists the six standards, their type families, and — per standard — the EXACT published EDITION the data is transcribed from (in the `edition` field), so you can see which revision you are getting: AS4100 = AS/NZS 3679.1:2016 & 3679.2:2016; AISC = Shapes Database v15.0; EN10365 = EN 10365:2017; BS4 = BS 4-1:2005 (dims from the Blue Book / BS EN 10365:2017); JIS = G3192; IS808 = IS 808:1989 + Amendment 1. ★ Coverage: the library holds A (Ag), Ix, Iy and mass/length for all 2,686 sections. Published cross-section DIMENSIONS (d·bf·tf·tw, mm/in) are included, per standard, where they have been sourced and consistency-verified: AS4100 — ALL families; AISC — open sections (W/M/S/HP/C/MC/WT/MT/ST/L/2L) + hollow (rectangular, square, and round HSS + Pipe); EN10365 — IPE/HEA/HEB/HEM + IPN/UPN; JIS — the G3192 wide-flange H-sections; BS4 — UB/UC (Universal Beams + Columns); IS808 — ISMB/ISLB/ISHB/ISMC/ISA. NOT yet: the EN10365 UPE/HD/HL/HP-EU families, the JIS heavy-H series + I/C/L families, IS808 ISLB 500 (a corrupt source row, flagged) (and a handful of standard-Pipe sizes whose wall schedule the consistency check cannot reconcile) — a data-entry roadmap item, not an omission. Each dimension field is omitted where a shape does not have it. Section moduli (Zx/Zy) and torsion constants (J/Cw) remain a roadmap item.","responses":{"200":{"description":"Standards + total + coverage.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"ETag":{"schema":{"type":"string"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/sections":{"get":{"tags":["sections"],"summary":"Search the library.","parameters":[{"name":"standard","in":"query","schema":{"type":"string"},"description":"Filter by standard (case-insensitive)."},{"name":"type","in":"query","schema":{"type":"string"},"description":"Filter by section type (e.g. UB, W, IPE, ISMC)."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Substring match on the designation."},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":500}}],"responses":{"200":{"description":"Matching sections.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"ETag":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input — the body failed schema validation (see issues[]).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/sections/{name}":{"get":{"tags":["sections"],"summary":"One section’s properties (SI + imperial).","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"The exact designation, e.g. \"533x210x92 UB\" or \"W12X26\"."}],"responses":{"200":{"description":"The section (SI block + imperial block).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"ETag":{"schema":{"type":"string"}}}},"404":{"description":"No section with that name (the detail carries a did-you-mean).","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. The response NAMES the window it hit — burst, day, or month — in both the problem detail and X-RateLimit-Window, with a Retry-After correct for that window.","headers":{"X-Engine-Version":{"description":"The solver build (crate version + git sha). On EVERY response — solver updates are visible to API consumers.","schema":{"type":"string","example":"0.1.0+2ddec34"}},"Retry-After":{"description":"Seconds until the caller may retry, for the window that was hit.","schema":{"type":"integer"}},"X-RateLimit-Window":{"description":"Which window this 429 hit: \"burst\", \"day\", or \"month\".","schema":{"type":"string","enum":["burst","day","month"]}},"X-RateLimit-Limit":{"description":"The cap for the caller’s most-constraining window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Approximate remaining in that window (see the counting note in the docs).","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/mcp":{"post":{"tags":["meta"],"summary":"The MCP endpoint (Streamable HTTP, stateless).","security":[],"description":"A Model Context Protocol server exposing the same capabilities as tools (solve_beam, solve_truss, get_section, search_sections, render_beam_diagram, render_truss_diagram) so AI assistants can call StructureCalcs directly. JSON-RPC 2.0 over POST; `initialize` · `tools/list` · `tools/call`. Connect it in Claude: `claude mcp add --transport http structurecalcs https://api.structurecalcs.com/mcp`.","responses":{"200":{"description":"A JSON-RPC 2.0 response."}}}}},"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"sc_live_…","description":"An API key (Authorization: Bearer sc_live_…). Optional — absence is the free anonymous tier."}},"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem+json. Served with Content-Type: application/problem+json.","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","enum":["invalid_input","unauthorized","rate_limited","payload_too_large","not_found","method_not_allowed","unstable_structure","engine_error","stripe_error","internal_error"],"description":"A stable machine code. `invalid_input` (400, schema/validation — see issues[]) · `unauthorized` (401, bad API key; ABSENCE of a key is the anonymous tier, not an error) · `rate_limited` (429, with Retry-After) · `unstable_structure` (422, a mechanism/singular system, never a 500) · `engine_error` (422) · `payload_too_large` (413) · `not_found` (404) · `method_not_allowed` (405) · `stripe_error` (502, an upstream Stripe rejection surfaced with Stripe’s own message + code — returned only by the self-serve account/billing endpoints, e.g. checkout/portal, never by the analysis API) · `internal_error` (500)."},"detail":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}},"description":"Per-field validation problems (invalid_input only) — `path` is the dotted JSON path."}},"required":["type","title","status","code"]},"BeamSolveRequest":{"type":"object","properties":{"units":{"default":"SI","description":"Unit system. SI: m, kN, kN/m, kPa, kN.m, GPa, mm4, mm2, mm. imperial: ft, kip, k/ft, ksf, k.ft, ksi, in4, in2, in.","type":"string","enum":["SI","imperial"]},"spans":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"length":{"type":"number","exclusiveMinimum":0,"description":"Span length (m | ft)."},"E":{"type":"number","exclusiveMinimum":0,"description":"Young's modulus (GPa | ksi)."},"I":{"type":"number","exclusiveMinimum":0,"description":"Second moment of area (mm4 | in4)."},"connection":{"default":"rigid","description":"Joint to the PREVIOUS span at this span's left end: 'rigid' (moment-continuous) or 'hinge' (an internal shear hinge — transfers shear, releases moment). The first span must be 'rigid'.","type":"string","enum":["rigid","hinge"]}},"required":["length","E","I"],"additionalProperties":false},"description":"Consecutive spans left to right; each carries its own E·I (stepped sections supported)."},"supports":{"minItems":1,"maxItems":21,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["pin","roller","fixed"],"description":"Support type."},"position":{"type":"number","minimum":0,"description":"Position along the beam from the left end (m | ft)."},"settlement":{"default":0,"type":"number","description":"Support settlement (mm | in). DOWN IS NEGATIVE: a 10 mm settlement is -10; positive is heave."}},"required":["type","position"],"additionalProperties":false}},"loads":{"default":[],"maxItems":200,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"magnitude":{"type":"number","description":"Point load (kN | kip). Negative = downward (gravity)."},"position":{"type":"number","minimum":0,"description":"Position from the left end (m | ft)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","magnitude","position"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"udl"},"start":{"type":"number","description":"Intensity at `from` (kN/m | k/ft). Negative = downward."},"end":{"type":"number","description":"Intensity at `to` (kN/m | k/ft). Omit for uniform (defaults to `start`)."},"from":{"type":"number","minimum":0,"description":"Load start position (m | ft)."},"to":{"type":"number","minimum":0,"description":"Load end position (m | ft)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","start","from","to"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"area"},"start":{"type":"number","description":"Pressure at `from` (kPa | ksf). Negative = downward."},"end":{"type":"number","description":"Pressure at `to` (kPa | ksf). Omit for uniform."},"from":{"type":"number","minimum":0,"description":"Load start position (m | ft)."},"to":{"type":"number","minimum":0,"description":"Load end position (m | ft)."},"width":{"type":"number","exclusiveMinimum":0,"description":"Tributary width at `from` (m | ft) — pressure × width gives the line load."},"endWidth":{"type":"number","exclusiveMinimum":0,"description":"Tributary width at `to` (m | ft). Omit for constant width."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","start","from","to","width"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"moment"},"magnitude":{"type":"number","description":"Applied moment (kN.m | k.ft). CLOCKWISE POSITIVE (the app convention)."},"position":{"type":"number","minimum":0,"description":"Position from the left end (m | ft)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","magnitude","position"],"additionalProperties":false}]}},"combinations":{"type":"object","properties":{"standard":{"type":"string","enum":["AS1170","ASCE7","EN1990-UK","IS456","BSL-Japan","custom"],"description":"Loading standard: AS/NZS 1170.0 · ASCE 7-16 · BS EN 1990 + UK NA · IS 456/IS 1893 · Japan BSL Art. 82 (allowable stress — SLS only) · custom (your own factors)."},"occupancy":{"default":"office","description":"Occupancy class — drives the ψ combination factors where the standard uses them.","type":"string","enum":["residential","office","congregation","retail","storage"]},"snowZone":{"default":"general","description":"Japan only: 多雪区域 (heavy-snow zone) variants of Art. 82.","type":"string","enum":["general","heavy"]},"include":{"description":"Combination ids to run (default: all generated). Ids are returned in envelope.combinations.","maxItems":64,"type":"array","items":{"type":"string"}},"custom":{"description":"Custom combinations — required when standard = 'custom'; labelled user-defined, never code-derived.","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60,"description":"Your name for this combination (shown as the governing name)."},"kind":{"type":"string","enum":["ULS","SLS"],"description":"Limit state: ULS strength · SLS serviceability. Deflection is enveloped ONLY from SLS combinations."},"factors":{"type":"object","propertyNames":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."},"additionalProperties":{"type":"number"},"description":"Factor per load case, e.g. {\"G\": 1.2, \"Q\": 1.5} — cases you omit take factor 0."}},"required":["name","kind","factors"],"additionalProperties":false}}},"required":["standard"],"additionalProperties":false}},"required":["spans","supports"],"additionalProperties":false},"TrussSolveRequest":{"type":"object","properties":{"units":{"default":"SI","description":"Unit system. SI: m, kN, kN/m, kPa, kN.m, GPa, mm4, mm2, mm. imperial: ft, kip, k/ft, ksf, k.ft, ksi, in4, in2, in.","type":"string","enum":["SI","imperial"]},"nodes":{"minItems":2,"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Node id (unique)."},"x":{"type":"number","description":"X coordinate (m | ft)."},"y":{"type":"number","description":"Y coordinate (m | ft)."}},"required":["id","x","y"],"additionalProperties":false}},"members":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Member id (unique)."},"from":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Start node id."},"to":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"End node id."},"material":{"default":1,"description":"Material id (see `materials`). Defaults to 1.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id","from","to"],"additionalProperties":false}},"materials":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Material id, referenced by members."},"E":{"type":"number","exclusiveMinimum":0,"description":"Young's modulus (GPa | ksi). Optional when `section` is given (defaults to 200 GPa steel)."},"A":{"type":"number","exclusiveMinimum":0,"description":"Cross-section area (mm2 | in2). Optional when `section` is given (filled from the steel library)."},"section":{"type":"string","minLength":1,"maxLength":64,"description":"A steel-library section name (e.g. '310UB40.4' or 'W12X26') — fills A from the library's Ag. 2,686 sections across AS4100, AISC, EN10365, BS4, JIS, IS808."}},"required":["id"],"additionalProperties":false}},"supports":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"node":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Supported node id."},"type":{"type":"string","enum":["pin","roller"],"description":"Support type."},"angle":{"default":0,"type":"number","description":"Support rotation in degrees (an inclined roller rolls along this angle). Default 0."},"settlement":{"default":{"x":0,"y":0},"type":"object","properties":{"x":{"default":0,"type":"number","description":"Horizontal settlement (mm | in)."},"y":{"default":0,"type":"number","description":"Vertical settlement (mm | in). DOWN IS NEGATIVE (a 5 mm settlement is -5)."}},"additionalProperties":false}},"required":["node","type"],"additionalProperties":false}},"loads":{"default":[],"maxItems":500,"type":"array","items":{"anyOf":[{"type":"object","properties":{"node":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fx":{"default":0,"type":"number","description":"Horizontal force (kN | kip). Positive = +x."},"fy":{"default":0,"type":"number","description":"Vertical force (kN | kip). NEGATIVE = DOWNWARD (gravity loads are negative)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["node"],"additionalProperties":false},{"type":"object","properties":{"node":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"magnitude":{"type":"number","description":"Force magnitude (kN | kip)."},"angle":{"type":"number","description":"Direction in degrees (0 = +x, counter-clockwise positive)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["node","magnitude","angle"],"additionalProperties":false}]}},"fabricationErrors":{"default":[],"maxItems":200,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"lack-of-fit"},"member":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Member id."},"deltaLength":{"type":"number","description":"Fabrication length error (mm | in). NEGATIVE = fabricated SHORT."}},"required":["type","member","deltaLength"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"thermal"},"member":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Member id."},"alpha":{"type":"number","description":"Thermal expansion coefficient (/°C)."},"deltaT":{"type":"number","description":"Temperature change (°C). Positive = heating."}},"required":["type","member","alpha","deltaT"],"additionalProperties":false}]}},"combinations":{"type":"object","properties":{"standard":{"type":"string","enum":["AS1170","ASCE7","EN1990-UK","IS456","BSL-Japan","custom"],"description":"Loading standard: AS/NZS 1170.0 · ASCE 7-16 · BS EN 1990 + UK NA · IS 456/IS 1893 · Japan BSL Art. 82 (allowable stress — SLS only) · custom (your own factors)."},"occupancy":{"default":"office","description":"Occupancy class — drives the ψ combination factors where the standard uses them.","type":"string","enum":["residential","office","congregation","retail","storage"]},"snowZone":{"default":"general","description":"Japan only: 多雪区域 (heavy-snow zone) variants of Art. 82.","type":"string","enum":["general","heavy"]},"include":{"description":"Combination ids to run (default: all generated). Ids are returned in envelope.combinations.","maxItems":64,"type":"array","items":{"type":"string"}},"custom":{"description":"Custom combinations — required when standard = 'custom'; labelled user-defined, never code-derived.","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60,"description":"Your name for this combination (shown as the governing name)."},"kind":{"type":"string","enum":["ULS","SLS"],"description":"Limit state: ULS strength · SLS serviceability. Deflection is enveloped ONLY from SLS combinations."},"factors":{"type":"object","propertyNames":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."},"additionalProperties":{"type":"number"},"description":"Factor per load case, e.g. {\"G\": 1.2, \"Q\": 1.5} — cases you omit take factor 0."}},"required":["name","kind","factors"],"additionalProperties":false}}},"required":["standard"],"additionalProperties":false}},"required":["nodes","members","materials","supports"],"additionalProperties":false},"BeamDiagramRequest":{"type":"object","properties":{"units":{"default":"SI","description":"Unit system. SI: m, kN, kN/m, kPa, kN.m, GPa, mm4, mm2, mm. imperial: ft, kip, k/ft, ksf, k.ft, ksi, in4, in2, in.","type":"string","enum":["SI","imperial"]},"spans":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"length":{"type":"number","exclusiveMinimum":0,"description":"Span length (m | ft)."},"E":{"type":"number","exclusiveMinimum":0,"description":"Young's modulus (GPa | ksi)."},"I":{"type":"number","exclusiveMinimum":0,"description":"Second moment of area (mm4 | in4)."},"connection":{"default":"rigid","description":"Joint to the PREVIOUS span at this span's left end: 'rigid' (moment-continuous) or 'hinge' (an internal shear hinge — transfers shear, releases moment). The first span must be 'rigid'.","type":"string","enum":["rigid","hinge"]}},"required":["length","E","I"],"additionalProperties":false},"description":"Consecutive spans left to right; each carries its own E·I (stepped sections supported)."},"supports":{"minItems":1,"maxItems":21,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["pin","roller","fixed"],"description":"Support type."},"position":{"type":"number","minimum":0,"description":"Position along the beam from the left end (m | ft)."},"settlement":{"default":0,"type":"number","description":"Support settlement (mm | in). DOWN IS NEGATIVE: a 10 mm settlement is -10; positive is heave."}},"required":["type","position"],"additionalProperties":false}},"loads":{"default":[],"maxItems":200,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"point"},"magnitude":{"type":"number","description":"Point load (kN | kip). Negative = downward (gravity)."},"position":{"type":"number","minimum":0,"description":"Position from the left end (m | ft)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","magnitude","position"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"udl"},"start":{"type":"number","description":"Intensity at `from` (kN/m | k/ft). Negative = downward."},"end":{"type":"number","description":"Intensity at `to` (kN/m | k/ft). Omit for uniform (defaults to `start`)."},"from":{"type":"number","minimum":0,"description":"Load start position (m | ft)."},"to":{"type":"number","minimum":0,"description":"Load end position (m | ft)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","start","from","to"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"area"},"start":{"type":"number","description":"Pressure at `from` (kPa | ksf). Negative = downward."},"end":{"type":"number","description":"Pressure at `to` (kPa | ksf). Omit for uniform."},"from":{"type":"number","minimum":0,"description":"Load start position (m | ft)."},"to":{"type":"number","minimum":0,"description":"Load end position (m | ft)."},"width":{"type":"number","exclusiveMinimum":0,"description":"Tributary width at `from` (m | ft) — pressure × width gives the line load."},"endWidth":{"type":"number","exclusiveMinimum":0,"description":"Tributary width at `to` (m | ft). Omit for constant width."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","start","from","to","width"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"moment"},"magnitude":{"type":"number","description":"Applied moment (kN.m | k.ft). CLOCKWISE POSITIVE (the app convention)."},"position":{"type":"number","minimum":0,"description":"Position from the left end (m | ft)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["type","magnitude","position"],"additionalProperties":false}]}},"combinations":{"type":"object","properties":{"standard":{"type":"string","enum":["AS1170","ASCE7","EN1990-UK","IS456","BSL-Japan","custom"],"description":"Loading standard: AS/NZS 1170.0 · ASCE 7-16 · BS EN 1990 + UK NA · IS 456/IS 1893 · Japan BSL Art. 82 (allowable stress — SLS only) · custom (your own factors)."},"occupancy":{"default":"office","description":"Occupancy class — drives the ψ combination factors where the standard uses them.","type":"string","enum":["residential","office","congregation","retail","storage"]},"snowZone":{"default":"general","description":"Japan only: 多雪区域 (heavy-snow zone) variants of Art. 82.","type":"string","enum":["general","heavy"]},"include":{"description":"Combination ids to run (default: all generated). Ids are returned in envelope.combinations.","maxItems":64,"type":"array","items":{"type":"string"}},"custom":{"description":"Custom combinations — required when standard = 'custom'; labelled user-defined, never code-derived.","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60,"description":"Your name for this combination (shown as the governing name)."},"kind":{"type":"string","enum":["ULS","SLS"],"description":"Limit state: ULS strength · SLS serviceability. Deflection is enveloped ONLY from SLS combinations."},"factors":{"type":"object","propertyNames":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."},"additionalProperties":{"type":"number"},"description":"Factor per load case, e.g. {\"G\": 1.2, \"Q\": 1.5} — cases you omit take factor 0."}},"required":["name","kind","factors"],"additionalProperties":false}}},"required":["standard"],"additionalProperties":false},"view":{"default":"setup","description":"Which figure: 'problem' (clean setup) · 'setup' (with reactions) · 'results' (reactions + deflected shape) · 'shear' | 'moment' | 'deflection' (the charts, site display convention: sagging-positive BMD).","type":"string","enum":["problem","setup","results","shear","moment","deflection"]},"deformed":{"default":false,"description":"Overlay the deflected shape on the 'setup' view.","type":"boolean"},"width":{"description":"SVG width in px (default 860 — the site figure width).","type":"integer","minimum":400,"maximum":2000},"height":{"description":"SVG height in px (defaults per view: 250 beam · 240 charts · 460 truss).","type":"integer","minimum":150,"maximum":1500},"theme":{"default":"light","description":"Colour theme: 'light' (default — the paper look, byte-identical to the site's figures) or 'dark' (dark-mode figures on a slate ground).","type":"string","enum":["light","dark"]},"style":{"default":"modern","description":"Drawing style: 'modern' (default — the site's textbook look: open-triangle supports with a solid hinge dot) or 'classic' (the original engineering-schematic glyphs).","type":"string","enum":["classic","modern"]}},"required":["spans","supports"],"additionalProperties":false},"TrussDiagramRequest":{"type":"object","properties":{"units":{"default":"SI","description":"Unit system. SI: m, kN, kN/m, kPa, kN.m, GPa, mm4, mm2, mm. imperial: ft, kip, k/ft, ksf, k.ft, ksi, in4, in2, in.","type":"string","enum":["SI","imperial"]},"nodes":{"minItems":2,"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Node id (unique)."},"x":{"type":"number","description":"X coordinate (m | ft)."},"y":{"type":"number","description":"Y coordinate (m | ft)."}},"required":["id","x","y"],"additionalProperties":false}},"members":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Member id (unique)."},"from":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Start node id."},"to":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"End node id."},"material":{"default":1,"description":"Material id (see `materials`). Defaults to 1.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id","from","to"],"additionalProperties":false}},"materials":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Material id, referenced by members."},"E":{"type":"number","exclusiveMinimum":0,"description":"Young's modulus (GPa | ksi). Optional when `section` is given (defaults to 200 GPa steel)."},"A":{"type":"number","exclusiveMinimum":0,"description":"Cross-section area (mm2 | in2). Optional when `section` is given (filled from the steel library)."},"section":{"type":"string","minLength":1,"maxLength":64,"description":"A steel-library section name (e.g. '310UB40.4' or 'W12X26') — fills A from the library's Ag. 2,686 sections across AS4100, AISC, EN10365, BS4, JIS, IS808."}},"required":["id"],"additionalProperties":false}},"supports":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"node":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Supported node id."},"type":{"type":"string","enum":["pin","roller"],"description":"Support type."},"angle":{"default":0,"type":"number","description":"Support rotation in degrees (an inclined roller rolls along this angle). Default 0."},"settlement":{"default":{"x":0,"y":0},"type":"object","properties":{"x":{"default":0,"type":"number","description":"Horizontal settlement (mm | in)."},"y":{"default":0,"type":"number","description":"Vertical settlement (mm | in). DOWN IS NEGATIVE (a 5 mm settlement is -5)."}},"additionalProperties":false}},"required":["node","type"],"additionalProperties":false}},"loads":{"default":[],"maxItems":500,"type":"array","items":{"anyOf":[{"type":"object","properties":{"node":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fx":{"default":0,"type":"number","description":"Horizontal force (kN | kip). Positive = +x."},"fy":{"default":0,"type":"number","description":"Vertical force (kN | kip). NEGATIVE = DOWNWARD (gravity loads are negative)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["node"],"additionalProperties":false},{"type":"object","properties":{"node":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"magnitude":{"type":"number","description":"Force magnitude (kN | kip)."},"angle":{"type":"number","description":"Direction in degrees (0 = +x, counter-clockwise positive)."},"case":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."}},"required":["node","magnitude","angle"],"additionalProperties":false}]}},"fabricationErrors":{"default":[],"maxItems":200,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"lack-of-fit"},"member":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Member id."},"deltaLength":{"type":"number","description":"Fabrication length error (mm | in). NEGATIVE = fabricated SHORT."}},"required":["type","member","deltaLength"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"thermal"},"member":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Member id."},"alpha":{"type":"number","description":"Thermal expansion coefficient (/°C)."},"deltaT":{"type":"number","description":"Temperature change (°C). Positive = heating."}},"required":["type","member","alpha","deltaT"],"additionalProperties":false}]}},"combinations":{"type":"object","properties":{"standard":{"type":"string","enum":["AS1170","ASCE7","EN1990-UK","IS456","BSL-Japan","custom"],"description":"Loading standard: AS/NZS 1170.0 · ASCE 7-16 · BS EN 1990 + UK NA · IS 456/IS 1893 · Japan BSL Art. 82 (allowable stress — SLS only) · custom (your own factors)."},"occupancy":{"default":"office","description":"Occupancy class — drives the ψ combination factors where the standard uses them.","type":"string","enum":["residential","office","congregation","retail","storage"]},"snowZone":{"default":"general","description":"Japan only: 多雪区域 (heavy-snow zone) variants of Art. 82.","type":"string","enum":["general","heavy"]},"include":{"description":"Combination ids to run (default: all generated). Ids are returned in envelope.combinations.","maxItems":64,"type":"array","items":{"type":"string"}},"custom":{"description":"Custom combinations — required when standard = 'custom'; labelled user-defined, never code-derived.","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60,"description":"Your name for this combination (shown as the governing name)."},"kind":{"type":"string","enum":["ULS","SLS"],"description":"Limit state: ULS strength · SLS serviceability. Deflection is enveloped ONLY from SLS combinations."},"factors":{"type":"object","propertyNames":{"type":"string","enum":["G","Q","Qr","W","E","S","R","T"],"description":"Load case for combinations: G dead · Q live · Qr roof live · W wind · E earthquake · S snow · R rain · T thermal. Absent = G."},"additionalProperties":{"type":"number"},"description":"Factor per load case, e.g. {\"G\": 1.2, \"Q\": 1.5} — cases you omit take factor 0."}},"required":["name","kind","factors"],"additionalProperties":false}}},"required":["standard"],"additionalProperties":false},"view":{"default":"results","description":"Which figure: 'problem' (geometry + loads + supports) · 'results' (reactions + member forces coloured tension-red/compression-blue + deflected shape).","type":"string","enum":["problem","results"]},"width":{"description":"SVG width in px (default 860).","type":"integer","minimum":400,"maximum":2000},"height":{"description":"SVG height in px (default 460).","type":"integer","minimum":150,"maximum":1500},"theme":{"default":"light","description":"Colour theme: 'light' (default — the paper look, byte-identical to the site's figures) or 'dark' (dark-mode figures on a slate ground).","type":"string","enum":["light","dark"]},"style":{"default":"modern","description":"Drawing style: 'modern' (default — the site's textbook look: open-triangle supports with a solid hinge dot) or 'classic' (the original engineering-schematic glyphs).","type":"string","enum":["classic","modern"]}},"required":["nodes","members","materials","supports"],"additionalProperties":false},"BeamSolveResponse":{"type":"object","properties":{"reactions":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"position":{"type":"number"},"vertical":{"type":"number","description":"Vertical reaction, up-positive (kN | kip)."},"moment":{"type":"number","description":"Reaction moment (kN·m | k·ft)."}}}},"diagrams":{"type":"object","properties":{"shear":{"$ref":"#/components/schemas/Series"},"moment":{"$ref":"#/components/schemas/Series"},"rotation":{"$ref":"#/components/schemas/Series"},"deflection":{"$ref":"#/components/schemas/Series"}},"description":"Each series is [position, value] pairs, in the display convention (sagging-positive BMD)."},"extremes":{"type":"object","description":"Max/min with the position each occurs at.","properties":{"shear":{"type":"object"},"moment":{"type":"object"},"deflection":{"type":"object"}}},"meta":{"$ref":"#/components/schemas/Meta"},"links":{"$ref":"#/components/schemas/Links"}}},"TrussSolveResponse":{"type":"object","properties":{"reactions":{"type":"array","items":{"type":"object","properties":{"node":{"type":"integer"},"horizontal":{"type":"number"},"vertical":{"type":"number"}}}},"memberForces":{"type":"array","items":{"type":"object","properties":{"member":{"type":"integer"},"from":{"type":"integer"},"to":{"type":"integer"},"force":{"type":"number","description":"Axial force, TENSION-POSITIVE / compression-negative (kN | kip)."}}}},"displacements":{"type":"array","items":{"type":"object","properties":{"node":{"type":"integer"},"dx":{"type":"number"},"dy":{"type":"number"}}}},"meta":{"$ref":"#/components/schemas/Meta"},"links":{"$ref":"#/components/schemas/Links"}}},"Series":{"type":"array","items":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"description":"[position, value] pairs."},"Meta":{"type":"object","properties":{"engineVersion":{"type":"string"},"units":{"type":"string","enum":["SI","imperial"]},"unitLabels":{"type":"object"},"computeMs":{"type":"number"},"attribution":{"type":"string","description":"One-line attribution: \"Solved by StructureCalcs — structurecalcs.com\"."},"warnings":{"type":"array","items":{"type":"string"},"description":"Non-fatal advisories — e.g. every load points UPWARD (+), which usually means the caller assumed down-positive; the convention is NEGATIVE = downward."}}},"Links":{"type":"object","description":"links.view opens THIS EXACT model, solved, on structurecalcs.com — the SI-normalized, material-resolved model is deflate-raw + base64url encoded into the URL’s ?model= parameter. The whole `links` block is OMITTED when the encoded URL would exceed 2,000 characters: a model is never truncated, so the link can never show something different from this response.","properties":{"view":{"type":"string","format":"uri","description":"Open this model, solved, in the interactive calculator."}}}}},"security":[{"bearerApiKey":[]},{}]}