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 | |
section | object | yes | |
section.kind = "solid-circular" | variant | yes | |
section.diameter | number | yes | > 0 |
section.kind = "pipe" | variant | yes | |
section.outerDiameter | number | yes | > 0 |
section.wallThickness | number | yes | > 0 |
section.kind = "rectangular" | variant | yes | |
section.width | number | yes | > 0 |
section.height | number | yes | > 0 |
section.kind = "round-concrete" | variant | yes | |
section.diameter | number | yes | > 0 |
section.cage | object | no | |
section.cage.count | number | yes | integer, 1 – 200 |
section.cage.area | number | yes | > 0 |
section.cage.barDiameter | number | yes | > 0 |
section.cage.barCircleRadius | number | yes | > 0 |
section.cage.yieldStress | number | yes | > 0 |
section.cage.elasticModulus | number | yes | > 0 |
section.cage.effectivePrestrain | number | no | ≥ 0 |
section.cage.hardeningRatio | number | no | 0 – 1 |
section.cage.tensionRuptureStrain | number | no | > 0 |
section.rebarConcreteDisplacement | "subtract" | "overlap" | no | |
section.casing | object | no | |
section.casing.outerDiameter | number | yes | > 0 |
section.casing.wallThickness | number | yes | > 0 |
section.casing.yieldStress | number | yes | > 0 |
section.casing.elasticModulus | number | yes | > 0 |
section.casing.hardeningRatio | number | no | 0 – 1 |
section.casing.tensionRuptureStrain | number | no | > 0 |
section.core | object | no | |
section.core.outerDiameter | number | yes | > 0 |
section.core.wallThickness | number | yes | > 0 |
section.core.yieldStress | number | yes | > 0 |
section.core.elasticModulus | number | yes | > 0 |
section.core.hardeningRatio | number | no | 0 – 1 |
section.core.tensionRuptureStrain | number | no | > 0 |
section.kind = "rectangular-concrete" | variant | yes | |
section.width | number | yes | > 0 |
section.height | number | yes | > 0 |
section.reinforcement | object | no | |
section.reinforcement.layout | "perimeter" | yes | |
section.reinforcement.barsPerFace | number | yes | integer, 2 – 100 |
section.reinforcement.barsPerSide | number | yes | integer, 0 – 99 |
section.reinforcement.area | number | yes | > 0 |
section.reinforcement.barDiameter | number | yes | > 0 |
section.reinforcement.clearCover | number | yes | > 0 |
section.reinforcement.yieldStress | number | yes | > 0 |
section.reinforcement.elasticModulus | number | yes | > 0 |
section.reinforcement.effectivePrestrain | number | no | ≥ 0 |
section.reinforcement.hardeningRatio | number | no | 0 – 1 |
section.reinforcement.tensionRuptureStrain | number | no | > 0 |
section.rebarConcreteDisplacement | "subtract" | "overlap" | no | |
section.confinedCore | object | no | |
section.confinedCore.coverDepth | number | yes | > 0 |
section.confinedCore.material | object | yes | |
section.confinedCore.material.kind | "concrete" | yes | |
section.confinedCore.material.compressiveStrength | number | yes | > 0 |
section.confinedCore.material.elasticModulus | number | no | > 0 |
section.confinedCore.material.peakStrain | number | no | > 0 |
section.confinedCore.material.ultimateStrain | number | no | > 0 |
section.confinedCore.material.descendingStrain | number | no | > 0 |
section.confinedCore.material.tensileStrength | number | no | ≥ 0 |
section.confinedCore.material.model | "todeschini" | "hognestad" | "concrete01" | no | |
section.confinedCore.material.residualStrength | number | no | ≥ 0 |
material | object | yes | |
material.kind = "concrete" | variant | yes | |
material.compressiveStrength | number | yes | > 0 |
material.elasticModulus | number | no | > 0 |
material.peakStrain | number | no | > 0 |
material.ultimateStrain | number | no | > 0 |
material.descendingStrain | number | no | > 0 |
material.tensileStrength | number | no | ≥ 0 |
material.model | "todeschini" | "hognestad" | "concrete01" | no | |
material.residualStrength | number | no | ≥ 0 |
material.kind = "steel" | variant | no | |
material.elasticModulus | number | yes | > 0 |
material.yieldStress | number | yes | > 0 |
material.hardeningRatio | number | no | 0 – 1 |
material.ultimateStrain | number | no | > 0 |
axialLoad | number | no | |
points | number | no | integer, 10 – 200 |
fibers | number | no | integer, 100 – 5000 |
maxCurvature | number | no | > 0 |
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. |
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. |
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. |
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. Hardening structural steel requires an ultimate strain or request
maxCurvaturebecause 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.