API: moment–curvature
POST /v1/moment-curvature — request and response fields for the fiber-integrated M–φ analysis, with runnable examples.
Runs the named plane-sections fiber-equilibrium method for steel, reinforced/prestressed concrete, and declared composite sections. At every curvature the solver finds the centroidal strain that balances the requested axial force, then integrates the material stresses into moment. See the scientific method page or use the interactive tool.
Endpoint
https://api.pilecalc.com/v1/moment-curvature/v1/moment-curvature?key=…&req=…&fields=…(for header-less callers)Every request requires unitSystem. The SI bundle is m, kN, kPa, kN·m and kN·m²; the US bundle is ft, kip, ksf, kip·ft and kip·ft². Mixed in/ksi payloads are not a valid us API request even though the unit-agnostic core can be used that way in internal validation.
Authentication, rate limits, and the error envelope are shared by every endpoint — see the API overview. Requests are unit-agnostic: any self-consistent unit system works, and results come back in the same units. The examples below use SI (m, kN, kPa, kN/m³).
Request fields
This table is generated from the same schema that validates the request, so it cannot drift. Where a field appears once per variant row, it belongs to that variant only.
| Field | Type | Required | Constraints |
|---|---|---|---|
unitSystem | "si" | "us" | yes | Unit bundle for every dimensional input and output. "si": m, kN, kPa, kN/m³, kN·m, kN·m². "us": the kip–foot bundle — ft, kip, ksf, kip/ft³, kip·ft, kip·ft² (unit weights in kip/ft³, not pcf). Values are not converted, so every field must use the declared bundle. |
section | object | yes | Cross-section geometry. Steel kinds (solid-circular, pipe, rectangular) need a steel material; concrete kinds (round-concrete, rectangular-concrete) need a concrete material. |
section.kind = "solid-circular" | variant | yes | Solid circular section; pair it with a steel material. |
section.diameter | number | yes | > 0 — Outside diameter of the solid section (m for si, ft for us). |
section.kind = "pipe" | variant | yes | Circular hollow pipe section; pair it with a steel material. |
section.outerDiameter | number | yes | > 0 — Outside diameter of the pipe (m for si, ft for us). |
section.wallThickness | number | yes | > 0 — Pipe wall thickness (m for si, ft for us); less than half the outside diameter. |
section.kind = "rectangular" | variant | yes | Solid rectangular section; pair it with a steel material. |
section.width | number | yes | > 0 — Section width b perpendicular to the bending plane (m for si, ft for us). |
section.height | number | yes | > 0 — Section height h in the bending plane (m for si, ft for us). |
section.kind = "round-concrete" | variant | yes | Round reinforced or prestressed concrete section (drilled shaft or round pile), optionally composite with a steel casing and/or core; pair it with a concrete material. |
section.diameter | number | yes | > 0 — Concrete diameter (m for si, ft for us). With a casing it must equal the casing inside diameter (casing outerDiameter − 2 × wallThickness). |
section.cage | object | no | Circular ring of longitudinal bars or strands; omit for plain concrete. |
section.cage.count | number | yes | integer, 1 – 200 — Number of identical longitudinal bars or strands, equally spaced on the bar circle. |
section.cage.area | number | yes | > 0 — Cross-sectional area of one bar or strand (m² for si, ft² for us). |
section.cage.barDiameter | number | yes | > 0 — Physical outside diameter of one bar or strand (m for si, ft for us), used to check that bars lie inside the concrete, do not overlap, and clear any steel core. |
section.cage.barCircleRadius | number | yes | > 0 — Radius of the circle through the bar centres (m for si, ft for us), i.e. D/2 − cover − bar radius. |
section.cage.yieldStress | number | yes | > 0 — Yield stress fy of the reinforcement, or fpy for a strand (kPa for si, ksf for us). |
section.cage.elasticModulus | number | yes | > 0 — Elastic modulus Es of the reinforcement (kPa for si, ksf for us). |
section.cage.effectivePrestrain | number | no | ≥ 0 — Effective prestrain of prestressing strands after ALL losses, ε_pe = f_pe/Es (dimensionless tensile strain): f_pe is the strand stress in the finished member at zero external load, so the engine places the strand reference at the decompression strain and the strands carry exactly f_pe at zero thrust. Omit or use 0 for ordinary reinforcing bars. |
section.cage.hardeningRatio | number | no | 0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic). |
section.cage.tensionRuptureStrain | number | no | > 0 — Tensile strain magnitude at which the reinforcement ruptures (dimensionless); must exceed the yield strain fy/Es and effectivePrestrain. Omit when rupture is not modelled. |
section.cage.strandGrade | 250 | 270 | no | Prestressing-strand grade fpu in ksi (250 or 270). When set, strand stress follows the PCI stress–strain relation (PCI MNL-116, 2nd ed., Fig. 2.2.5.1, p. 2-8) instead of an elastic–perfectly-plastic branch at yieldStress; elasticModulus must then equal 28,500 ksi (196,500 MPa) within 1 % and hardeningRatio must be omitted. Omit for ordinary reinforcing bars. |
section.rebarConcreteDisplacement | "subtract" | "overlap" | no | Required when a cage is present. subtract: bars replace their area of concrete (physical net section). overlap: concrete is not reduced, reproducing OpenSees patch-plus-layer sections. |
section.casing | object | no | Permanent steel casing wrapping the concrete; its steel annulus lies outside the concrete diameter. |
section.casing.outerDiameter | number | yes | > 0 — Outside diameter of the steel tube (m for si, ft for us). A casing's inside diameter (outerDiameter − 2 × wallThickness) must equal the concrete diameter; a core must be smaller than the concrete diameter. |
section.casing.wallThickness | number | yes | > 0 — Radial wall thickness of the tube (m for si, ft for us); less than half the outside diameter. |
section.casing.yieldStress | number | yes | > 0 — Yield stress Fy of the tube steel (kPa for si, ksf for us). |
section.casing.elasticModulus | number | yes | > 0 — Elastic modulus Es of the tube steel (kPa for si, ksf for us). |
section.casing.hardeningRatio | number | no | 0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic). |
section.casing.tensionRuptureStrain | number | no | > 0 — Tensile strain magnitude at which the tube steel ruptures (dimensionless); must exceed the yield strain Fy/Es. Omit when rupture is not modelled. |
section.core | object | no | Concentric steel tube at the centre; the concrete inside its outside diameter is treated as void. It must clear the bar cage. |
section.core.outerDiameter | number | yes | > 0 — Outside diameter of the steel tube (m for si, ft for us). A casing's inside diameter (outerDiameter − 2 × wallThickness) must equal the concrete diameter; a core must be smaller than the concrete diameter. |
section.core.wallThickness | number | yes | > 0 — Radial wall thickness of the tube (m for si, ft for us); less than half the outside diameter. |
section.core.yieldStress | number | yes | > 0 — Yield stress Fy of the tube steel (kPa for si, ksf for us). |
section.core.elasticModulus | number | yes | > 0 — Elastic modulus Es of the tube steel (kPa for si, ksf for us). |
section.core.hardeningRatio | number | no | 0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic). |
section.core.tensionRuptureStrain | number | no | > 0 — Tensile strain magnitude at which the tube steel ruptures (dimensionless); must exceed the yield strain Fy/Es. Omit when rupture is not modelled. |
section.kind = "rectangular-concrete" | variant | yes | Rectangular or square reinforced or prestressed concrete section; pair it with a concrete material. |
section.width | number | yes | > 0 — Section width b perpendicular to the bending plane (m for si, ft for us). |
section.height | number | yes | > 0 — Section height h in the bending plane (m for si, ft for us). |
section.reinforcement | object | no | Symmetric perimeter bars or strands; omit for plain concrete. |
section.reinforcement.layout | "perimeter" | yes | Symmetric straight-sided perimeter layout (the only layout). |
section.reinforcement.barsPerFace | number | yes | integer, 2 – 100 — Identical bars on each of the top and bottom faces (the faces spanning the width, at the extremes of the bending direction), including the two corner bars. |
section.reinforcement.barsPerSide | number | yes | integer, 0 – 99 — Additional identical bars on each of the two side faces, excluding the corner bars already counted in barsPerFace. |
section.reinforcement.area | number | yes | > 0 — Cross-sectional area of one bar or strand (m² for si, ft² for us). |
section.reinforcement.barDiameter | number | yes | > 0 — Physical outside diameter of one bar or strand (m for si, ft for us), used for cover, containment and overlap checks. |
section.reinforcement.clearCover | number | yes | > 0 — Clear distance from the concrete face to the outside of the bar (m for si, ft for us); bar centres sit at clearCover + barDiameter/2 from each face. |
section.reinforcement.yieldStress | number | yes | > 0 — Yield stress fy shared by every bar, or fpy for strands (kPa for si, ksf for us). |
section.reinforcement.elasticModulus | number | yes | > 0 — Elastic modulus Es shared by every bar (kPa for si, ksf for us). |
section.reinforcement.effectivePrestrain | number | no | ≥ 0 — Effective prestrain of prestressing strands after losses, ε_pe = f_pe/Es (dimensionless tensile strain). Omit or use 0 for ordinary reinforcing bars. |
section.reinforcement.hardeningRatio | number | no | 0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic). |
section.reinforcement.tensionRuptureStrain | number | no | > 0 — Tensile strain magnitude at which the reinforcement ruptures (dimensionless); must exceed the yield strain fy/Es and effectivePrestrain. Omit when rupture is not modelled. |
section.reinforcement.strandGrade | 250 | 270 | no | Prestressing-strand grade fpu in ksi (250 or 270). When set, strand stress follows the PCI stress–strain relation (PCI MNL-116, 2nd ed., Fig. 2.2.5.1, p. 2-8) instead of an elastic–perfectly-plastic branch at yieldStress; elasticModulus must then equal 28,500 ksi (196,500 MPa) within 1 % and hardeningRatio must be omitted. Omit for ordinary reinforcing bars. |
section.rebarConcreteDisplacement | "subtract" | "overlap" | no | Required when reinforcement is present. subtract: bars replace their area of concrete (physical net section). overlap: concrete is not reduced, reproducing OpenSees patch-plus-layer sections. |
section.confinedCore | object | no | Optional rectangular confined core, bounded by coverDepth on all four faces, with its own concrete material. |
section.confinedCore.coverDepth | number | yes | > 0 — Distance from every concrete face to the confined-core boundary (m for si, ft for us); perimeter bar centres must lie in this cover or on the core boundary. |
section.confinedCore.material | object | yes | Concrete material for the confined core; the cover concrete outside the core uses the main concrete material. |
section.confinedCore.material.kind | "concrete" | yes | Concrete fiber material; pair it with a round-concrete or rectangular-concrete section. |
section.confinedCore.material.compressiveStrength | number | yes | > 0 — Concrete cylinder compressive strength f′c as a positive magnitude (kPa for si, ksf for us). |
section.confinedCore.material.elasticModulus | number | no | > 0 — Concrete elastic modulus Ec (kPa for si, ksf for us). Omitted for hognestad/todeschini: the ACI value 4700·√f′c (f′c in MPa), converted to the request's units. For concrete01 Ec is 2·f′c/peakStrain, and a supplied value must equal that. |
section.confinedCore.material.peakStrain | number | no | > 0 — Compressive strain ε0 at peak stress f′c (dimensionless). Omitted for hognestad/todeschini: 1.7·f′c/Ec. Required for concrete01. |
section.confinedCore.material.ultimateStrain | number | no | > 0 — Extreme-fiber compressive strain limit εcu (dimensionless), greater than peakStrain. Hognestad/todeschini: the ACI crushing strain at which the nominal moment Mn is read; omitted means 0.003. Concrete01 (required): the strain at which the stress has descended to residualStrength. |
section.confinedCore.material.descendingStrain | number | no | > 0 — Hognestad only: strain at which the linear post-peak branch reaches 0.85·f′c (dimensionless), greater than peakStrain; omitted means 0.0038. Not accepted by todeschini or concrete01. |
section.confinedCore.material.tensileStrength | number | no | ≥ 0 — Modulus of rupture fr, the tensile stress at which the concrete cracks, as a positive magnitude (kPa for si, ksf for us). Omitted for hognestad/todeschini: the ACI value 0.62·√f′c (MPa), converted to the request's units. Concrete01 carries no tension: omit it or use 0. |
section.confinedCore.material.model | "todeschini" | "hognestad" | "concrete01" | no | Compression stress–strain envelope. hognestad (default, LPILE-compatible): parabola to f′c, then a linear descending branch. todeschini: smooth Todeschini curve. concrete01: zero-tension Kent-Scott-Park envelope as in the OpenSees benchmark; requires peakStrain, ultimateStrain and residualStrength. |
section.confinedCore.material.residualStrength | number | no | ≥ 0 — Concrete01 only (required there): residual compressive stress reached at ultimateStrain, between 0 and compressiveStrength (kPa for si, ksf for us). |
material | object | yes | Section material: a concrete material (kind "concrete") for concrete sections, or a steel material for steel sections. |
material.kind = "concrete" | variant | yes | Concrete fiber material; pair it with a round-concrete or rectangular-concrete section. |
material.compressiveStrength | number | yes | > 0 — Concrete cylinder compressive strength f′c as a positive magnitude (kPa for si, ksf for us). |
material.elasticModulus | number | no | > 0 — Concrete elastic modulus Ec (kPa for si, ksf for us). Omitted for hognestad/todeschini: the ACI value 4700·√f′c (f′c in MPa), converted to the request's units. For concrete01 Ec is 2·f′c/peakStrain, and a supplied value must equal that. |
material.peakStrain | number | no | > 0 — Compressive strain ε0 at peak stress f′c (dimensionless). Omitted for hognestad/todeschini: 1.7·f′c/Ec. Required for concrete01. |
material.ultimateStrain | number | no | > 0 — Extreme-fiber compressive strain limit εcu (dimensionless), greater than peakStrain. Hognestad/todeschini: the ACI crushing strain at which the nominal moment Mn is read; omitted means 0.003. Concrete01 (required): the strain at which the stress has descended to residualStrength. |
material.descendingStrain | number | no | > 0 — Hognestad only: strain at which the linear post-peak branch reaches 0.85·f′c (dimensionless), greater than peakStrain; omitted means 0.0038. Not accepted by todeschini or concrete01. |
material.tensileStrength | number | no | ≥ 0 — Modulus of rupture fr, the tensile stress at which the concrete cracks, as a positive magnitude (kPa for si, ksf for us). Omitted for hognestad/todeschini: the ACI value 0.62·√f′c (MPa), converted to the request's units. Concrete01 carries no tension: omit it or use 0. |
material.model | "todeschini" | "hognestad" | "concrete01" | no | Compression stress–strain envelope. hognestad (default, LPILE-compatible): parabola to f′c, then a linear descending branch. todeschini: smooth Todeschini curve. concrete01: zero-tension Kent-Scott-Park envelope as in the OpenSees benchmark; requires peakStrain, ultimateStrain and residualStrength. |
material.residualStrength | number | no | ≥ 0 — Concrete01 only (required there): residual compressive stress reached at ultimateStrain, between 0 and compressiveStrength (kPa for si, ksf for us). |
material.kind = "steel" | variant | no | Elastic–(bilinear-)plastic steel material; may be omitted. Pair it with a solid-circular, pipe or rectangular section. |
material.elasticModulus | number | yes | > 0 — Young's modulus E of the section material (kPa for si, ksf for us). |
material.yieldStress | number | yes | > 0 — Yield stress Fy of the section material (kPa for si, ksf for us). |
material.hardeningRatio | number | no | 0 – 1 — Post-yield hardening ratio E_tangent/E (0–1); omitted means 0 (elastic–perfectly-plastic). |
material.ultimateStrain | number | no | > 0 — Symmetric extreme-fiber strain magnitude that ends the moment–curvature response (dimensionless); must exceed the yield strain Fy/E. Hardening steel (hardeningRatio > 0) needs this or, in a moment-curvature request, maxCurvature. |
axialLoad | number | no | Axial force held constant through the curvature sweep (kN for si, kip for us); omitted means 0. Steel sections: tension-positive (compression negative). Concrete sections: compression-positive, matching LPILE. |
points | number | no | integer, 10 – 200 — Number of curvature points in the reported curve; omitted means 60 for steel and 200 for concrete sections. |
fibers | number | no | integer, 100 – 5000 — Number of fiber strips through the section depth; omitted means 400 for steel and 600 for concrete sections. |
maxCurvature | number | no | > 0 — Explicit end curvature of the sweep (1/m for si, 1/ft for us). Omitted: a steel section ends where the extreme fiber reaches material.ultimateStrain, or at 25× the first-yield curvature when none is given; a concrete section ends where the extreme compression strain reaches the concrete ultimateStrain. |
Response fields
| Field | Type | Description |
|---|---|---|
curve[] | object[] | Monotonic-curvature section response over the declared sweep. |
curve[].curvature | number | Curvature in the declared inverse-length unit. |
curve[].moment | number | Moment from axial-equilibrated fiber stresses. |
curve[].ei | number | Secant rigidity M/φ at that point. |
stiffnessCurve[] | object[] | Concrete engineering stiffness table with strictly increasing positive moment and curvature. Reuse this table as lateral eiCurve; the separate raw plotting curve can contain softening. |
elasticEI | number | Initial-tangent transformed-section rigidity. |
yieldMoment | number | First reinforcing/section steel yield moment; zero if no steel yields. |
plasticMoment | number | Perfect-plastic Mp, or the peak over an explicitly bounded hardening/concrete sweep. For concrete the peak includes the pre-cracking branch, so a plain or under-reinforced section reports its first-cracking moment. |
nominalMoment | number? | Concrete moment at the declared cover-compression strain. |
nominalCurvature | number? | Curvature corresponding to nominalMoment. |
crackingMoment | number? | Concrete cracking moment using the declared/default modulus of rupture. |
warnings | string[]? | Plain-language engineering warnings, e.g. a concrete section below the minimum flexural reinforcement intent (Mn < 1.2·Mcr/0.9, ACI 318-19 §9.6.2.1). |
governingLimitState | string | Named endpoint: plastic asymptote, declared strain/curvature, concrete compression, or steel rupture. |
limitCurvature | number | Curvature of the governing endpoint; rupture curves end immediately on its safe side. |
method | object | Stable method ID, designation, and edition. |
convergence | object | Fiber count, requested/completed points, and axial-equilibrium residual. |
Code examples
A complete, runnable request. Replace YOUR_API_KEY (or set PILECALC_API_KEY in your environment).
curl https://api.pilecalc.com/v1/moment-curvature \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"unitSystem": "si",
"section": {
"kind": "rectangular-concrete",
"width": 0.381,
"height": 0.6096,
"reinforcement": {
"layout": "perimeter",
"barsPerFace": 3,
"barsPerSide": 1,
"area": 0.000387096,
"barDiameter": 0.022200584109631046,
"clearCover": 0.026999707945184477,
"yieldStress": 413685.43759008,
"elasticModulus": 206842718.79504,
"hardeningRatio": 0.01
},
"rebarConcreteDisplacement": "overlap",
"confinedCore": {
"coverDepth": 0.0381,
"material": {
"kind": "concrete",
"model": "concrete01",
"compressiveStrength": 41368.543759008,
"peakStrain": 0.004,
"ultimateStrain": 0.014,
"residualStrength": 34473.78646584,
"tensileStrength": 0
}
}
},
"material": {
"kind": "concrete",
"model": "concrete01",
"compressiveStrength": 34473.78646584,
"peakStrain": 0.002,
"ultimateStrain": 0.006,
"residualStrength": 0,
"tensileStrength": 0
},
"axialLoad": 800.67989074689,
"fibers": 2400,
"points": 30,
"maxCurvature": 0.07499062617172855
}'The GET variant returns yieldMoment,plasticMoment,governingLimitState,method.id as a plain-text CSV line — made for Excel's WEBSERVICE() and Sheets' IMPORTDATA() (see Use PileCalc in Excel). Omit fields to get the full JSON response.
Required conventions
- A round cage declares bar area, physical bar diameter, bar-circle radius, and material limits. A rectangular section declares a straight perimeter; a circular cage is rejected for that geometry.
- Reinforced sections must choose
rebarConcreteDisplacement: "subtract"(physical net section) or"overlap"(OpenSees patch-plus-layer reproduction). The API never guesses. concrete01requires peak strain, ultimate strain, residual stress, and zero tension. A rectangularconfinedCorehas its own Concrete01 envelope and an explicit core-boundary cover.- Reinforcing steel may declare hardening, effective prestress, and tension-rupture strain. Prestressing strands may set
strandGrade(250 or 270) to use the PCI strand stress–strain curve (PCI MNL-116, Fig. 2.2.5.1);elasticModulusmust then be 28,500 ksi within 1 % andhardeningRatiomust be omitted. Hardening structural steel requires an ultimate strain or requestmaxCurvaturebecause it has no finite plastic asymptote. - Axial-load signs are method-specific and explicit: homogeneous steel is tension positive; concrete is compression positive to preserve the declared LPILE-compatible convention.
Applicability
A section model is not a complete member limit-state check
A plasticMoment is a true fully-plastic capacity only when the steel law is elastic-perfectly-plastic. For hardening or concrete response, read it together withgoverningLimitState and limitCurvature.