# USDA SSURGO Soil Suitability, Hydric & Septic Screener API (`malonestar/ssurgo-soil-suitability-screener`) Actor

Screen any US coordinate against the USDA SSURGO soil survey: map unit, percent-weighted soil components, prime-farmland class, hydric rating, drainage, slope, and septic, foundation, road and solar-array limitations with the limiting reasons. Minority hydric components are reported, not hidden.

- **URL**: https://apify.com/malonestar/ssurgo-soil-suitability-screener.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Real estate, Developer tools, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.40 / 1,000 soil screening results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## USDA SSURGO Soil Suitability, Hydric & Septic Screener

Give it a list of coordinates. Get back, for each one, the USDA SSURGO soil map
unit, **every percent-weighted soil component in it**, the prime-farmland class
with its condition, the hydric rating, drainage class, slope, hydrologic soil
group, and NRCS limitation ratings for septic fields, dwellings with and without
basements, small commercial buildings, local roads, shallow excavations and
ground-based solar arrays -- each with **the reasons behind the rating**.

Straight from USDA NRCS Soil Data Access. No API key, no scraping, no
third-party re-hosting.

### The thing most soil lookups get wrong

A SSURGO map unit is almost never one soil. It is a percent-weighted mixture.

Take a real one -- mukey `411286`, *Hayden loam, 2 to 6 percent slopes*, Story
County, Iowa:

| Component | Share | Hydric? | Drainage |
|---|---|---|---|
| Hayden | 85% | **No** | Well drained |
| Le Sueur | 10% | No | Somewhat poorly drained |
| **Glencoe** | **5%** | **Yes** | Very poorly drained |

A tool that reports only the dominant component tells you **"not hydric"** and
moves on. That is a confident wrong answer on exactly the question a wetland
delineator, a septic designer or a Phase I consultant is asking: 5% of that map
unit is hydric soil, and hydric soil is one of the three wetland indicators under
the Corps 1987 manual.

This actor reports **both**: the dominant-component value *and* an
any-component flag, the hydric share as a percentage, the components by name, and
the most-limiting rating found anywhere in the map unit alongside the dominant
one. That distinction is in the field names, not buried in a note.

It also publishes what SSURGO **does not** describe. Map unit `116094` documents a
single component at 85% -- the other **15% of that map unit is undocumented**, and
an unmapped inclusion in it can still be hydric. You get that residue in
`components_percent_undocumented` rather than a silent assumption that it is 100%
Norfolk sand.

### Who it is for

- **Septic and onsite-wastewater designers** -- perc feasibility, seasonal high
  water table, and the specific NRCS reasons a site is limited, before anyone
  drives out to dig a test pit.
- **Land developers and homebuilders** -- shrink-swell and wetness constraints on
  foundations and roads, plus the prime-farmland class you need for FPPA
  (7 CFR 658) when there is any federal nexus.
- **Geotechnical engineers** -- frost action, corrosivity to steel and concrete,
  hydrologic soil group, slope range, and taxonomic family, as a desktop pass
  before the boring plan.
- **Solar and data-center siting teams** -- NRCS ships two purpose-built solar
  interpretations (ballast anchor and soil-based anchor); this actor reports both,
  including the steel-corrosion and frost-action reasons that drive them.
- **Phase I ESA and wetland-delineation prep** -- hydric soils and drainage as a
  screening layer, with an honest "not evaluated" instead of a false clear.
- **AI agents** -- one coordinate in, a flat typed row out.

### Example input

```json
{
  "assets": [
    { "lat": 42.110415, "lon": -93.560137, "label": "Story County IA parcel" },
    { "lat": 34.929063, "lon": -77.345001, "label": "Onslow County NC parcel" },
    { "lat": 30.84231,  "lon": -97.29329,  "label": "Bell County TX parcel" }
  ]
}
```

Optional: `interpretations` (subset of the eight; leave empty for all),
`includeComponentDetail` (default true), `maxAssets`, `simulateOutage`.

### Example output (abridged)

```json
{
  "asset_label": "Story County IA parcel",
  "mukey": "411286",
  "map_unit_name": "Hayden loam, 2 to 6 percent slopes",
  "farmland_class": "Not prime farmland",
  "component_count": 3,
  "dominant_component_name": "Hayden",
  "dominant_component_is_hydric": false,
  "any_component_hydric": true,
  "hydric_component_percent": 5,
  "hydric_component_names": "Glencoe (5%)",
  "map_unit_hydric_class": "partially hydric",
  "dominant_drainage_class": "Well drained",
  "wettest_drainage_class": "Very poorly drained",
  "septic_tank_absorption_fields_rating_dominant": "Very limited",
  "septic_tank_absorption_fields_reasons_dominant": "Depth to saturated zone (1.00); Slow water movement (1.00)",
  "dwellings_with_basements_rating_dominant": "Somewhat limited",
  "dwellings_with_basements_rating_worst": "Very limited",
  "dwellings_with_basements_worst_component": "Glencoe"
}
```

