API: lateral pile group

POST /v1/group-lateral — request and response fields for the row-by-row p-multiplier group analysis, with runnable examples.


Analyzes a laterally loaded pile group by row-by-row p-multipliers: because the cap forces every pile to the same deflection, each row is solved with the p-y engine using a spacing-dependent p-multiplier (trailing rows are shadowed by the rows ahead of them), and the row shears sum to the group load. The method and every input are explained in Pile groups; the same analysis runs interactively at the groups tool.

Endpoint

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

The request is a lateral request's pile and p-y soil profile plus a layout, but the loading is deflection-controlled: you impose headDeflection (the cap displacement) rather than a load. headFixed: true models a cap that restrains head rotation. Loading-direction spacing must be between 3B and 5B, the published Table 7-1 interpolation domain.

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.
pileobjectyesPile geometry and bending stiffness, as in a lateral request: kind "uniform" or "sectioned".
pile.kind = "uniform"variantnoA prismatic pile with one constant diameter and EI (the default when kind is omitted).
pile.lengthnumberyes> 0 — Total pile length from the head to the tip (m for si, ft for us), including any free length above grade.
pile.diameternumberyes> 0 — Pile width or diameter b (m for si, ft for us).
pile.einumberyes> 0 — Flexural rigidity EI of the pile (kN·m² for si, kip·ft² for us).
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.
pile.kind = "sectioned"variantyesA pile built from a stack of prismatic and/or tapered sections that tile the pile from head to tip.
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).
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.
soilobjectyesLayered p-y soil profile below the ground surface, as in a lateral request.
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.
soil.layers[].model = "soft-clay"variantyesMatlock (1970) soft clay, for soft to medium clay below the water table.
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.
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.
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).
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.
soil.layers[].cnumberyes> 0 — Undrained shear strength (cohesion) c at the layer top (kPa for si, ksf for us).
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.
soil.layers[].e50numberyes> 0 — Strain at 50% of the maximum principal stress difference in an undrained triaxial test, ε₅₀ (dimensionless), at the layer top.
soil.layers[].e50Bottomnumberno> 0 — ε₅₀ at the layer bottom (dimensionless); varies linearly from the top value. Omit for a constant layer.
soil.layers[].jnumberno> 0 — Matlock empirical depth factor J (dimensionless). Omitted defaults to 0.5; 0.25 is sometimes used for stiffer clays.
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.
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.
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.
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).
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.
soil.layers[].cnumberyes> 0 — Undrained shear strength (cohesion) c at the layer top (kPa for si, ksf for us).
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.
soil.layers[].e50numberyes> 0 — Strain at 50% of the maximum principal stress difference in an undrained triaxial test, ε₅₀ (dimensionless), at the layer top.
soil.layers[].e50Bottomnumberno> 0 — ε₅₀ at the layer bottom (dimensionless); varies linearly from the top value. Omit for a constant layer.
soil.layers[].jnumberno> 0 — Matlock empirical depth factor J (dimensionless). Omitted defaults to 0.5; 0.25 is sometimes used for stiffer clays.
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.
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.
soil.layers[].model = "stiff-clay-below-water"variantyesReese, Cox & Koop stiff clay below the water table.
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.
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.
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).
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.
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.
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.
soil.layers[].e50numberyes> 0 — Strain at 50% of the maximum principal stress difference in an undrained triaxial test, ε₅₀ (dimensionless), at the layer top.
soil.layers[].e50Bottomnumberno> 0 — ε₅₀ at the layer bottom (dimensionless); varies linearly from the top value. Omit for a constant layer.
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.
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.
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.
soil.layers[].model = "sand-reese"variantyesReese, Cox & Koop (1974) sand (wedge and flow-around model).
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.
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.
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).
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.
soil.layers[].phinumberyes0 – 60 — Drained friction angle φ at the layer top, in degrees (0–60).
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.
soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k at the layer top (force/length³: kN/m³ for si, kip/ft³ for us).
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.
soil.layers[].model = "sand-api"variantyesAPI RP-2A / O'Neill & Murchison (1983) sand (hyperbolic-tangent curve).
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.
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.
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).
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.
soil.layers[].phinumberyes0 – 60 — Drained friction angle φ at the layer top, in degrees (0–60).
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.
soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k at the layer top (force/length³: kN/m³ for si, kip/ft³ for us).
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.
soil.layers[].model = "weak-rock"variantyesReese (1997) weak rock. Static loading only.
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.
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.
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).
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.
soil.layers[].qunumberyes> 0 — Uniaxial (unconfined) compressive strength of the intact rock qu at the layer top (kPa for si, ksf for us).
soil.layers[].quBottomnumberno> 0 — qu at the layer bottom (kPa for si, ksf for us); varies linearly from qu. Omit for a constant layer.
soil.layers[].eirnumberyes> 0 — Initial rock-mass modulus Eir at the layer top (force/length²: kPa for si, ksf for us).
soil.layers[].eirBottomnumberno> 0 — Eir at the layer bottom (kPa for si, ksf for us); varies linearly from eir. Omit for a constant layer.
soil.layers[].rqdnumberyes0 – 100 — Rock Quality Designation at the layer top, as a percentage (0–100).
soil.layers[].rqdBottomnumberno0 – 100 — RQD at the layer bottom, as a percentage (0–100); varies linearly from rqd. Omit for a constant layer.
soil.layers[].krmnumberno> 0 — Rock strain factor k_rm (dimensionless), typically 0.0005 to 0.00005. Omitted defaults to 0.0005.
soil.layers[].model = "elastic"variantyesLinear-elastic (Winkler) subgrade: p = E_py·y, independent of deflection.
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.
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.
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).
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.
soil.layers[].esTopnumberyes≥ 0 — Soil-reaction modulus E_py at the layer top (force/length²: kN/m² for si, kip/ft² for us).
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.
soil.layers[].model = "user"variantyesUser-defined resistance: a constant linear modulus es, or measured p-y curves at given depths.
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.
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.
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).
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.
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.
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.
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.
soil.layers[].curves[].points[]object[]yesmin 2 items — The curve's (y, p) points, starting at (0, 0).
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.
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.
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.
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.
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.
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).
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.
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.
soil.layers[].model = "silt-cphi"variantyesReese et al. (1974) silt or cemented c-φ soil with both cohesion and friction.
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.
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.
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).
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.
soil.layers[].cnumberyes> 0 — Cohesion c at the layer top (kPa for si, ksf for us).
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.
soil.layers[].phinumberyes0 – 60 — Drained friction angle φ at the layer top, in degrees (0–60).
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.
soil.layers[].knumberyes> 0 — Initial modulus of subgrade reaction k at the layer top (force/length³: kN/m³ for si, kip/ft³ for us).
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.
soil.layers[].jnumberno> 0 — Matlock J factor for the cohesive wedge (dimensionless). Omitted defaults to 0.5.
soil.layers[].model = "piedmont-residual"variantyesSimpson & Brown (2003) Piedmont residual soil (residual silty sands and saprolite). Static loading only.
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.
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.
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).
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.
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).
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.
soil.layers[].lambdanumberno> 0 — Secant-modulus degradation constant λ (dimensionless). Omitted defaults to 0.23 (Simpson & Brown 2003).
soil.layers[].model = "iso-clay"variantyesISO 19901-4 / Jeanjean et al. (2017) clay, the offshore alternative to Matlock. Static loading only.
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.
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.
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).
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.
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).
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.
soil.layers[].alphanumberno0 – 1 — Pile–soil adhesion factor α (0–1); sets the deep bearing factor N_pd = 9 + 3α. Omitted defaults to 1.
soil.layers[].gap"open" | "closed"noGapping behind the pile: "open" adds the σ′ᵥ/sᵤ overburden term, "closed" doubles the wedge factor. Omitted defaults to "open".
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".
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.
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.
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".
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.
layoutobjectyesRectangular group layout: nx rows in the loading direction × ny piles per row. Loading-direction spacing must be 3B to 5B (FHWA GEC 9 Table 7-1).
layout.nxnumberyesinteger, 1 – 40 — Number of piles in the X direction. For a lateral group X is the loading direction, so nx is the number of rows, with row 1 leading.
layout.nynumberyesinteger, 1 – 40 — Number of piles in the Y direction (for a lateral group, piles per row across the loading direction).
layout.spacingXnumberyes> 0 — Centre-to-centre pile spacing in X (m for si, ft for us); must exceed the maximum pile diameter when nx > 1. For a lateral group with more than one pile it must be 3 to 5 times the pile-head diameter.
layout.spacingYnumberyes> 0 — Centre-to-centre pile spacing in Y (m for si, ft for us); must exceed the maximum pile diameter when ny > 1.
headDeflectionnumberyes> 0 — Common lateral head deflection imposed on every pile by the cap (m for si, ft for us). The analysis returns the group load that produces it.
headFixedbooleannotrue: pile heads fixed against rotation (slope 0); false or omitted: free heads (moment 0).
loadType"static" | "cyclic"noBuild static (monotonic) or cyclic p-y curves. Omitted defaults to "static". weak-rock, piedmont-residual and iso-clay layers support static loading only.
layering"direct" | "georgiadis"noLayered-soil treatment: "direct" builds each layer's p-y curves at their actual depth (original COM624P); "georgiadis" uses Georgiadis (1983) equivalent depths for lower layers and does not accept elastic or user layers. Omitted defaults to "direct".
incrementsnumbernointeger, 10 – 800 — Number of finite-difference segments each pile is divided into (10–800). Omitted defaults to 100.

