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"yes
pileobjectyes
pile.kind = "uniform"variantno
pile.lengthnumberyes> 0
pile.diameternumberyes> 0
pile.einumberyes> 0
pile.groundSurfaceDepthnumberno≥ 0
pile.kind = "sectioned"variantyes
pile.sectionsobject | object[]yesmin 1 item
pile.groundSurfaceDepthnumberno≥ 0
soilobjectyes
soil.layers[]object[]yesmin 1 item
soil.layers[].model = "soft-clay"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].cnumberyes> 0
soil.layers[].cBottomnumberno> 0
soil.layers[].e50numberyes> 0
soil.layers[].e50Bottomnumberno> 0
soil.layers[].jnumberno> 0
soil.layers[].model = "stiff-clay-above-water"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].cnumberyes> 0
soil.layers[].cBottomnumberno> 0
soil.layers[].e50numberyes> 0
soil.layers[].e50Bottomnumberno> 0
soil.layers[].jnumberno> 0
soil.layers[].knumberno> 0
soil.layers[].kBottomnumberno> 0
soil.layers[].model = "stiff-clay-below-water"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].cnumberyes> 0
soil.layers[].cBottomnumberno> 0
soil.layers[].e50numberyes> 0
soil.layers[].e50Bottomnumberno> 0
soil.layers[].knumberyes> 0
soil.layers[].kBottomnumberno> 0
soil.layers[].model = "sand-reese"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].phinumberyes0 – 60
soil.layers[].phiBottomnumberno0 – 60
soil.layers[].knumberyes> 0
soil.layers[].kBottomnumberno> 0
soil.layers[].model = "sand-api"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].phinumberyes0 – 60
soil.layers[].phiBottomnumberno0 – 60
soil.layers[].knumberyes> 0
soil.layers[].kBottomnumberno> 0
soil.layers[].model = "weak-rock"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].qunumberyes> 0
soil.layers[].quBottomnumberno> 0
soil.layers[].eirnumberyes> 0
soil.layers[].eirBottomnumberno> 0
soil.layers[].rqdnumberyes0 – 100
soil.layers[].rqdBottomnumberno0 – 100
soil.layers[].krmnumberno> 0
soil.layers[].model = "elastic"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].esTopnumberyes≥ 0
soil.layers[].esBottomnumberno≥ 0
soil.layers[].model = "user"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].esnumberno≥ 0
soil.layers[].curves[]object[]no
soil.layers[].curves[].depthnumberyes≥ 0
soil.layers[].curves[].points[]object[]yesmin 2 items
soil.layers[].curves[].points[].ynumberyes≥ 0
soil.layers[].curves[].points[].pnumberyes≥ 0
soil.layers[].model = "liquefied-sand"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].units"SI" | "US"yes
soil.layers[].model = "silt-cphi"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].cnumberyes> 0
soil.layers[].cBottomnumberno> 0
soil.layers[].phinumberyes0 – 60
soil.layers[].phiBottomnumberno0 – 60
soil.layers[].knumberyes> 0
soil.layers[].kBottomnumberno> 0
soil.layers[].jnumberno> 0
soil.layers[].model = "piedmont-residual"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].esinumberyes> 0
soil.layers[].esiBottomnumberno> 0
soil.layers[].lambdanumberno> 0
soil.layers[].model = "iso-clay"variantyes
soil.layers[].topnumberyes≥ 0
soil.layers[].bottomnumberyes> 0
soil.layers[].gammanumberyes> 0
soil.layers[].gammaBottomnumberno> 0
soil.layers[].sunumberyes> 0
soil.layers[].suBottomnumberno> 0
soil.layers[].alphanumberno0 – 1
soil.layers[].gap"open" | "closed"no
soil.layers[].clayType"soft" | "stiff"no
soil.cyclesnumbernointeger, > 0
layoutobjectyes
layout.nxnumberyesinteger, 1 – 40
layout.nynumberyesinteger, 1 – 40
layout.spacingXnumberyes> 0
layout.spacingYnumberyes> 0
headDeflectionnumberyes> 0
headFixedbooleanno
loadType"static" | "cyclic"no
layering"direct" | "georgiadis"no
incrementsnumbernointeger, 10 – 800

Response fields

FieldTypeDescription
nPilesnumberPiles in the group (nx × ny).
deflectionnumberThe imposed head deflection the group was analyzed at (m).
groupLoadnumberTotal lateral load the group carries at that deflection: Σ (row count × pile shear) (kN).
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).
rows[].maxMoment.value / .depthnumberMaximum moment in the row's piles (kN·m) and its depth (m).
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.