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

POST
https://api.pilecalc.com/v1/moment-curvature
GET
/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.

FieldTypeRequiredConstraints
unitSystem"si" | "us"yesUnit 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.
sectionobjectyesCross-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"variantyesSolid circular section; pair it with a steel material.
section.diameternumberyes> 0 — Outside diameter of the solid section (m for si, ft for us).
section.kind = "pipe"variantyesCircular hollow pipe section; pair it with a steel material.
section.outerDiameternumberyes> 0 — Outside diameter of the pipe (m for si, ft for us).
section.wallThicknessnumberyes> 0 — Pipe wall thickness (m for si, ft for us); less than half the outside diameter.
section.kind = "rectangular"variantyesSolid rectangular section; pair it with a steel material.
section.widthnumberyes> 0 — Section width b perpendicular to the bending plane (m for si, ft for us).
section.heightnumberyes> 0 — Section height h in the bending plane (m for si, ft for us).
section.kind = "round-concrete"variantyesRound 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.diameternumberyes> 0 — Concrete diameter (m for si, ft for us). With a casing it must equal the casing inside diameter (casing outerDiameter − 2 × wallThickness).
section.cageobjectnoCircular ring of longitudinal bars or strands; omit for plain concrete.
section.cage.countnumberyesinteger, 1 – 200 — Number of identical longitudinal bars or strands, equally spaced on the bar circle.
section.cage.areanumberyes> 0 — Cross-sectional area of one bar or strand (m² for si, ft² for us).
section.cage.barDiameternumberyes> 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.barCircleRadiusnumberyes> 0 — Radius of the circle through the bar centres (m for si, ft for us), i.e. D/2 − cover − bar radius.
section.cage.yieldStressnumberyes> 0 — Yield stress fy of the reinforcement, or fpy for a strand (kPa for si, ksf for us).
section.cage.elasticModulusnumberyes> 0 — Elastic modulus Es of the reinforcement (kPa for si, ksf for us).
section.cage.effectivePrestrainnumberno≥ 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.hardeningRationumberno0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic).
section.cage.tensionRuptureStrainnumberno> 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.strandGrade250 | 270noPrestressing-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"noRequired 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.casingobjectnoPermanent steel casing wrapping the concrete; its steel annulus lies outside the concrete diameter.
section.casing.outerDiameternumberyes> 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.wallThicknessnumberyes> 0 — Radial wall thickness of the tube (m for si, ft for us); less than half the outside diameter.
section.casing.yieldStressnumberyes> 0 — Yield stress Fy of the tube steel (kPa for si, ksf for us).
section.casing.elasticModulusnumberyes> 0 — Elastic modulus Es of the tube steel (kPa for si, ksf for us).
section.casing.hardeningRationumberno0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic).
section.casing.tensionRuptureStrainnumberno> 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.coreobjectnoConcentric steel tube at the centre; the concrete inside its outside diameter is treated as void. It must clear the bar cage.
section.core.outerDiameternumberyes> 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.wallThicknessnumberyes> 0 — Radial wall thickness of the tube (m for si, ft for us); less than half the outside diameter.
section.core.yieldStressnumberyes> 0 — Yield stress Fy of the tube steel (kPa for si, ksf for us).
section.core.elasticModulusnumberyes> 0 — Elastic modulus Es of the tube steel (kPa for si, ksf for us).
section.core.hardeningRationumberno0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic).
section.core.tensionRuptureStrainnumberno> 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"variantyesRectangular or square reinforced or prestressed concrete section; pair it with a concrete material.
section.widthnumberyes> 0 — Section width b perpendicular to the bending plane (m for si, ft for us).
section.heightnumberyes> 0 — Section height h in the bending plane (m for si, ft for us).
section.reinforcementobjectnoSymmetric perimeter bars or strands; omit for plain concrete.
section.reinforcement.layout"perimeter"yesSymmetric straight-sided perimeter layout (the only layout).
section.reinforcement.barsPerFacenumberyesinteger, 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.barsPerSidenumberyesinteger, 0 – 99 — Additional identical bars on each of the two side faces, excluding the corner bars already counted in barsPerFace.
section.reinforcement.areanumberyes> 0 — Cross-sectional area of one bar or strand (m² for si, ft² for us).
section.reinforcement.barDiameternumberyes> 0 — Physical outside diameter of one bar or strand (m for si, ft for us), used for cover, containment and overlap checks.
section.reinforcement.clearCovernumberyes> 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.yieldStressnumberyes> 0 — Yield stress fy shared by every bar, or fpy for strands (kPa for si, ksf for us).
section.reinforcement.elasticModulusnumberyes> 0 — Elastic modulus Es shared by every bar (kPa for si, ksf for us).
section.reinforcement.effectivePrestrainnumberno≥ 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.hardeningRationumberno0 – 1 — Post-yield hardening ratio E_tangent/Es (0–1); omitted means 0 (elastic–perfectly-plastic).
section.reinforcement.tensionRuptureStrainnumberno> 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.strandGrade250 | 270noPrestressing-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"noRequired 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.confinedCoreobjectnoOptional rectangular confined core, bounded by coverDepth on all four faces, with its own concrete material.
section.confinedCore.coverDepthnumberyes> 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.materialobjectyesConcrete material for the confined core; the cover concrete outside the core uses the main concrete material.
section.confinedCore.material.kind"concrete"yesConcrete fiber material; pair it with a round-concrete or rectangular-concrete section.
section.confinedCore.material.compressiveStrengthnumberyes> 0 — Concrete cylinder compressive strength f′c as a positive magnitude (kPa for si, ksf for us).
section.confinedCore.material.elasticModulusnumberno> 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.peakStrainnumberno> 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.ultimateStrainnumberno> 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.descendingStrainnumberno> 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.tensileStrengthnumberno≥ 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"noCompression 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.residualStrengthnumberno≥ 0 — Concrete01 only (required there): residual compressive stress reached at ultimateStrain, between 0 and compressiveStrength (kPa for si, ksf for us).
materialobjectyesSection material: a concrete material (kind "concrete") for concrete sections, or a steel material for steel sections.
material.kind = "concrete"variantyesConcrete fiber material; pair it with a round-concrete or rectangular-concrete section.
material.compressiveStrengthnumberyes> 0 — Concrete cylinder compressive strength f′c as a positive magnitude (kPa for si, ksf for us).
material.elasticModulusnumberno> 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.peakStrainnumberno> 0 — Compressive strain ε0 at peak stress f′c (dimensionless). Omitted for hognestad/todeschini: 1.7·f′c/Ec. Required for concrete01.
material.ultimateStrainnumberno> 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.descendingStrainnumberno> 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.tensileStrengthnumberno≥ 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"noCompression 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.residualStrengthnumberno≥ 0 — Concrete01 only (required there): residual compressive stress reached at ultimateStrain, between 0 and compressiveStrength (kPa for si, ksf for us).
material.kind = "steel"variantnoElastic–(bilinear-)plastic steel material; may be omitted. Pair it with a solid-circular, pipe or rectangular section.
material.elasticModulusnumberyes> 0 — Young's modulus E of the section material (kPa for si, ksf for us).
material.yieldStressnumberyes> 0 — Yield stress Fy of the section material (kPa for si, ksf for us).
material.hardeningRationumberno0 – 1 — Post-yield hardening ratio E_tangent/E (0–1); omitted means 0 (elastic–perfectly-plastic).
material.ultimateStrainnumberno> 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.
axialLoadnumbernoAxial 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.
pointsnumbernointeger, 10 – 200 — Number of curvature points in the reported curve; omitted means 60 for steel and 200 for concrete sections.
fibersnumbernointeger, 100 – 5000 — Number of fiber strips through the section depth; omitted means 400 for steel and 600 for concrete sections.
maxCurvaturenumberno> 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

