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 }. 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"yes
method"applied-displacement-independent-wide-spacing"yes
lateralobjectyes
lateral.pileobjectyes
lateral.pile.kind = "uniform"variantno
lateral.pile.lengthnumberyes> 0
lateral.pile.diameternumberyes> 0
lateral.pile.einumberyes> 0
lateral.pile.groundSurfaceDepthnumberno≥ 0
lateral.pile.kind = "sectioned"variantyes
lateral.pile.sectionsobject | object[]yesmin 1 item
lateral.pile.groundSurfaceDepthnumberno≥ 0
lateral.soilobjectyes
lateral.soil.layers[]object[]yesmin 1 item
lateral.soil.layers[].model = "soft-clay"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].cnumberyes> 0
lateral.soil.layers[].cBottomnumberno> 0
lateral.soil.layers[].e50numberyes> 0
lateral.soil.layers[].e50Bottomnumberno> 0
lateral.soil.layers[].jnumberno> 0
lateral.soil.layers[].model = "stiff-clay-above-water"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].cnumberyes> 0
lateral.soil.layers[].cBottomnumberno> 0
lateral.soil.layers[].e50numberyes> 0
lateral.soil.layers[].e50Bottomnumberno> 0
lateral.soil.layers[].jnumberno> 0
lateral.soil.layers[].knumberno> 0
lateral.soil.layers[].kBottomnumberno> 0
lateral.soil.layers[].model = "stiff-clay-below-water"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].cnumberyes> 0
lateral.soil.layers[].cBottomnumberno> 0
lateral.soil.layers[].e50numberyes> 0
lateral.soil.layers[].e50Bottomnumberno> 0
lateral.soil.layers[].knumberyes> 0
lateral.soil.layers[].kBottomnumberno> 0
lateral.soil.layers[].model = "sand-reese"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].phinumberyes0 – 60
lateral.soil.layers[].phiBottomnumberno0 – 60
lateral.soil.layers[].knumberyes> 0
lateral.soil.layers[].kBottomnumberno> 0
lateral.soil.layers[].model = "sand-api"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].phinumberyes0 – 60
lateral.soil.layers[].phiBottomnumberno0 – 60
lateral.soil.layers[].knumberyes> 0
lateral.soil.layers[].kBottomnumberno> 0
lateral.soil.layers[].model = "weak-rock"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].qunumberyes> 0
lateral.soil.layers[].quBottomnumberno> 0
lateral.soil.layers[].eirnumberyes> 0
lateral.soil.layers[].eirBottomnumberno> 0
lateral.soil.layers[].rqdnumberyes0 – 100
lateral.soil.layers[].rqdBottomnumberno0 – 100
lateral.soil.layers[].krmnumberno> 0
lateral.soil.layers[].model = "elastic"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].esTopnumberyes≥ 0
lateral.soil.layers[].esBottomnumberno≥ 0
lateral.soil.layers[].model = "user"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].esnumberno≥ 0
lateral.soil.layers[].curves[]object[]no
lateral.soil.layers[].curves[].depthnumberyes≥ 0
lateral.soil.layers[].curves[].points[]object[]yesmin 2 items
lateral.soil.layers[].curves[].points[].ynumberyes≥ 0
lateral.soil.layers[].curves[].points[].pnumberyes≥ 0
lateral.soil.layers[].model = "liquefied-sand"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].units"SI" | "US"yes
lateral.soil.layers[].model = "silt-cphi"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].cnumberyes> 0
lateral.soil.layers[].cBottomnumberno> 0
lateral.soil.layers[].phinumberyes0 – 60
lateral.soil.layers[].phiBottomnumberno0 – 60
lateral.soil.layers[].knumberyes> 0
lateral.soil.layers[].kBottomnumberno> 0
lateral.soil.layers[].jnumberno> 0
lateral.soil.layers[].model = "piedmont-residual"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].esinumberyes> 0
lateral.soil.layers[].esiBottomnumberno> 0
lateral.soil.layers[].lambdanumberno> 0
lateral.soil.layers[].model = "iso-clay"variantyes
lateral.soil.layers[].topnumberyes≥ 0
lateral.soil.layers[].bottomnumberyes> 0
lateral.soil.layers[].gammanumberyes> 0
lateral.soil.layers[].gammaBottomnumberno> 0
lateral.soil.layers[].sunumberyes> 0
lateral.soil.layers[].suBottomnumberno> 0
lateral.soil.layers[].alphanumberno0 – 1
lateral.soil.layers[].gap"open" | "closed"no
lateral.soil.layers[].clayType"soft" | "stiff"no
lateral.soil.cyclesnumbernointeger, > 0
axialobjectyes
axial.method"navfac-dm7-reese-oneill"yes
axial.pileobjectyes
axial.pile.kind = "uniform"variantno
axial.pile.lengthnumberyes> 0
axial.pile.diameternumberyes> 0
axial.pile.tipAreanumberno> 0
axial.pile.batterDegnumberno0 – 45
axial.pile.elasticModulusnumberyes> 0
axial.pile.unitWeightnumberyes≥ 0
axial.pile.displacementbooleanno
axial.pile.deltaDegnumberno0 – 60
axial.pile.frictionFactornumberno> 0
axial.pile.kind = "sectioned"variantyes
axial.pile.sections[]object[]yesmin 1 item
axial.pile.sections[].topnumberyes≥ 0
axial.pile.sections[].bottomnumberyes> 0
axial.pile.sections[].diameternumberyes> 0
axial.pile.sections[].perimeternumberno> 0
axial.pile.sections[].areanumberno> 0
axial.pile.tipAreanumberno> 0
axial.pile.batterDegnumberno0 – 45
axial.pile.elasticModulusnumberyes> 0
axial.pile.unitWeightnumberyes≥ 0
axial.pile.displacementbooleanno
axial.pile.deltaDegnumberno0 – 60
axial.pile.frictionFactornumberno> 0
axial.soilobjectyes
axial.soil.layers[]object[]yesmin 1 item
axial.soil.layers[].topnumberyes≥ 0
axial.soil.layers[].bottomnumberyes> 0
axial.soil.layers[].gammanumberyes> 0
axial.soil.layers[].type"cohesive" | "cohesionless" | "rock"yes
axial.soil.layers[].cohesionnumberno≥ 0
axial.soil.layers[].phinumberno0 – 60
axial.soil.layers[].sptNnumberno≥ 0
axial.soil.layers[].qunumberno≥ 0
axial.soil.layers[].rockJointCondition"massive-intact" | "closed" | "open-or-gouge-filled"no
axial.soil.layers[].rqdnumberno0 – 100
axial.soil.layers[].kDownnumberno> 0
axial.soil.layers[].kUpnumberno> 0
axial.soil.layers[].kcnumberno> 0
axial.soil.layers[].kanumberno> 0
axial.soil.waterTableDepthnumberno≥ 0
axial.soil.waterUnitWeightnumberno> 0
axial.capacityobjectyes
axial.capacity.segmentsnumberyesinteger, 20 – 500
axial.capacity.penetrationRatioSidenumberyes> 0
axial.capacity.penetrationRatioTipnumberyes> 0
axial.capacity.kDownnumberyes> 0
axial.capacity.kUpnumberyes> 0
rowobjectyes
row.pileCountnumberyesinteger, > 0
row.spacingnumberyes> 0
row.tributaryWidthnumberyes> 0
row.orientation"normal-to-movement"yes
row.interactionMethod"independent-wide-spacing"yes
surfaces[]object[]yesmin 1 item, max 60 items
surfaces[].idstringyes
surfaces[].slidingDepthnumberyes> 0
surfaces[].distributedDemandnumberyes> 0
soilDisplacementnumberyes> 0
slipAngleDegnumberyes0 – 90
maxDisplacementCapnumberyes> 0
incrementsnumberyesinteger, 20 – 800
axialSegmentsnumberyesinteger, 20 – 800
convergenceTolerancenumberyes0 – 0.01
lateralRelaxationnumberyes0 – 1
axialRelaxationnumberyes0 – 1
maxIterationsnumberyesinteger, 2 – 5000
layering"direct" | "georgiadis"yes

Response fields

FieldTypeDescription
methodobjectExact released method, edition, interaction selector, and minimum spacing in pile diameters.
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[].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.
  • points[].resultant is not the design capacity. The declared capacity uses the work-conjugate tangentResistance and the explicit row aggregation.
  • 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.