### Use as an MCP tool

Every published Apify actor is callable by an AI agent through
`mcp.apify.com`. The input is a plain list of coordinates and the output is a
flat, fully described, typed row per site -- so an agent can chain this into a
siting or due-diligence workflow without any glue code.

### What "null" means here

`null` means **not checked**. `false` means **checked, and the answer is
negative**. They are never collapsed.

Every row carries a per-source status -- `mapunit_status`, `component_status`,
`interpretation_status`, `legend_status` -- plus `sources_ok_count` and
`data_complete`. If the NRCS interpretation table does not answer, every septic
and foundation rating on that row is `null` and the status reads `unavailable`.
It will never read "Not limited" off a table that was never read. If **every**
site fails at the source, the run **FAILS** and bills nothing rather than
publishing a page of confident blanks.

A coordinate USDA has not soil-mapped -- open water, or an unsurveyed area --
returns `lookup_status: "out_of_coverage"` with every soil field null. That is an
explicit "not evaluated", not a clear.

### Columns that are legitimately null

Six declared columns are null on most rows because SSURGO only populates them
in specific places. Each has a verified live input that does populate it, so you
can tell "not applicable here" from "broken":

| Column | A coordinate that populates it |
|---|---|
| `lookup_error` | any out-of-coverage, rejected or partial site, e.g. `44.0, -87.0` (Lake Michigan) |
| `iowa_corn_suitability_rating` | `42.110415, -93.560137` (Iowa; NRCS publishes CSR only there) |
| `dominant_soil_slip_potential` | `61.566941, -150.422585` (Matanuska-Susitna, Alaska) |
| `hydric_rating_vocabulary_unknown` | only populates if SSURGO changes its hydric domain |
| `drainage_vocabulary_unknown` | only populates if SSURGO changes its drainage domain |
| `drift_gate_warnings` | only populates when the drift gate passes with a warning |

On a healthy, fully-covered run those last four are all null, and that is **good
news** rather than a dead column. Measured on the prefill: 4 of 149 columns null,
all four of them for that reason.

Two columns were deliberately **not** shipped: SSURGO's `mustatus` and `muhelcl`
are null for every row in the entire national map-unit table (measured live),
so declaring them would have put two permanently empty columns on this page.

### Live drift gate

Before a single billable row exists, every run verifies the upstream against a
fixed reference scope and **fails loudly** if any check regresses:

1. **Positive canary** -- a known coordinate must still resolve to map unit
   `411286`. This matters because USDA answers a malformed geometry with HTTP 200
   and an empty body, byte-identical to a genuine unmapped point.
2. **Negative control** -- a point 1,500 km out in the Atlantic must return
   nothing. A spatial filter that quietly matches everything would otherwise
   pass every other check.
3. **Multi-component structure** -- the canary map unit must still return three
   components summing to ~100% with exactly one minority hydric component. If
   that collapses, this actor's entire differentiator is silently gone.
4. **Interpretation availability** -- all eight NRCS rule names must still exist.
   A rename upstream would otherwise render as a permanently absent limitation.
5. **Closed vocabularies** -- hydric rating, drainage class and limitation class
   are checked against a fixed survey area. An unknown value there fails the run.
   (An unknown value on *your* map unit is surfaced in a `*_vocabulary_unknown`
   column and excluded from derived flags instead -- one odd map unit can never
   take the actor down.)
6. **Freshness and scale** -- the newest survey-area refresh and the survey-area
   count must be in band.

Every measured value is logged on every run.

### Pricing

**$8 per 1,000 results.** One screened site = one result. Out-of-coverage and
rejected-input rows are billed as results because they are real answers about
that site; a run where *every* site failed at the source, or *every* asset was
invalid, fails and bills nothing.

### FAQ

**Is this a wetland delineation?** No. Hydric soil is one of three wetland
indicators; a delineation needs hydrology and vegetation too, and field
verification. This is a desktop screen that tells you where to look.

**Is this a septic permit?** No. It is the NRCS soil interpretation, which is
what county health departments and designers screen with before a percolation
test. It is not a substitute for a site evaluation.

**Why does almost nothing come back "Not limited" for septic?** Because that is
what SSURGO actually says. In a real county (Story County, Iowa) the live
distribution is 174 map-unit components "Very limited", 46 "Somewhat limited",
9 "Not rated", and zero "Not limited". "Somewhat limited" is the practical best
case across much of the country. The actor reports NRCS verbatim rather than
rescaling it into something more flattering.