FieldTypeDescription
curve[]object[]Monotonic-curvature section response over the declared sweep.
curve[].curvaturenumberCurvature in the declared inverse-length unit.
curve[].momentnumberMoment from axial-equilibrated fiber stresses.
curve[].einumberSecant 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.
elasticEInumberInitial-tangent transformed-section rigidity.
yieldMomentnumberFirst reinforcing/section steel yield moment; zero if no steel yields.
plasticMomentnumberPerfect-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.
nominalMomentnumber?Concrete moment at the declared cover-compression strain.
nominalCurvaturenumber?Curvature corresponding to nominalMoment.
crackingMomentnumber?Concrete cracking moment using the declared/default modulus of rupture.
warningsstring[]?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).
governingLimitStatestringNamed endpoint: plastic asymptote, declared strain/curvature, concrete compression, or steel rupture.
limitCurvaturenumberCurvature of the governing endpoint; rupture curves end immediately on its safe side.
methodobjectStable method ID, designation, and edition.
convergenceobjectFiber 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).

POST /v1/moment-curvature
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.
  • concrete01 requires peak strain, ultimate strain, residual stress, and zero tension. A rectangular confinedCore has 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); elasticModulus must then be 28,500 ksi within 1 % and hardeningRatio must be omitted. 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

The endpoint is valid only for the declared monotonic uniaxial fiber model. It does not include bond slip, shear or torsion interaction, biaxial bending, cyclic degradation, automatic confinement generation, local shell buckling, or code resistance factors. Unsupported geometry/material combinations fail validation instead of being silently reinterpreted.

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.