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"yes
sectionobjectyes
section.kind = "solid-circular"variantyes
section.diameternumberyes> 0
section.kind = "pipe"variantyes
section.outerDiameternumberyes> 0
section.wallThicknessnumberyes> 0
section.kind = "rectangular"variantyes
section.widthnumberyes> 0
section.heightnumberyes> 0
section.kind = "round-concrete"variantyes
section.diameternumberyes> 0
section.cageobjectno
section.cage.countnumberyesinteger, 1 – 200
section.cage.areanumberyes> 0
section.cage.barDiameternumberyes> 0
section.cage.barCircleRadiusnumberyes> 0
section.cage.yieldStressnumberyes> 0
section.cage.elasticModulusnumberyes> 0
section.cage.effectivePrestrainnumberno≥ 0
section.cage.hardeningRationumberno0 – 1
section.cage.tensionRuptureStrainnumberno> 0
section.rebarConcreteDisplacement"subtract" | "overlap"no
section.casingobjectno
section.casing.outerDiameternumberyes> 0
section.casing.wallThicknessnumberyes> 0
section.casing.yieldStressnumberyes> 0
section.casing.elasticModulusnumberyes> 0
section.casing.hardeningRationumberno0 – 1
section.casing.tensionRuptureStrainnumberno> 0
section.coreobjectno
section.core.outerDiameternumberyes> 0
section.core.wallThicknessnumberyes> 0
section.core.yieldStressnumberyes> 0
section.core.elasticModulusnumberyes> 0
section.core.hardeningRationumberno0 – 1
section.core.tensionRuptureStrainnumberno> 0
section.kind = "rectangular-concrete"variantyes
section.widthnumberyes> 0
section.heightnumberyes> 0
section.reinforcementobjectno
section.reinforcement.layout"perimeter"yes
section.reinforcement.barsPerFacenumberyesinteger, 2 – 100
section.reinforcement.barsPerSidenumberyesinteger, 0 – 99
section.reinforcement.areanumberyes> 0
section.reinforcement.barDiameternumberyes> 0
section.reinforcement.clearCovernumberyes> 0
section.reinforcement.yieldStressnumberyes> 0
section.reinforcement.elasticModulusnumberyes> 0
section.reinforcement.effectivePrestrainnumberno≥ 0
section.reinforcement.hardeningRationumberno0 – 1
section.reinforcement.tensionRuptureStrainnumberno> 0
section.rebarConcreteDisplacement"subtract" | "overlap"no
section.confinedCoreobjectno
section.confinedCore.coverDepthnumberyes> 0
section.confinedCore.materialobjectyes
section.confinedCore.material.kind"concrete"yes
section.confinedCore.material.compressiveStrengthnumberyes> 0
section.confinedCore.material.elasticModulusnumberno> 0
section.confinedCore.material.peakStrainnumberno> 0
section.confinedCore.material.ultimateStrainnumberno> 0
section.confinedCore.material.descendingStrainnumberno> 0
section.confinedCore.material.tensileStrengthnumberno≥ 0
section.confinedCore.material.model"todeschini" | "hognestad" | "concrete01"no
section.confinedCore.material.residualStrengthnumberno≥ 0
materialobjectyes
material.kind = "concrete"variantyes
material.compressiveStrengthnumberyes> 0
material.elasticModulusnumberno> 0
material.peakStrainnumberno> 0
material.ultimateStrainnumberno> 0
material.descendingStrainnumberno> 0
material.tensileStrengthnumberno≥ 0
material.model"todeschini" | "hognestad" | "concrete01"no
material.residualStrengthnumberno≥ 0
material.kind = "steel"variantno
material.elasticModulusnumberyes> 0
material.yieldStressnumberyes> 0
material.hardeningRationumberno0 – 1
material.ultimateStrainnumberno> 0
axialLoadnumberno
pointsnumbernointeger, 10 – 200
fibersnumbernointeger, 100 – 5000
maxCurvaturenumberno> 0

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.
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.
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.
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. 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.