API: drilled shaft
POST /v1/drilled-shaft — request and response fields for FHWA-IF-99-025 shaft capacity, with runnable examples.
Computes the axial capacity of a drilled shaft (bored pile / caisson) with the FHWA method of O'Neill & Reese (FHWA-IF-99-025, 1999): α-method side resistance in clay, β-method (SPT-based) in sand, rock-socket resistance in rock, base bearing, belled-base uplift, and optional service-load settlement. The method and every input are explained in Drilled shafts; the same analysis runs interactively at the drilled-shaft tool.
Endpoint
https://api.pilecalc.com/v1/drilled-shaft/v1/drilled-shaft?key=…&req=…&fields=…(for header-less callers)The request mirrors the axial endpoint — a pile and a layered soil profile — and requires an explicitmethod, constructionMethod, and analysisMode. The released slice is fhwa-if-99-025 for a dry-stable-open-hole shaft. Cohesionless layers require sptN (the SPT blow count that drives the β correlation), not phi. Cohesive layers need cohesion (or qu); rock needs qu. Add bellDiameter and bellHeight together for a belled base. Rock layers require an explicit rockJointCondition; jointed layers also requirerqd from 20 through 100, and jointed rock at the base is rejected. Service mode also requires an explicit service load and numerical controls.
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.
| Field | Type | Required | Constraints |
|---|---|---|---|
unitSystem | "si" | "us" | yes | |
method | "fhwa-if-99-025" | yes | |
constructionMethod | "dry-stable-open-hole" | yes | |
analysisMode | "capacity-only" | "capacity-and-service" | yes | |
pile | object | yes | |
pile.kind = "uniform" | variant | no | |
pile.length | number | yes | > 0 |
pile.diameter | number | yes | > 0 |
pile.tipArea | number | no | > 0 |
pile.batterDeg | number | no | 0 – 45 |
pile.elasticModulus | number | yes | > 0 |
pile.unitWeight | number | yes | ≥ 0 |
pile.displacement | boolean | no | |
pile.deltaDeg | number | no | 0 – 60 |
pile.frictionFactor | number | no | > 0 |
pile.kind = "sectioned" | variant | yes | |
pile.sections[] | object[] | yes | min 1 item |
pile.sections[].top | number | yes | ≥ 0 |
pile.sections[].bottom | number | yes | > 0 |
pile.sections[].diameter | number | yes | > 0 |
pile.sections[].perimeter | number | no | > 0 |
pile.sections[].area | number | no | > 0 |
pile.tipArea | number | no | > 0 |
pile.batterDeg | number | no | 0 – 45 |
pile.elasticModulus | number | yes | > 0 |
pile.unitWeight | number | yes | ≥ 0 |
pile.displacement | boolean | no | |
pile.deltaDeg | number | no | 0 – 60 |
pile.frictionFactor | number | no | > 0 |
soil | object | yes | |
soil.layers[] | object[] | yes | min 1 item |
soil.layers[].top | number | yes | ≥ 0 |
soil.layers[].bottom | number | yes | > 0 |
soil.layers[].gamma | number | yes | > 0 |
soil.layers[].type | "cohesive" | "cohesionless" | "rock" | yes | |
soil.layers[].cohesion | number | no | ≥ 0 |
soil.layers[].phi | number | no | 0 – 60 |
soil.layers[].sptN | number | no | ≥ 0 |
soil.layers[].qu | number | no | ≥ 0 |
soil.layers[].rockJointCondition | "massive-intact" | "closed" | "open-or-gouge-filled" | no | |
soil.layers[].rqd | number | no | 0 – 100 |
soil.layers[].kDown | number | no | > 0 |
soil.layers[].kUp | number | no | > 0 |
soil.layers[].kc | number | no | > 0 |
soil.layers[].ka | number | no | > 0 |
soil.waterTableDepth | number | no | ≥ 0 |
soil.waterUnitWeight | number | no | > 0 |
segments | number | yes | integer, 20 – 500 |
bellDiameter | number | no | > 0 |
bellHeight | number | no | > 0 |
fsTip | number | yes | > 0 |
fsSide | number | yes | > 0 |
fsWeight | number | yes | > 0 |
fsUplift | number | yes | > 0 |
serviceLoad | number | no | > 0 |
loadSettlementPoints | number | no | integer, 20 – 500 |
maxTipSettlement | number | no | > 0 |
convergenceTolerance | number | yes | 0 – 0.1 |
Response fields
| Field | Type | Description |
|---|---|---|
tip | number | Ultimate base (end-bearing) resistance (kN); on the bell area when bellDiameter is given. |
side | number | Ultimate side resistance in compression (kN) — α method in clay, β/SPT in sand, rock-socket in rock. |
ultimateDown | number | Ultimate downward capacity: tip + side (kN). |
allowableDown | number | Allowable downward capacity after fsTip / fsSide (kN). |
weight | number | Shaft self-weight (kN); credited to uplift. |
sideUplift | number | Ultimate side resistance in uplift (kN). |
bellUplift | number | Bell (belled-base) bearing contribution to uplift (kN); 0 without a bell. |
ultimateUplift | number | Ultimate uplift capacity: side uplift + bell + weight (kN). |
allowableUplift | number | Allowable uplift capacity after fsUplift (kN). |
tipPressure | number | Ultimate unit base pressure (kPa). |
segments[] | object[] | Layer-integrated side-transfer trace used to reproduce the capacity totals. |
service | object | undefined | Settlement at the explicit serviceLoad, including head/tip movement, load residual, and convergence state. |
convergence | object | Mandatory fine/coarse mesh comparison; the request fails if a released scalar exceeds convergenceTolerance. |
method | object | Stable method ID, source edition, supported construction method, and tip-interface convention. |
Code examples
A complete, runnable request. Replace YOUR_API_KEY (or set PILECALC_API_KEY in your environment).
curl https://api.pilecalc.com/v1/drilled-shaft \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"unitSystem": "si",
"method": "fhwa-if-99-025",
"constructionMethod": "dry-stable-open-hole",
"analysisMode": "capacity-and-service",
"pile": {
"kind": "uniform",
"length": 22,
"diameter": 0.9,
"elasticModulus": 28000000,
"unitWeight": 24
},
"soil": {
"layers": [
{
"type": "cohesive",
"top": 0,
"bottom": 8,
"gamma": 18,
"cohesion": 60
},
{
"type": "cohesionless",
"top": 8,
"bottom": 16,
"gamma": 19.5,
"sptN": 28
},
{
"type": "cohesive",
"top": 16,
"bottom": 24,
"gamma": 19,
"cohesion": 120
}
],
"waterTableDepth": 4,
"waterUnitWeight": 9.81
},
"serviceLoad": 1000,
"segments": 240,
"loadSettlementPoints": 160,
"maxTipSettlement": 0.12,
"bellDiameter": 1.8,
"bellHeight": 0.45,
"fsTip": 2.5,
"fsSide": 2,
"fsWeight": 1.5,
"fsUplift": 2.5,
"convergenceTolerance": 0.05
}'The GET variant returns allowableDown,allowableUplift,service.settlement 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
allowableDownappliesfsTipandfsSideseparately (side resistance mobilizes at much smaller displacement than base bearing).- With a bell,
tipandtipPressureare computed on the bell base area, andbellUpliftadds the inverted-bearing uplift contribution. - The FHWA five-foot top exclusion is applied only for surface clay; the bottom one-diameter (plus bell-height) exclusion is applied only for cohesive base soil.
serviceis a t-z/q-z load-transfer result atserviceLoad, not an ultimate-capacity settlement estimate. Rock-socket service response remains disabled until a named public rock load-transfer method is implemented.- The bearing stratum is the layer immediately below a tip interface. The response records that convention and the fine/coarse convergence check. Jointed-rock side resistance uses the declared Table 11.4 column, but jointed-rock base resistance fails closed.
unitSystem
"si" for metres, kN, kPa, and kN/m³ or "us" for feet, kip, ksf, and kip/ft³. When a water table is supplied, waterUnitWeight is also required; hidden groundwater defaults are not accepted.