**Does it cover Alaska, Hawaii and Puerto Rico?** Wherever NRCS has published a
soil survey, yes -- Anchorage resolves fine. Unsurveyed areas return
`out_of_coverage`.

**How current is the data?** SSURGO is refreshed annually per survey area. Every
row carries `survey_data_refreshed` and `survey_data_age_days` for its own survey
area, and `ssurgo_newest_survey_refresh` for the database as a whole.

**Can I get the raw component records?** Yes -- `components_json` carries every
component with all 36 fetched SSURGO attributes, and `interpretations_json` adds
the NRCS fuzzy values and any sub-rules NRCS could not evaluate.

### Related actors

- **[usda-cdl-farmland-siting-screener](https://apify.com/malonestar/usda-cdl-farmland-siting-screener)**
  \-- what is actually *growing* on the site (USDA Cropland Data Layer). Pairs
  naturally: this actor tells you what the soil *is*, that one tells you what the
  land is *used for*.
- **[fws-wetlands-proximity-screener](https://apify.com/malonestar/fws-wetlands-proximity-screener)**
  \-- USFWS National Wetlands Inventory polygons. Hydric soil here plus an NWI
  polygon there is the classic two-of-three wetland screen.
- **[site-due-diligence-bundle](https://apify.com/malonestar/site-due-diligence-bundle)**
  \-- 20 federal layers for one coordinate in one call, with a composite score.

Each of these is a **screening tool, not a determination**. None replaces a site
investigation by a qualified professional.

### Output fields

All 149 fields, every one nullable. `null` = not checked; `false` = checked and negative.

| Field | Type | Description |
|---|---|---|
| `asset_label` | string | The label you supplied for this site, echoed back so rows can be joined to your own records. |
| `asset_index` | integer | Zero-based position of this site in the assets array you supplied. Preserved even for rejected sites so you can match every row back to its input. |
| `latitude` | number | WGS84 latitude of the point that was screened. |
| `longitude` | number | WGS84 longitude of the point that was screened. |
| `checked_at` | string | UTC timestamp of this run. |
| `data_source` | string | The authority this row came from. |
| `source_url` | string | The USDA Soil Data Access endpoint queried. |
| `lookup_status` | string | ok = a soil map unit was found and read. out\_of\_coverage = USDA publishes no soil map unit here (NOT a finding of "no limitations"). invalid\_input = the coordinate was rejected before any request. source\_error = USDA could not be read for this site, so every soil field is null rather than negative. |
| `lookup_error` | string | Why this row is not a complete answer: the out-of-coverage explanation, the input rejection reason, the upstream error, or a PARTIAL note naming which SSURGO tables did not answer. Null on a clean, complete row. |
| `mapunit_status` | string | Whether the SSURGO mapunit table answered for this site: ok, unavailable, or not\_applicable. |
| `component_status` | string | Whether the SSURGO component table answered. When this is not ok, every component, hydric, drainage and slope field on this row is null - not negative. |
| `interpretation_status` | string | Whether the SSURGO cointerp table answered. When this is not ok, every septic, foundation, road and solar rating on this row is null - never "Not limited". |
| `legend_status` | string | Whether the SSURGO legend and survey-area catalog answered for this site. |
| `sources_ok_count` | integer | How many of the four SSURGO tables answered for this site. |
| `sources_total_count` | integer | How many SSURGO tables this row depends on. Always 4. |
| `data_complete` | boolean | True only when all four SSURGO tables answered. False means at least one block of fields on this row is null because it was never checked. |
| `mukey` | string | SSURGO map unit key (mukey) for the polygon containing this coordinate. The join key for any further SSURGO work. |
| `musym` | string | Map unit symbol as printed on the published soil survey sheet for this survey area. |
| `national_musym` | string | National map unit symbol, stable across survey areas. |
| `map_unit_name` | string | Full SSURGO map unit name, e.g. "Hayden loam, 2 to 6 percent slopes". |
| `map_unit_kind` | string | Consociation, Complex, Association or Undifferentiated group. A Complex or Association means the map unit is deliberately a mixture of soils, so the minority components matter more. |
| `map_unit_acres` | number | Total acreage of this map unit across the survey area (not the acreage of your parcel). |
| `map_unit_investigation_intensity` | string | NRCS order of the soil survey that produced this map unit. Order 2 is the standard county-level intensity; a coarser order means broader map units and more inclusion risk. |
| `map_unit_interp_focus` | string | The land use this map unit was interpreted for, where NRCS populates it. |
| `iowa_corn_suitability_rating` | number | Iowa CSR productivity index. Populated only in Iowa; null everywhere else because NRCS does not publish it, not because productivity is zero. |
| `survey_area_symbol` | string | SSURGO soil survey area code, e.g. IA169. |
| `survey_area_name` | string | Name of the soil survey area, usually a county. |
| `survey_area_type` | string | Whether the survey area is an MLRA or a non-MLRA soil survey area. |
| `survey_map_scale` | integer | Denominator of the original mapping scale. 15840 means 1:15,840 - roughly 4 inches to the mile. A coarser scale means bigger minimum-size delineations and more unmapped inclusions. |
| `survey_data_version` | string | NRCS version number of this survey area, incremented at each refresh. |
| `survey_data_refreshed` | string | Date this survey area was last refreshed by NRCS (ISO). Null when NRCS did not publish one, never today. |
| `survey_data_age_days` | integer | Days between this survey area last being refreshed and this run. NRCS refreshes SSURGO annually. |
| `farmland_class` | string | The SSURGO farmlndcl value exactly as NRCS publishes it. Most values are CONDITIONAL, e.g. "Prime farmland if drained". |
| `farmland_category` | string | Normalised category: prime, prime\_if\_conditional, statewide\_importance, local\_importance, unique\_importance, or not\_prime. Null when NRCS did not populate a class or published one this build does not recognise. |
| `farmland_condition` | string | The condition attached to a conditional class, e.g. "drained" or "irrigated and drained". This is what an FPPA reviewer needs and what a plain prime/not-prime flag destroys. |
| `prime_farmland` | boolean | True only for "All areas are prime farmland". A conditional class is FALSE here and true in prime\_farmland\_possible, because a wet field is not prime farmland until it is drained. Null when NRCS published no class. |
| `prime_farmland_possible` | boolean | True when the map unit is prime farmland either outright or once its stated condition is met. Use with farmland\_condition for FPPA (7 CFR 658) screening. |
| `farmland_class_recognized` | boolean | False when SSURGO published a farmland class this build does not know how to interpret; the raw text is still in farmland\_class and every derived flag is null rather than guessed. |
| `component_count` | integer | How many soil components SSURGO documents for this map unit. More than one means the dominant soil is not the whole story. |
| `components_percent_sum` | number | Sum of comppct\_r across the documented components. SSURGO does NOT require this to reach 100. |
| `components_percent_undocumented` | number | The share of the map unit SSURGO does not describe at all (100 minus the documented sum). Measured up to 15% on real map units; an unmapped inclusion in that residue can still be hydric, so it is published rather than assumed away. |
| `dominant_component_name` | string | Name of the highest-percentage soil component in this map unit. |
| `dominant_component_percent` | number | Representative percentage of the map unit occupied by the dominant component. |
| `dominant_component_kind` | string | Series, Taxadjunct, Miscellaneous area, Family and so on. A "Miscellaneous area" such as Urban land or Water carries no drainage class or hydrologic group by design. |
| `major_component_names` | string | Semicolon-separated names of the components NRCS flags as major for this map unit. |
| `dominant_hydric_rating` | string | The raw SSURGO hydricrating of the dominant component: Yes, No or Unranked. |
| `dominant_component_is_hydric` | boolean | True/false for the dominant component only. NULL when its rating is Unranked or absent - Unranked means NRCS did not rate it, not that it is upland. |
| `any_component_hydric` | boolean | THE field a wetland delineator wants: true when ANY component of the map unit is hydric, including a 5% minority. Null when no component carries a rating. A dominant-component-only report answers "no" here and is wrong. |
| `hydric_component_percent` | number | Sum of comppct\_r across every hydric component. 5 means 5% of this map unit is hydric soil. |
| `hydric_component_names` | string | Each hydric component with its share, e.g. "Glencoe (5%)". |
| `hydric_component_count` | integer | How many components are rated hydric. Null when nothing was rated. |
| `hydric_unranked_component_count` | integer | How many components carry no usable hydric rating. A high count means the hydric picture for this map unit is incomplete. |
| `map_unit_hydric_class` | string | all hydric, partially hydric, or not hydric, following the NRCS hydric-soils convention. Null when no component was rated. |
| `hydric_rating_vocabulary_unknown` | string | Any hydricrating value SSURGO returned that is outside the known Yes/No/Unranked vocabulary. Such a value is reported here and excluded from every derived flag rather than guessed. Null on normal data. |
| `dominant_drainage_class` | string | NRCS natural drainage class of the dominant component. Null on a Miscellaneous area such as Urban land or Water, which NRCS does not assign one. |
| `wettest_drainage_class` | string | The wettest natural drainage class found on ANY component of the map unit - the one that governs a septic or basement decision. |
| `drainage_classes_present` | string | Every distinct drainage class across the components, semicolon separated. |
| `poorly_drained_component_percent` | number | Share of the map unit whose drainage class is Somewhat poorly drained or wetter. Null when no component carries a drainage class. |
| `drainage_vocabulary_unknown` | string | Any drainage class SSURGO returned outside the known eight. Reported rather than scored. Null on normal data. |
| `dominant_slope_percent_representative` | number | Representative slope of the dominant component, in percent. |
| `dominant_slope_percent_low` | number | Low end of the slope range for the dominant component. |
| `dominant_slope_percent_high` | number | High end of the slope range for the dominant component. |
| `slope_percent_min` | number | Lowest representative slope across all components. |
| `slope_percent_max_representative` | number | Highest representative slope across all components. |
| `slope_percent_max_high` | number | Highest slope\_h across all components - the steepest slope SSURGO allows anywhere in this map unit. |
| `slope_percent_weighted_mean` | number | Component-percentage-weighted mean of the representative slopes. |
| `dominant_hydrologic_soil_group` | string | NRCS hydrologic soil group (A/B/C/D, or a dual group such as C/D) of the dominant component - the runoff curve-number input for stormwater design. Null on a Miscellaneous area. |
| `hydrologic_soil_groups_present` | string | Every distinct hydrologic soil group across the components. |
| `dominant_taxonomic_class` | string | Full USDA soil taxonomy family of the dominant component. |
| `dominant_frost_action` | string | Potential frost action of the dominant component (Low/Moderate/High) - a pavement and shallow-foundation input. |
| `dominant_corrosion_concrete` | string | Risk of corrosion to uncoated concrete for the dominant component. |
| `dominant_corrosion_steel` | string | Risk of corrosion to uncoated steel for the dominant component - the driver behind solar soil-anchor limitations. |
| `dominant_runoff_class` | string | Surface runoff class of the dominant component, where NRCS populates it. |
| `dominant_nonirrigated_capability_class` | string | USDA non-irrigated land capability class (1-8) of the dominant component. |
| `dominant_soil_slip_potential` | string | Soil slip potential of the dominant component, where NRCS populates it. |
| `dominant_geomorphic_description` | string | Landform description of the dominant component, e.g. "till plains". |
| `dominant_elevation_m` | number | Representative elevation of the dominant component in metres. |
| `dominant_wind_erodibility_group` | string | Wind erodibility group of the dominant component. |
| `dominant_erosion_class` | string | Erosion class of the dominant component, where NRCS populates it. |
| `components_json` | string | JSON array of every component with all 36 fetched SSURGO attributes - percentages, hydric rating, drainage, slope range, hydrologic group, taxonomy, corrosivity, capability class, wind erodibility, landform. Null when component detail is switched off or the component table did not answer. |
| `interpretations_json` | string | JSON object keyed by interpretation, carrying the NRCS rule name, the dominant fuzzy rating value, every limiting reason with its value, and any sub-rules NRCS could not evaluate. Null when detail is switched off or nothing was rated. |
| `drift_gate_status` | string | passed or passed\_with\_warnings. The run fails and bills nothing if the live drift gate does not pass, so this is never a failure value on an emitted row. |
| `drift_gate_warnings` | string | Any non-fatal drift observation from this run. Null when everything measured cleanly. |
| `ssurgo_newest_survey_refresh` | string | The most recent survey-area refresh date anywhere in SSURGO, measured live on this run - the freshness of the database as a whole. |
| `ssurgo_survey_area_count` | integer | How many soil survey areas SSURGO published at run time, measured live. A collapse here would mean a truncated catalog. |
| `septic_tank_absorption_fields_rating_dominant` | string | NRCS interpretation "ENG - Septic Tank Absorption Fields": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `septic_tank_absorption_fields_reasons_dominant` | string | NRCS interpretation "ENG - Septic Tank Absorption Fields": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `septic_tank_absorption_fields_rating_worst` | string | NRCS interpretation "ENG - Septic Tank Absorption Fields": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `septic_tank_absorption_fields_worst_component` | string | NRCS interpretation "ENG - Septic Tank Absorption Fields": The soil component that produced the most limiting rating. |
| `septic_tank_absorption_fields_percent_very_limited` | number | NRCS interpretation "ENG - Septic Tank Absorption Fields": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `septic_tank_absorption_fields_percent_rated` | number | NRCS interpretation "ENG - Septic Tank Absorption Fields": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `septic_tank_absorption_fields_reasons_any` | string | NRCS interpretation "ENG - Septic Tank Absorption Fields": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `septic_tank_absorption_fields_status` | string | NRCS interpretation "ENG - Septic Tank Absorption Fields": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `dwellings_with_basements_rating_dominant` | string | NRCS interpretation "ENG - Dwellings With Basements": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `dwellings_with_basements_reasons_dominant` | string | NRCS interpretation "ENG - Dwellings With Basements": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `dwellings_with_basements_rating_worst` | string | NRCS interpretation "ENG - Dwellings With Basements": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `dwellings_with_basements_worst_component` | string | NRCS interpretation "ENG - Dwellings With Basements": The soil component that produced the most limiting rating. |
| `dwellings_with_basements_percent_very_limited` | number | NRCS interpretation "ENG - Dwellings With Basements": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `dwellings_with_basements_percent_rated` | number | NRCS interpretation "ENG - Dwellings With Basements": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `dwellings_with_basements_reasons_any` | string | NRCS interpretation "ENG - Dwellings With Basements": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `dwellings_with_basements_status` | string | NRCS interpretation "ENG - Dwellings With Basements": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `dwellings_without_basements_rating_dominant` | string | NRCS interpretation "ENG - Dwellings W/O Basements": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `dwellings_without_basements_reasons_dominant` | string | NRCS interpretation "ENG - Dwellings W/O Basements": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `dwellings_without_basements_rating_worst` | string | NRCS interpretation "ENG - Dwellings W/O Basements": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `dwellings_without_basements_worst_component` | string | NRCS interpretation "ENG - Dwellings W/O Basements": The soil component that produced the most limiting rating. |
| `dwellings_without_basements_percent_very_limited` | number | NRCS interpretation "ENG - Dwellings W/O Basements": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `dwellings_without_basements_percent_rated` | number | NRCS interpretation "ENG - Dwellings W/O Basements": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `dwellings_without_basements_reasons_any` | string | NRCS interpretation "ENG - Dwellings W/O Basements": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `dwellings_without_basements_status` | string | NRCS interpretation "ENG - Dwellings W/O Basements": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `small_commercial_buildings_rating_dominant` | string | NRCS interpretation "ENG - Small Commercial Buildings": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `small_commercial_buildings_reasons_dominant` | string | NRCS interpretation "ENG - Small Commercial Buildings": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `small_commercial_buildings_rating_worst` | string | NRCS interpretation "ENG - Small Commercial Buildings": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `small_commercial_buildings_worst_component` | string | NRCS interpretation "ENG - Small Commercial Buildings": The soil component that produced the most limiting rating. |
| `small_commercial_buildings_percent_very_limited` | number | NRCS interpretation "ENG - Small Commercial Buildings": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `small_commercial_buildings_percent_rated` | number | NRCS interpretation "ENG - Small Commercial Buildings": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `small_commercial_buildings_reasons_any` | string | NRCS interpretation "ENG - Small Commercial Buildings": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `small_commercial_buildings_status` | string | NRCS interpretation "ENG - Small Commercial Buildings": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `local_roads_and_streets_rating_dominant` | string | NRCS interpretation "ENG - Local Roads and Streets": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `local_roads_and_streets_reasons_dominant` | string | NRCS interpretation "ENG - Local Roads and Streets": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `local_roads_and_streets_rating_worst` | string | NRCS interpretation "ENG - Local Roads and Streets": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `local_roads_and_streets_worst_component` | string | NRCS interpretation "ENG - Local Roads and Streets": The soil component that produced the most limiting rating. |
| `local_roads_and_streets_percent_very_limited` | number | NRCS interpretation "ENG - Local Roads and Streets": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `local_roads_and_streets_percent_rated` | number | NRCS interpretation "ENG - Local Roads and Streets": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `local_roads_and_streets_reasons_any` | string | NRCS interpretation "ENG - Local Roads and Streets": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `local_roads_and_streets_status` | string | NRCS interpretation "ENG - Local Roads and Streets": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `shallow_excavations_rating_dominant` | string | NRCS interpretation "ENG - Shallow Excavations": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `shallow_excavations_reasons_dominant` | string | NRCS interpretation "ENG - Shallow Excavations": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `shallow_excavations_rating_worst` | string | NRCS interpretation "ENG - Shallow Excavations": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `shallow_excavations_worst_component` | string | NRCS interpretation "ENG - Shallow Excavations": The soil component that produced the most limiting rating. |
| `shallow_excavations_percent_very_limited` | number | NRCS interpretation "ENG - Shallow Excavations": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `shallow_excavations_percent_rated` | number | NRCS interpretation "ENG - Shallow Excavations": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `shallow_excavations_reasons_any` | string | NRCS interpretation "ENG - Shallow Excavations": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `shallow_excavations_status` | string | NRCS interpretation "ENG - Shallow Excavations": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `solar_arrays_ballast_anchor_rating_dominant` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `solar_arrays_ballast_anchor_reasons_dominant` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `solar_arrays_ballast_anchor_rating_worst` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `solar_arrays_ballast_anchor_worst_component` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": The soil component that produced the most limiting rating. |
| `solar_arrays_ballast_anchor_percent_very_limited` | number | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `solar_arrays_ballast_anchor_percent_rated` | number | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `solar_arrays_ballast_anchor_reasons_any` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `solar_arrays_ballast_anchor_status` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Ballast Anchor Systems": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |
| `solar_arrays_soil_anchor_rating_dominant` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": NRCS limitation class for the DOMINANT component of the map unit: Not limited, Somewhat limited, Very limited, or Not rated. NULL when the interpretation table did not answer - never "Not limited". |
| `solar_arrays_soil_anchor_reasons_dominant` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": The specific reasons behind the dominant component rating, each with its NRCS fuzzy value, e.g. "Depth to saturated zone (1.00); Slow water movement (1.00)". This is what makes the rating actionable. Null when the rating carries no contributing reason. |
| `solar_arrays_soil_anchor_rating_worst` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": The most limiting class found on ANY component, including a small minority one. Where this is worse than the dominant rating, part of the parcel is worse than the headline soil suggests. "Not rated" never counts as a severity. |
| `solar_arrays_soil_anchor_worst_component` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": The soil component that produced the most limiting rating. |
| `solar_arrays_soil_anchor_percent_very_limited` | number | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": Share of the map unit whose components are rated Very limited for this use. Null when nothing was rated - never 0. |
| `solar_arrays_soil_anchor_percent_rated` | number | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": Share of the map unit NRCS actually rated for this use. A low value means the rating covers only part of the map unit. |
| `solar_arrays_soil_anchor_reasons_any` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": Union of the limiting reasons across every component, highest fuzzy value first. Reasons that appear here but not in the dominant list come from minority components. |
| `solar_arrays_soil_anchor_status` | string | NRCS interpretation "ENG - Ground-based Solar Arrays, Soil-based Anchor Systems": ok = at least one component was rated. not\_rated = NRCS returned the interpretation but rated nothing. no\_data = SSURGO publishes no rows for this interpretation here. unavailable = the interpretation table did not answer, so every rating on this row is null rather than negative. |

# Actor input Schema

## `assets` (type: `array`):

Coordinates to look up in the USDA NRCS SSURGO soil survey. Each item is an object: {"lat": \<number -90..90>, "lon": \<number -180..180>, "label": "<your name for the site>"}. One site produces exactly one billable dataset row. A coordinate USDA has not soil-mapped (open water, or an unsurveyed area) returns lookup\_status="out\_of\_coverage" with every soil, hydric and suitability field NULL - that is an explicit 'not evaluated', never a finding of 'no limitations'.

## `interpretations` (type: `array`):

Which NRCS engineering interpretations to rate each site against. LEAVE EMPTY for all eight, which is the safe superset - this field is deliberately given no schema default, because an input-schema default is injected server-side into every run and would narrow the query of a caller who never asked for it. Each selected interpretation adds eight columns: the dominant-component rating, its limiting reasons, the most-limiting rating across ANY component, which component that is, the percent of the map unit rated Very limited, the percent actually rated, the union of limiting reasons, and a per-interpretation status.

## `includeComponentDetail` (type: `boolean`):

When true (the default), each row also carries components\_json - every soil component of the map unit with all 36 fetched SSURGO attributes - and interpretations\_json, which adds the NRCS fuzzy rating value and any sub-rules NRCS could not evaluate. Turn this off for a slimmer CSV; it does not change the number of billable rows or any flat column.

## `maxAssets` (type: `integer`):

Safety cap on how many sites this run will screen. Sites beyond the cap are skipped with a warning and are not billed.

## `simulateOutage` (type: `string`):

Diagnostic only - leave as "none" for real screening. "sda" makes the actor treat USDA Soil Data Access as unreachable without contacting it, so you can prove for yourself that an outage produces a loud FAILED run with zero rows and zero billable events rather than a quiet page of 'no limitations found'. It never fabricates data.

## Actor input object example

```json
{
  "assets": [
    {
      "lat": 42.110415,
      "lon": -93.560137,
      "label": "Story County IA parcel - dominant soil NOT hydric, 5% hydric inclusion"
    },
    {
      "lat": 42.45,
      "lon": -93.55,
      "label": "Hamilton County IA parcel - prime farmland if drained, all-hydric map unit"
    },
    {
      "lat": 34.929063,
      "lon": -77.345001,
      "label": "Onslow County NC parcel - well-drained sand, best-case septic"
    },
    {
      "lat": 30.84231,
      "lon": -97.29329,
      "label": "Bell County TX parcel - shrink-swell clay, foundation risk"
    },
    {
      "lat": 39.7392,
      "lon": -104.9903,
      "label": "Denver CO infill site - urban land complex"
    },
    {
      "lat": 61.566941,
      "lon": -150.422585,
      "label": "Matanuska-Susitna AK parcel - slope stability, 4% hydric depressions"
    }
  ],
  "interpretations": [
    "septic_tank_absorption_fields",
    "dwellings_with_basements",
    "dwellings_without_basements",
    "small_commercial_buildings",
    "local_roads_and_streets",
    "shallow_excavations",
    "solar_arrays_ballast_anchor",
    "solar_arrays_soil_anchor"
  ],
  "includeComponentDetail": true,
  "maxAssets": 2000,
  "simulateOutage": "none"
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "assets": [
        {
            "lat": 42.110415,
            "lon": -93.560137,
            "label": "Story County IA parcel - dominant soil NOT hydric, 5% hydric inclusion"
        },
        {
            "lat": 42.45,
            "lon": -93.55,
            "label": "Hamilton County IA parcel - prime farmland if drained, all-hydric map unit"
        },
        {
            "lat": 34.929063,
            "lon": -77.345001,
            "label": "Onslow County NC parcel - well-drained sand, best-case septic"
        },
        {
            "lat": 30.84231,
            "lon": -97.29329,
            "label": "Bell County TX parcel - shrink-swell clay, foundation risk"
        },
        {
            "lat": 39.7392,
            "lon": -104.9903,
            "label": "Denver CO infill site - urban land complex"
        },
        {
            "lat": 61.566941,
            "lon": -150.422585,
            "label": "Matanuska-Susitna AK parcel - slope stability, 4% hydric depressions"
        }
    ],
    "interpretations": [
        "septic_tank_absorption_fields",
        "dwellings_with_basements",
        "dwellings_without_basements",
        "small_commercial_buildings",
        "local_roads_and_streets",
        "shallow_excavations",
        "solar_arrays_ballast_anchor",
        "solar_arrays_soil_anchor"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/ssurgo-soil-suitability-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "assets": [
        {
            "lat": 42.110415,
            "lon": -93.560137,
            "label": "Story County IA parcel - dominant soil NOT hydric, 5% hydric inclusion",
        },
        {
            "lat": 42.45,
            "lon": -93.55,
            "label": "Hamilton County IA parcel - prime farmland if drained, all-hydric map unit",
        },
        {
            "lat": 34.929063,
            "lon": -77.345001,
            "label": "Onslow County NC parcel - well-drained sand, best-case septic",
        },
        {
            "lat": 30.84231,
            "lon": -97.29329,
            "label": "Bell County TX parcel - shrink-swell clay, foundation risk",
        },
        {
            "lat": 39.7392,
            "lon": -104.9903,
            "label": "Denver CO infill site - urban land complex",
        },
        {
            "lat": 61.566941,
            "lon": -150.422585,
            "label": "Matanuska-Susitna AK parcel - slope stability, 4% hydric depressions",
        },
    ],
    "interpretations": [
        "septic_tank_absorption_fields",
        "dwellings_with_basements",
        "dwellings_without_basements",
        "small_commercial_buildings",
        "local_roads_and_streets",
        "shallow_excavations",
        "solar_arrays_ballast_anchor",
        "solar_arrays_soil_anchor",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/ssurgo-soil-suitability-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "assets": [
    {
      "lat": 42.110415,
      "lon": -93.560137,
      "label": "Story County IA parcel - dominant soil NOT hydric, 5% hydric inclusion"
    },
    {
      "lat": 42.45,
      "lon": -93.55,
      "label": "Hamilton County IA parcel - prime farmland if drained, all-hydric map unit"
    },
    {
      "lat": 34.929063,
      "lon": -77.345001,
      "label": "Onslow County NC parcel - well-drained sand, best-case septic"
    },
    {
      "lat": 30.84231,
      "lon": -97.29329,
      "label": "Bell County TX parcel - shrink-swell clay, foundation risk"
    },
    {
      "lat": 39.7392,
      "lon": -104.9903,
      "label": "Denver CO infill site - urban land complex"
    },
    {
      "lat": 61.566941,
      "lon": -150.422585,
      "label": "Matanuska-Susitna AK parcel - slope stability, 4% hydric depressions"
    }
  ],
  "interpretations": [
    "septic_tank_absorption_fields",
    "dwellings_with_basements",
    "dwellings_without_basements",
    "small_commercial_buildings",
    "local_roads_and_streets",
    "shallow_excavations",
    "solar_arrays_ballast_anchor",
    "solar_arrays_soil_anchor"
  ]
}' |
apify call malonestar/ssurgo-soil-suitability-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,malonestar/ssurgo-soil-suitability-screener"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gVbcoN0RlX2Nh7G4u/builds/9GzurE9TZAoYIgRYy/openapi.json