Response fields

FieldTypeDescription
nPilesnumberPiles in the group (nx × ny).
deflectionnumberThe imposed head deflection the group was analyzed at (m for si, ft for us).
groupLoadnumberTotal lateral load the group carries at that deflection: Σ (row count × pile shear) (kN for si, kip for us).
rows[]object[]Row-by-row results, ordered lead row first (row 0).
rows[].rownumberRow index in the loading direction (0 = lead).
rows[].countnumberPiles in the row.
rows[].pMultipliernumberThe p-multiplier applied to the row's p-y curves (shadowing reduction).
rows[].pileShearnumberHead shear carried by each pile in the row at the common deflection (kN for si, kip for us).
rows[].maxMoment.value / .depthnumberMaximum moment in the row's piles (kN·m for si, kip·ft for us) and its depth (m for si, ft for us).
methodobjectFHWA GEC 9 edition/table, interpolation domain, and explicit exclusion of cap/soil resistance.

Code examples

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

POST /v1/group-lateral
curl https://api.pilecalc.com/v1/group-lateral \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "unitSystem": "si",
  "pile": {
    "kind": "uniform",
    "length": 15,
    "diameter": 0.61,
    "ei": 143000
  },
  "soil": {
    "layers": [
      {
        "model": "soft-clay",
        "top": 0,
        "bottom": 4,
        "gamma": 8.5,
        "c": 24,
        "e50": 0.02
      },
      {
        "model": "sand-reese",
        "top": 4,
        "bottom": 15,
        "gamma": 9.5,
        "phi": 34,
        "k": 16300
      }
    ]
  },
  "layout": {
    "nx": 3,
    "ny": 3,
    "spacingX": 1.83,
    "spacingY": 1.83
  },
  "headDeflection": 0.025,
  "headFixed": true,
  "loadType": "cyclic",
  "layering": "direct",
  "increments": 120
}'

The GET variant returns groupLoad,rows.0.maxMoment.value 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

  • To find the deflection under a known group load, sweep headDeflection over a few calls and interpolate groupLoad — the analysis is deflection-in, load-out.
  • Lead-row piles (row 0) carry the largest shear and moment; design the piles for rows[0], not the average.
  • rows[].pileShear × count summed over rows equals groupLoad — a quick consistency check.

Spacing drives the multipliers

FHWA GEC 9 Table 7-1 gives row 1/2/3+ multipliers of 0.8/0.4/0.3 at 3B and 1.0/0.85/0.7 at 5B. PileCalc interpolates between those knots and rejects extrapolation. The result is pile-only; cap/soil resistance is excluded.