API: slope stabilization

POST/GET /v1/slope — strict pile-row candidate-surface demand/capacity analysis with runnable examples.


POST /v1/slope and GET /v1/slope run the strict pile-row demand/capacity method. The request requires the named applied-displacement and NAVFAC/Reese– O'Neill component methods, a complete lateral and axial pile/soil model, a declared wide-spacing row, explicit numerical controls, and an ordered demand for every candidate surface. See Slope stabilization for the scientific boundary.

Endpoint

POST
https://api.pilecalc.com/v1/slope
GET
/v1/slope?key=…&req=…&fields=…(for header-less callers)

method, axial.method, unitSystem, water unit weight where applicable, the movement cap, and all solver controls are required. Candidate surfaces use { id, slidingDepth, distributedDemand, slipAngleDeg? }. The optional local slipAngleDeg overrides the shared request angle for both displacement resolution and tangent force projection. Each angle must be between 0° and 90° (exclusive). Demand is force per unit row width in the declared SI or US bundle; total demand is calculated with row.tributaryWidth.

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.
method"applied-displacement-independent-wide-spacing"yesSlope pile-row method: applied soil displacement with independent, widely spaced piles.
lateralobjectyesLateral (p-y) model of one pile. Ground surface must be at the pile head (no buried head) and cyclic degradation is not supported; the soil profile must cover the full pile length.
lateral.pileobjectyes
lateral.pile.kind = "uniform"variantnoA prismatic pile with one constant diameter and EI (the default when kind is omitted).
lateral.pile.lengthnumberyes> 0 — Total pile length from the head to the tip (m for si, ft for us), including any free length above grade.
lateral.pile.diameternumberyes> 0 — Pile width or diameter b (m for si, ft for us).
lateral.pile.einumberyes> 0 — Flexural rigidity EI of the pile (kN·m² for si, kip·ft² for us).
lateral.pile.groundSurfaceDepthnumberno≥ 0 — Depth of the ground surface below the pile head, i.e. the free (unsupported) pile length above grade (m for si, ft for us). Omit or use 0 when the head is at the ground surface.
lateral.pile.kind = "sectioned"variantyesA pile built from a stack of prismatic and/or tapered sections that tile the pile from head to tip.
lateral.pile.sectionsobject | object[]yesmin 1 item — Pile sections ordered from the head down, contiguous with no gaps or overlaps. Each is prismatic (diameter + ei) or tapered (shape + diameterTop/diameterBottom + elasticModulus).
lateral.pile.groundSurfaceDepthnumberno≥ 0 — Depth of the ground surface below the pile head, i.e. the free (unsupported) pile length above grade (m for si, ft for us). Omit or use 0 when the head is at the ground surface.
lateral.soilobjectyes
lateral.soil.layers[]object[]yesmin 1 item — Soil layers from the ground surface down, contiguous with no gaps or overlaps, each tagged with its p-y `model`. The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].model = "soft-clay"variantyesMatlock (1970) soft clay, for soft to medium clay below the water table.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].cnumberyes> 0 — Undrained shear strength (cohesion) c at the layer top (kPa for si, ksf for us).
lateral.soil.layers[].cBottomnumberno> 0 — Cohesion c at the layer bottom (kPa for si, ksf for us); c varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].e50numberyes> 0 — Strain at 50% of the maximum principal stress difference in an undrained triaxial test, ε₅₀ (dimensionless), at the layer top.
lateral.soil.layers[].e50Bottomnumberno> 0 — ε₅₀ at the layer bottom (dimensionless); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].jnumberno> 0 — Matlock empirical depth factor J (dimensionless). Omitted defaults to 0.5; 0.25 is sometimes used for stiffer clays.
lateral.soil.layers[].model = "stiff-clay-above-water"variantyesWelch & Reese (1972) stiff clay with no free water. Supplying k switches to the modified (Reese & Van Impe) form.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].cnumberyes> 0 — Undrained shear strength (cohesion) c at the layer top (kPa for si, ksf for us).
lateral.soil.layers[].cBottomnumberno> 0 — Cohesion c at the layer bottom (kPa for si, ksf for us); c varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].e50numberyes> 0 — Strain at 50% of the maximum principal stress difference in an undrained triaxial test, ε₅₀ (dimensionless), at the layer top.
lateral.soil.layers[].e50Bottomnumberno> 0 — ε₅₀ at the layer bottom (dimensionless); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].jnumberno> 0 — Matlock empirical depth factor J (dimensionless). Omitted defaults to 0.5; 0.25 is sometimes used for stiffer clays.
lateral.soil.layers[].knumberno> 0 — Optional initial subgrade modulus k (kN/m³ for si, kip/ft³ for us). When present, the modified stiff-clay curve p = min(k·z·y, Welch–Reese backbone) is used; omit for the original Welch & Reese curve.
lateral.soil.layers[].kBottomnumberno> 0 — Modified-model k at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from k. Omit for a constant layer.
lateral.soil.layers[].model = "stiff-clay-below-water"variantyesReese, Cox & Koop stiff clay below the water table.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].cnumberyes> 0 — Undrained shear strength c (kPa for si, ksf for us). Supported only as a constant strength equal to the surface-to-depth average: cBottom must equal c and, with direct layering, overlying layers must carry the same c.
lateral.soil.layers[].cBottomnumberno> 0 — Cohesion at the layer bottom (kPa for si, ksf for us). Varying strength is rejected for this model, so omit it or set it equal to c.
lateral.soil.layers[].e50numberyes> 0 — Strain at 50% of the maximum principal stress difference in an undrained triaxial test, ε₅₀ (dimensionless), at the layer top.
lateral.soil.layers[].e50Bottomnumberno> 0 — ε₅₀ at the layer bottom (dimensionless); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k for the active loading state (kN/m³ for si, kip/ft³ for us): the static value for static loading, the cyclic value for cyclic loading. It is not reduced automatically.
lateral.soil.layers[].kSource"gec9-table-a1"noUI source-default selection provenance. k remains the explicit active-loading modulus used by the engine; the UI restores source selection only when k matches the default for the original loading and unit system.
lateral.soil.layers[].kBottomnumberno> 0 — Subgrade modulus k at the layer bottom for the active loading state (kN/m³ for si, kip/ft³ for us); varies linearly from k. Omit for a constant layer.
lateral.soil.layers[].model = "sand-reese"variantyesReese, Cox & Koop (1974) sand (wedge and flow-around model).
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].phinumberyes0 – 60 — Drained friction angle φ at the layer top, in degrees (0–60).
lateral.soil.layers[].phiBottomnumberno0 – 60 — Friction angle φ at the layer bottom, in degrees (0–60); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k at the layer top (force/length³: kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].kBottomnumberno> 0 — Subgrade modulus k at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].model = "sand-api"variantyesAPI RP-2A / O'Neill & Murchison (1983) sand (hyperbolic-tangent curve).
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].phinumberyes0 – 60 — Drained friction angle φ at the layer top, in degrees (0–60).
lateral.soil.layers[].phiBottomnumberno0 – 60 — Friction angle φ at the layer bottom, in degrees (0–60); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k at the layer top (force/length³: kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].kBottomnumberno> 0 — Subgrade modulus k at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].model = "weak-rock"variantyesReese (1997) weak rock. Static loading only.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].qunumberyes> 0 — Uniaxial (unconfined) compressive strength of the intact rock qu at the layer top (kPa for si, ksf for us).
lateral.soil.layers[].quBottomnumberno> 0 — qu at the layer bottom (kPa for si, ksf for us); varies linearly from qu. Omit for a constant layer.
lateral.soil.layers[].eirnumberyes> 0 — Initial rock-mass modulus Eir at the layer top (force/length²: kPa for si, ksf for us).
lateral.soil.layers[].eirBottomnumberno> 0 — Eir at the layer bottom (kPa for si, ksf for us); varies linearly from eir. Omit for a constant layer.
lateral.soil.layers[].rqdnumberyes0 – 100 — Rock Quality Designation at the layer top, as a percentage (0–100).
lateral.soil.layers[].rqdBottomnumberno0 – 100 — RQD at the layer bottom, as a percentage (0–100); varies linearly from rqd. Omit for a constant layer.
lateral.soil.layers[].krmnumberno> 0 — Rock strain factor k_rm (dimensionless), typically 0.0005 to 0.00005. Omitted defaults to 0.0005.
lateral.soil.layers[].model = "elastic"variantyesLinear-elastic (Winkler) subgrade: p = E_py·y, independent of deflection.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].esTopnumberyes≥ 0 — Soil-reaction modulus E_py at the layer top (force/length²: kN/m² for si, kip/ft² for us).
lateral.soil.layers[].esBottomnumberno≥ 0 — E_py at the layer bottom (kN/m² for si, kip/ft² for us); varies linearly from esTop. Omitted means constant E_py = esTop.
lateral.soil.layers[].model = "user"variantyesUser-defined resistance: a constant linear modulus es, or measured p-y curves at given depths.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].esnumberno≥ 0 — Constant soil modulus E_py for a linear Winkler spring p = es·y (force/length²: kN/m² for si, kip/ft² for us). When supplied it is used instead of curves.
lateral.soil.layers[].curves[]object[]noDepth-tagged p-y curves. Resistance is interpolated linearly along each curve and between curves in depth; above the first or below the last curve depth, the nearest curve applies.
lateral.soil.layers[].curves[].depthnumberyes≥ 0 — Depth of this p-y curve below the ground surface (m for si, ft for us); must lie within the layer and increase strictly from curve to curve.
lateral.soil.layers[].curves[].points[]object[]yesmin 2 items — The curve's (y, p) points, starting at (0, 0).
lateral.soil.layers[].curves[].points[].ynumberyes≥ 0 — Lateral deflection y (m for si, ft for us). The first point is 0; values must be strictly increasing.
lateral.soil.layers[].curves[].points[].pnumberyes≥ 0 — Soil resistance p per unit pile length (kN/m for si, kip/ft for us) at deflection y. The first point is 0; values must be nondecreasing, and p is held constant beyond the last point.
lateral.soil.layers[].model = "liquefied-sand"variantyesRollins et al. (2005a) fully liquefied sand; resistance depends on depth only, with no strength inputs. Requires a pile diameter of at least 0.3 m within the layer.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].units"SI" | "US"yesWorking-unit tag for the dimensional Rollins constants. Must match the request's unitSystem: "SI" for si, "US" for us.
lateral.soil.layers[].model = "silt-cphi"variantyesReese et al. (1974) silt or cemented c-φ soil with both cohesion and friction.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].cnumberyes> 0 — Cohesion c at the layer top (kPa for si, ksf for us).
lateral.soil.layers[].cBottomnumberno> 0 — Cohesion c at the layer bottom (kPa for si, ksf for us); c varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].phinumberyes0 – 60 — Drained friction angle φ at the layer top, in degrees (0–60).
lateral.soil.layers[].phiBottomnumberno0 – 60 — Friction angle φ at the layer bottom, in degrees (0–60); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k at the layer top (force/length³: kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].kBottomnumberno> 0 — Subgrade modulus k at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from the top value. Omit for a constant layer.
lateral.soil.layers[].jnumberno> 0 — Matlock J factor for the cohesive wedge (dimensionless). Omitted defaults to 0.5.
lateral.soil.layers[].model = "piedmont-residual"variantyesSimpson & Brown (2003) Piedmont residual soil (residual silty sands and saprolite). Static loading only.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].esinumberyes> 0 — Initial modulus of subgrade reaction Eₛᵢ at the layer top (force/length³: kN/m³ for si, kip/ft³ for us). Simpson & Brown (2003) Eq. 5.6 correlations, in pci: 22·N with N the uncorrected SPT blow count per 30 cm (not N₆₀, p. 64), 0.118·q_c (q_c in kPa), 0.076·E_DMT and 0.235·E_PMT (moduli in psi).
lateral.soil.layers[].esiBottomnumberno> 0 — Eₛᵢ at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from esi. Omit for a constant layer.
lateral.soil.layers[].lambdanumberno> 0 — Secant-modulus degradation constant λ (dimensionless). Omitted defaults to 0.23 (Simpson & Brown 2003).
lateral.soil.layers[].model = "iso-clay"variantyesISO 19901-4 / Jeanjean et al. (2017) clay, the offshore alternative to Matlock. Static loading only.
lateral.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and each later layer starts at the previous layer's bottom.
lateral.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m for si, ft for us). The last layer must reach at least the embedded pile tip.
lateral.soil.layers[].gammanumberyes> 0 — Unit weight at the layer top used to build the effective vertical stress: total unit weight above the water table, buoyant (effective) unit weight below it (kN/m³ for si, kip/ft³ for us).
lateral.soil.layers[].gammaBottomnumberno> 0 — Unit weight at the layer bottom (kN/m³ for si, kip/ft³ for us); varies linearly from gamma. Omit for a constant layer.
lateral.soil.layers[].sunumberyes> 0 — Undrained shear strength sᵤ on a Direct Simple Shear (DSS) basis at the layer top (force/length²: kPa for si, ksf for us).
lateral.soil.layers[].suBottomnumberno> 0 — sᵤ (DSS basis) at the layer bottom (kPa for si, ksf for us); varies linearly from su. Omit for a constant layer.
lateral.soil.layers[].alphanumberno0 – 1 — Pile–soil adhesion factor α (0–1); sets the deep bearing factor N_pd = 9 + 3α. Omitted defaults to 1.
lateral.soil.layers[].gap"open" | "closed"noGapping behind the pile: "open" adds the σ′ᵥ/sᵤ overburden term, "closed" doubles the wedge factor. Omitted defaults to "open".
lateral.soil.layers[].clayType"soft" | "stiff"noJeanjean (2017) normalized backbone family keyed on strength: "soft" (sᵤ up to about 100 kPa) or "stiff" (above). Used only when ocr is omitted; omitted defaults to "soft".
lateral.soil.layers[].ocrnumberno≥ 1 — Over-consolidation ratio (≥ 1). Selects the ISO 19901-4:2025 default normalized p-y curve, tabulated for OCR ≤ 2, 4 and 10 (between them the softer, higher-OCR curve is used; above 10 the OCR = 10 curve). Replaces the clayType table; do not send both.
lateral.soil.layers[].plasticityIndexnumberno0 – 200 — Plasticity index Ip in percent; selects the ISO 19901-4:2025 Ip > 30 % or Ip ≤ 30 % curve group. Requires ocr. Omitted with ocr uses the softer Ip > 30 % group.
lateral.soil.layers[].suTeDssRationumberno0 – 1.5 — Average triaxial-extension to DSS strength ratio sᵤTE/sᵤDSS within the wedge depth. With an open gap, applies the ISO 19901-4:2025 strength-anisotropy correction to the wedge bearing factor (ISO recommends 0.9 for very soft and soft Gulf-of-Mexico-type clays). Omitted with an open gap: the ISO default 0.9 is applied (declare 1 for isotropic strength). Not used with gap "closed".
lateral.soil.cyclesnumbernointeger, > 0 — Cycle count N for Welch–Reese stiff clay above water only; omitted defaults to 100. Matlock, RCK and sand cyclic branches do not depend on N.
axialobjectyesAxial (t-z/q-z) model of the same pile, vertical only; length and diameter must match the lateral pile at every depth.
axial.method"navfac-dm7-reese-oneill"yesAxial method: NAVFAC DM-7 capacity with Reese & O'Neill t-z/q-z load transfer.
axial.pileobjectyes
axial.pile.kind = "uniform"variantnoPile geometry type: "uniform" is one diameter over the full length (the default).
axial.pile.lengthnumberyes> 0 — Pile length below the pile head (m for si, ft for us).
axial.pile.diameternumberyes> 0 — Pile width or diameter B (m or ft).
axial.pile.tipAreanumberno> 0 — End-bearing (tip) area (length², in the request's unit system). Defaults to π·B²/4 using the tip diameter (a closed circular tip).
axial.pile.batterDegnumberno0 – 45 — Batter angle from vertical in degrees (0–45, default 0). Some analyses (axial, downdrag, drilled shaft) accept vertical piles only.
axial.pile.elasticModulusnumberyes> 0 — Young's modulus E of the pile material (kPa for si, ksf for us); controls elastic shortening under load.
axial.pile.unitWeightnumberyes≥ 0 — Unit weight of the pile material (kN/m³ for si, kip/ft³ for us). Sets the pile self-weight credited to uplift resistance; the buoyant value is used below the water table.
axial.pile.displacementbooleannotrue for a driven displacement pile, false for a drilled/bored (non-displacement) pile. Selects the Nq end-bearing factor and, in the axial service solve, driven (API RP2A) vs bored (Reese–O'Neill) t-z/q-z curves. Omitted means true, except in the drilled-shaft analysis, which rejects true and always treats the shaft as non-displacement.
axial.pile.material"steel" | "concrete" | "timber"noPile material for the NAVFAC DM-7.02 defaults: the interface friction angle δ (Fig. 1 cont., p. 7.2-194: steel 20°, concrete and timber ¾φ) and the clay adhesion C_A (Fig. 2, p. 7.2-196: steel column vs timber-and-concrete column). When omitted, the lower (conservative) table value is used: δ = min(20°, ¾φ) and the steel adhesion column. deltaDeg, frictionFactor and a layer's ka override these defaults. Not accepted by the drilled-shaft method.
axial.pile.deltaDegnumberno0 – 60 — Pile–soil interface friction angle δ in degrees for cohesionless side friction; may not exceed the layer's phi. When omitted, δ = frictionFactor × phi, or the NAVFAC material default (see material) when frictionFactor is also omitted.
axial.pile.frictionFactornumberno0 – 1 — Ratio δ/φ used to derive the interface friction angle when deltaDeg is omitted (0–1). When omitted, the NAVFAC DM-7.02 material default applies (see material).
axial.pile.kind = "sectioned"variantyesPile geometry type: "sectioned" gives the pile as contiguous depth sections with their own diameter, perimeter and area.
axial.pile.sections[]object[]yesmin 1 item — Pile sections ordered from the head down, starting at depth 0 with no gaps or overlaps.
axial.pile.sections[].topnumberyes≥ 0 — Depth to the top of this section below the pile head (m for si, ft for us). The first section starts at 0 and sections must be contiguous.
axial.pile.sections[].bottomnumberyes> 0 — Depth to the bottom of this section below the pile head (m or ft); must exceed top. The last section's bottom is the pile length.
axial.pile.sections[].diameternumberyes> 0 — Section width or diameter B (m or ft).
axial.pile.sections[].perimeternumberno> 0 — Surface perimeter used for side resistance (m or ft). Defaults to π·B (circular).
axial.pile.sections[].areanumberno> 0 — Structural cross-sectional area used for elastic shortening and pile self-weight (length², in the request's unit system). Defaults to π·B²/4.
axial.pile.tipAreanumberno> 0 — End-bearing (tip) area (length², in the request's unit system). Defaults to π·B²/4 using the tip diameter (a closed circular tip).
axial.pile.batterDegnumberno0 – 45 — Batter angle from vertical in degrees (0–45, default 0). Some analyses (axial, downdrag, drilled shaft) accept vertical piles only.
axial.pile.elasticModulusnumberyes> 0 — Young's modulus E of the pile material (kPa for si, ksf for us); controls elastic shortening under load.
axial.pile.unitWeightnumberyes≥ 0 — Unit weight of the pile material (kN/m³ for si, kip/ft³ for us). Sets the pile self-weight credited to uplift resistance; the buoyant value is used below the water table.
axial.pile.displacementbooleannotrue for a driven displacement pile, false for a drilled/bored (non-displacement) pile. Selects the Nq end-bearing factor and, in the axial service solve, driven (API RP2A) vs bored (Reese–O'Neill) t-z/q-z curves. Omitted means true, except in the drilled-shaft analysis, which rejects true and always treats the shaft as non-displacement.
axial.pile.material"steel" | "concrete" | "timber"noPile material for the NAVFAC DM-7.02 defaults: the interface friction angle δ (Fig. 1 cont., p. 7.2-194: steel 20°, concrete and timber ¾φ) and the clay adhesion C_A (Fig. 2, p. 7.2-196: steel column vs timber-and-concrete column). When omitted, the lower (conservative) table value is used: δ = min(20°, ¾φ) and the steel adhesion column. deltaDeg, frictionFactor and a layer's ka override these defaults. Not accepted by the drilled-shaft method.
axial.pile.deltaDegnumberno0 – 60 — Pile–soil interface friction angle δ in degrees for cohesionless side friction; may not exceed the layer's phi. When omitted, δ = frictionFactor × phi, or the NAVFAC material default (see material) when frictionFactor is also omitted.
axial.pile.frictionFactornumberno0 – 1 — Ratio δ/φ used to derive the interface friction angle when deltaDeg is omitted (0–1). When omitted, the NAVFAC DM-7.02 material default applies (see material).
axial.soilobjectyes
axial.soil.layers[]object[]yesmin 1 item — Soil and rock layers ordered from the ground surface down, starting at depth 0 with no gaps or overlaps.
axial.soil.layers[].topnumberyes≥ 0 — Depth to the top of the layer below the ground surface (m for si, ft for us). The first layer starts at 0 and layers must be contiguous.
axial.soil.layers[].bottomnumberyes> 0 — Depth to the bottom of the layer below the ground surface (m or ft); must exceed top. The deepest layer should reach at least the pile tip.
axial.soil.layers[].gammanumberyes> 0 — Total unit weight γ of the layer (kN/m³ for si, kip/ft³ for us); builds the vertical stress profile.
axial.soil.layers[].type"cohesive" | "cohesionless" | "rock"yesBehavioural class that selects the resistance method: cohesive (clay, undrained strength), cohesionless (sand), or rock. It also decides which strength fields are required or allowed.
axial.soil.layers[].cohesionnumberno≥ 0 — Undrained shear strength Su of a cohesive layer (kPa for si, ksf for us). Give exactly one of cohesion or qu for cohesive layers; not allowed on cohesionless or rock layers.
axial.soil.layers[].phinumberno0 – 60 — Drained friction angle φ in degrees (0–60) for cohesionless layers. Required by the axial (NAVFAC) soil profile; in the layer where the pile tip bears it must be 26–40°, the range NAVFAC DM-7.02 tabulates Nq for. NAVFAC's table footnotes (p. 7.2-194) limit φ to 28° for jetted piles, and for drilled-pier end bearing where a bailer or grab bucket is used below groundwater; enter φ accordingly. The drilled-shaft method uses sptN instead and rejects phi.
axial.soil.layers[].sptNnumberno≥ 0 — SPT blow count N (blows per 0.3 m) for cohesionless layers. Required by the drilled-shaft method (0 < N ≤ 50); not accepted by the axial (NAVFAC) soil profile.
axial.soil.layers[].qunumberno≥ 0 — Unconfined compressive strength qu (kPa for si, ksf for us). Required for rock layers; for cohesive layers it is the alternative to cohesion, with Su = qu/2. The axial, capacity-vs-length, downdrag, slope and stiffness analyses reject rock within the pile length (no rock t-z/q-z service curves, and no static method for driven piles in rock, FHWA GEC 12 §7.2.1.4); analyse a cast-in-place rock socket with the drilled-shaft method, which limits qu to the concrete strength f′c (FHWA-IF-99-025 Eq. 11.24).
axial.soil.layers[].rockJointCondition"massive-intact" | "closed" | "open-or-gouge-filled"noRock-mass joint condition from FHWA-IF-99-025 Table 11.4, required on rock layers: massive-intact, closed joints, or open/gouge-filled joints. Jointed conditions reduce socket side resistance by RQD; jointed rock at the pile tip is rejected.
axial.soil.layers[].rqdnumberno0 – 100 — Rock Quality Designation in percent. Required (20–100, the published Table 11.4 range) for closed or open/gouge-filled rock; must be omitted for massive-intact rock.
axial.soil.layers[].kDownnumberno> 0 — Layer override of the lateral earth-pressure ratio K = σ'h/σ'v for downward (compression) side friction in cohesionless layers (NAVFAC method). When omitted, the analysis-level value applies. The drilled-shaft and helical methods do not use it and reject it.
axial.soil.layers[].kUpnumberno> 0 — Layer override of K for uplift side friction (NAVFAC method). When omitted, this layer's kDown is used, then the analysis-level value.
axial.soil.layers[].kcnumberno> 0 — Adhesion factor Kc multiplying cohesive side adhesion (fs = Kc·Ka·Su) in the NAVFAC method; default 1. Not allowed on cohesionless layers, or by the drilled-shaft and helical methods.
axial.soil.layers[].kanumberno> 0 — Adhesion ratio Ka = Ca/Su override for cohesive side friction in the NAVFAC method. When omitted it follows the NAVFAC DM-7.02 Figure 2 recommended-adhesion table (p. 7.2-196) for the pile material: C_A = Su up to 250 psf, then 480/750/950/1300 psf (timber and concrete) or 460/700/720/750 psf (steel, also used when material is omitted) at Su = 500/1000/2000/4000 psf, interpolated between band limits and held above 4000 psf. Not allowed on cohesionless layers.
axial.soil.waterTableDepthnumberno≥ 0 — Depth of the water table below the ground surface (m for si, ft for us). Omit for a dry profile; when given, waterUnitWeight is required.
axial.soil.waterUnitWeightnumberno> 0 — Unit weight of water γw used for pore pressure and buoyancy: 9.81 kN/m³ for si or 0.0624 kip/ft³ for us (never pcf). Required when waterTableDepth is given.
axial.capacityobjectyesAxial capacity options that set the ultimate side and tip resistance for the t-z/q-z springs.
axial.capacity.segmentsnumberyesinteger, 20 – 500 — Number of integration segments along the embedded length for the axial capacity calculation.
axial.capacity.penetrationRatioSidenumberyes> 0 — Penetration ratio z/B defining the limiting depth for side friction.
axial.capacity.penetrationRatioTipnumberyes> 0 — Penetration ratio z/B defining the limiting depth for end bearing.
axial.capacity.kDownnumberyes> 0 — Lateral earth-pressure ratio K (dimensionless) for downward side friction, used for layers that omit their own kDown.
axial.capacity.kUpnumberyes> 0 — Lateral earth-pressure ratio K (dimensionless) for uplift side friction, used for layers that omit their own kUp and kDown.
rowobjectyesPile row stabilizing the slope.
row.pileCountnumberyesinteger, > 0 — Number of identical piles in the row crossing the candidate surfaces.
row.spacingnumberyes> 0 — Center-to-center pile spacing along the row (length, in the request's unit system). Must be at least 6 times the maximum lateral pile diameter.
row.tributaryWidthnumberyes> 0 — Width of slope represented by this row and its distributed demand (length). Total demand = distributedDemand × tributaryWidth; it cannot be less than the row's outside-pile centerline span.
row.orientation"normal-to-movement"yesRow orientation; only a row normal to the slope movement is supported.
row.interactionMethod"independent-wide-spacing"yesPile-row interaction method; only independent wide spacing (interaction factor 1.0) is supported.
surfaces[]object[]yesmin 1 item, max 60 items — Candidate slip surfaces, ordered by strictly increasing sliding depth, with unique IDs.
surfaces[].idstringyesUnique, stable lowercase identifier for this candidate surface (e.g. "s1").
surfaces[].slidingDepthnumberyes> 0 — Depth below the ground surface where this candidate slip surface crosses the pile (length). Surfaces must be listed in strictly increasing depth and may not lie below the pile tip.
surfaces[].distributedDemandnumberyes> 0 — Driving force per unit row width that the pile row must resist on this surface, from a separate slope-stability analysis (force/length, e.g. kN/m in SI or kip/ft in US).
surfaces[].slipAngleDegnumberno0 – 90 — Local slip-surface inclination from horizontal at this crossing, in degrees. Omit to use the request's shared slipAngleDeg.
soilDisplacementnumberyes> 0 — Magnitude of the free-field soil movement tangent to the slip surface, applied to soil above each candidate surface (length, in the request's unit system).
slipAngleDegnumberyes0 – 90 — Shared inclination of the slip surface and soil movement from horizontal, in degrees; used by surfaces without their own slipAngleDeg.
maxDisplacementCapnumberyes> 0 — Cap on the lateral (horizontal) component of the soil displacement (length, in the request's unit system). The lateral component is min(δ·cos θ, cap); the axial component is not capped. Required; there is no default.
incrementsnumberyesinteger, 20 – 800 — Number of finite-difference increments along the pile for the lateral p-y solve.
axialSegmentsnumberyesinteger, 20 – 800 — Number of axial load-transfer elements along the pile for the t-z solve.
convergenceTolerancenumberyes0 – 0.01 — Relative convergence tolerance shared by the lateral and axial nonlinear solvers.
lateralRelaxationnumberyes0 – 1 — Picard under-relaxation factor for the lateral p-y iteration (1 = full update, no relaxation); the solver may reduce it if iterations stall.
axialRelaxationnumberyes0 – 1 — Picard under-relaxation factor for the axial t-z iteration (1 = full update, no relaxation).
maxIterationsnumberyesinteger, 2 – 5000 — Maximum nonlinear iterations for each lateral and each axial solve. A solve that does not converge fails the request.
layering"direct" | "georgiadis"yesLayered-soil treatment for lateral p-y curves: "direct" builds each layer's curves at actual depth (as in COM624P); "georgiadis" uses the Georgiadis (1983) equivalent-depth method.
lateralShearReadout"equilibrium" | "finite-difference"noHow the lateral resistance (pile shear at the slip) is read. "equilibrium" (default): the equilibrium shear −∫p dz from the head to the slip, second order in the element length, used for design. "finite-difference": the central-difference shear RSPile and LPile print; it is first order in the element length and below the mesh-converged shear on coarse meshes, so it is only for reproducing published values at the publishing program's own mesh (the response then carries a warning).

Response fields

FieldTypeDescription
methodobjectExact released method, edition, interaction selector, and minimum spacing in pile diameters.
assessmentobjectglobalFsAssessed and structuralCapacityAssessed are both false: this endpoint supplies mobilized pile resistance only.
rowobjectEchoed row definition plus the computed minimum independent spacing in request length units.
points[]object[]One successful lateral-plus-axial solve per candidate surface, in declared depth order.
points[].surfaceIdstringStable candidate-surface identifier from the request.
points[].slipAngleDegnumberResolved local slip angle in degrees, from the candidate override or shared request angle.
points[].slidingDepthnumberDepth where the candidate surface crosses the pile, in the declared unit system.
points[].lateralResistancenumberSingle-pile p-y shear at the candidate surface.
points[].axialResistancenumberSingle-pile t-z internal axial force at the candidate surface.
points[].resultantnumberVector magnitude of component resistance, reported as a diagnostic only.
points[].tangentResistancenumberWork-conjugate single-pile resistance tangent to slip movement; used for capacity.
points[].rowCapacitynumberPile count × interaction factor × tangent resistance.
points[].totalDemandnumberDistributed driving demand × declared tributary width.
points[].demandCapacityRationumberTotal candidate demand divided by row capacity.
points[].capacityMarginnumberRow capacity minus total demand.
points[].lateralIterationsintegerNonlinear iterations used by the p-y solve.
points[].axialIterationsintegerNonlinear iterations used by the t-z solve.
governingSurfaceobjectCandidate with the largest demand/capacity ratio, not the largest resistance.
convergenceobjectSuccessful all-surface convergence stamp and maximum component iteration counts.

Code examples

A complete, runnable request. Replace YOUR_API_KEY (or set PILECALC_API_KEY in your environment).

POST /v1/slope
curl https://api.pilecalc.com/v1/slope \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "unitSystem": "si",
  "method": "applied-displacement-independent-wide-spacing",
  "lateral": {
    "pile": {
      "kind": "uniform",
      "length": 12,
      "diameter": 0.61,
      "ei": 143000,
      "groundSurfaceDepth": 0
    },
    "soil": {
      "layers": [
        {
          "model": "soft-clay",
          "top": 0,
          "bottom": 5,
          "gamma": 8.5,
          "c": 28,
          "e50": 0.02
        },
        {
          "model": "sand-reese",
          "top": 5,
          "bottom": 12,
          "gamma": 9.5,
          "phi": 34,
          "k": 16300
        }
      ]
    }
  },
  "axial": {
    "method": "navfac-dm7-reese-oneill",
    "pile": {
      "kind": "uniform",
      "length": 12,
      "diameter": 0.61,
      "elasticModulus": 200000000,
      "unitWeight": 77,
      "displacement": true
    },
    "soil": {
      "layers": [
        {
          "top": 0,
          "bottom": 5,
          "gamma": 18,
          "type": "cohesive",
          "cohesion": 28
        },
        {
          "top": 5,
          "bottom": 12,
          "gamma": 19,
          "type": "cohesionless",
          "phi": 34
        }
      ]
    },
    "capacity": {
      "segments": 120,
      "penetrationRatioSide": 20,
      "penetrationRatioTip": 20,
      "kDown": 1,
      "kUp": 1
    }
  },
  "row": {
    "pileCount": 5,
    "spacing": 3.66,
    "tributaryWidth": 18.3,
    "orientation": "normal-to-movement",
    "interactionMethod": "independent-wide-spacing"
  },
  "surfaces": [
    {
      "id": "surface.01",
      "slidingDepth": 1,
      "distributedDemand": 45
    },
    {
      "id": "surface.02",
      "slidingDepth": 2,
      "distributedDemand": 55
    },
    {
      "id": "surface.03",
      "slidingDepth": 3,
      "distributedDemand": 65
    },
    {
      "id": "surface.04",
      "slidingDepth": 4,
      "distributedDemand": 75
    },
    {
      "id": "surface.05",
      "slidingDepth": 5,
      "distributedDemand": 85
    },
    {
      "id": "surface.06",
      "slidingDepth": 6,
      "distributedDemand": 95
    },
    {
      "id": "surface.07",
      "slidingDepth": 7,
      "distributedDemand": 105
    },
    {
      "id": "surface.08",
      "slidingDepth": 8,
      "distributedDemand": 115
    }
  ],
  "soilDisplacement": 0.05,
  "slipAngleDeg": 30,
  "maxDisplacementCap": 0.3,
  "layering": "direct",
  "increments": 120,
  "axialSegments": 120,
  "convergenceTolerance": 1e-7,
  "lateralRelaxation": 0.4,
  "axialRelaxation": 0.5,
  "maxIterations": 1000
}'

The GET variant returns governingSurface.demandCapacityRatio,points.0.rowCapacity 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.

Interpreting results

  • Use governingSurface.demandCapacityRatio for the supplied pile-row check. It is not the slope's global factor of safety. The endpoint also does not check pile structural capacity; verify bending and shear strength separately.
  • points[].resultant is not the design capacity. The declared capacity uses the work-conjugate tangentResistance and the explicit row aggregation at the declared movement. The response retains resolved angles in points[].slipAngleDeg and governingSurface.slipAngleDeg.
  • The API never returns a successful point with converged: false. Any failed lateral or axial solve produces an actionable engine error for the request.
  • Spacing below six maximum pile diameters, unsupported orientation/interaction, mismatched component geometry, cyclic input, buried coordinates, unordered surfaces, and incomplete soil coverage fail contract validation.

Close-spacing interaction is not modeled

independent-wide-spacing has interaction factor 1.0 only inside its declared envelope. Do not emulate shadowing by altering pile count or spacing; rows spaced closer than the declared envelope are rejected explicitly.