# Precip AI - Hyperlocal Weather Data API — Orthogonal API

> Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance.
> Base API: `https://api.orth.sh/v1/run` · [llms.txt](https://orthogonal.com/llms.txt) · [browse all APIs](https://orthogonal.com/discover)

Precip offers highly accurate, site-specific rainfall accumulation data. 

**Verified:** yes

## Access

**Run API:** `POST https://api.orth.sh/v1/run`
**Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY`
Get an API key at https://orthogonal.com/dashboard/settings/api-keys

Every call goes through the unified Run API: send the API `slug`, the endpoint `path`, and the `query`/`body` parameters. The response is `{ "success": true, "price": "<usd>", "data": { ... } }`.

## Endpoints

### Last 48 Hours Precipitation Data

Total precipitation in the last 48 hours for the given location(s).

`GET /api/v1/last-48`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/precipitation-data#last-48-hours-precipitation-data

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `longitude` | string | Yes |  |
| `latitude` | string | Yes |  |
| `timeZoneId` | string | No |  |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/last-48","method":"GET","query":{"longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Air Temperature

Hourly near-surface air temperature in Celsius (°C)

`GET /api/v1/temperature-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#air-temperature

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/temperature-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Hourly Soil Moisture

Hourly soil moisture percentage relative to holding capacity at 0-10cm depth

`GET /api/v1/soil-moisture-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/soil-data#hourly-soil-moisture

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes |  |
| `latitude` | string | Yes |  |
| `timeZoneId` | string | No |  |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/soil-moisture-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Wind Direction

Hourly wind direction in compass degrees (0-360)

`GET /api/v1/wind-direction-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#wind-direction

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/wind-direction-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Daily Precipitation Data

Returns comprehensive daily precipitation data for the given time range and location(s). Each day includes precipitation amount, type (rain/snow/mixed), probability (for forecasts), and data source. Seamlessly combines historical observations with forecast data depending on the requested time range.

`GET /api/v1/daily`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/precipitation-data#daily-precipitation-data

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes |  |
| `latitude` | string | Yes |  |
| `timeZoneId` | string | No |  |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/daily","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Wind Gusts

Hourly wind gust speed in meters per second (m/s)

`GET /api/v1/wind-speed-gust-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#wind-gusts

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/wind-speed-gust-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Recent Rain Event

Returns detailed information about the most recent precipitation event for the given location(s), including total amounts, precipitation type (rain/snow), timing, and how long ago it occurred. A rain event is defined as more than 1/10 inch (2.5mm) of precipitation with less than a 24-hour gap between occurrences.

`GET /api/v1/recent-rain`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/precipitation-data#recent-rain-event

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `longitude` | string | Yes |  |
| `latitude` | string | Yes |  |
| `timeZoneId` | string | No |  |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/recent-rain","method":"GET","query":{"longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Map Layer Tiles

Map tiles compatible with most web mapping or GIS tools. Software such as Mapbox, Google Maps, ArcGIS, Leaflet, OpenLayers or QGIS will require an `x/y/z` url eg `https://api.precip.ai/api/v1/map/last-48/ImageServer/tile/{z}/{y}/{x}`. See the examples for more details.

`GET /api/v1/map/{serviceName}/ImageServer/tile/{z}/{y}/{x}`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/map-services#map-layer-tiles

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `serviceName` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `z` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `y` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `x` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `time` | string | No |  |

```bash
# Replace {serviceName}, {z}, {y}, {x} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/map/{serviceName}/ImageServer/tile/{z}/{y}/{x}","method":"GET","query":{"time":"<string>"}}'
```

### Wind Speed

Hourly near-surface wind speed in meters per second (m/s)

`GET /api/v1/wind-speed-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#wind-speed

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/wind-speed-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Cloud Cover

Hourly cloud cover fraction (0-1, where 0 is clear and 1 is overcast)

`GET /api/v1/cloud-cover-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#cloud-cover

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/cloud-cover-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Soil Temperature

Hourly soil temperature data at 0-10cm depth in Celsius (°C)

`GET /api/v1/temp-0-10cm-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/soil-data#soil-temperature

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/temp-0-10cm-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Specific Humidity

Hourly specific humidity (kg/kg)

`GET /api/v1/specific-humidity-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#specific-humidity

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/specific-humidity-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Hourly Precipitation Data

Returns comprehensive hourly precipitation data for the given time range and location(s). Each hour includes precipitation amount, type (rain/snow/mixed), probability (for forecasts), and data source. Seamlessly combines historical observations with forecast data depending on the requested time range.

`GET /api/v1/hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/precipitation-data#hourly-precipitation-data

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes |  |
| `latitude` | string | Yes |  |
| `timeZoneId` | string | No |  |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Daily Soil Moisture

Daily soil moisture percentage relative to holding capacity at 0-10cm depth

`GET /api/v1/soil-moisture-daily`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/soil-data#daily-soil-moisture

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes |  |
| `latitude` | string | Yes |  |
| `timeZoneId` | string | No |  |
| `format` | string | No |  |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/soil-moisture-daily","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Embeddable HTML UI

Returns a complete, HTML page displaying comprehensive weather data for a specific location. See the examples page for more details. 

 Authorization headers set automatically from query parameters on this endpoint. 

`GET /embed/location`

**Estimated cost:** $0.1

**Docs:** https://api-docs.precip.ai/api/embed-widgets#embeddable-html-ui

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `lat` | number | Yes | Latitude coordinate (-90 to 90) for the location center of the precipitation widget |
| `lon` | number | Yes | Longitude coordinate (-180 to 180) for the location center of the precipitation widget |
| `apiKey` | string | Yes | Your API key for authentication. Gets automatically applied as header. |
| `units` | string | No | Unit system for displaying precipitation amounts and temperatures. 'metric' shows mm and °C, 'imperial' shows inches and °F. |
| `widgets` | string | No | Comma-separated list of widget keys to display.  Available options: `current`, `event`, `calendar`, `cumulative`, `total`, `precip`, `table`, `wind`, `temp`, `soiltemp`, `soilmoisture`, `snow`  When not provided, shows all widgets. |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/embed/location","method":"GET","query":{"lat":"<number>","lon":"<number>","apiKey":"<string>","units":"<string>","widgets":"<string>"}}'
```

### Solar Radiation

Hourly downward short-wave radiation flux in watts per square meter (W/m²)

`GET /api/v1/solar-radiation-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#solar-radiation

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/solar-radiation-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

### Relative Humidity

Hourly relative humidity as a percentage (0-100%)

`GET /api/v1/relative-humidity-hourly`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://api-docs.precip.ai/api/atmospheric-data#relative-humidity

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `start` | string | Yes |  |
| `end` | string | Yes |  |
| `longitude` | string | Yes | Comma-separated list of longitude coordinates (WGS84) |
| `latitude` | string | Yes | Comma-separated list of latitude coordinates (WGS84) |
| `timeZoneId` | string | No | IANA timezone identifier for localizing timestamps |
| `format` | string | No | Output format: `geojson`, `json` or `csv` |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"precip","path":"/api/v1/relative-humidity-hourly","method":"GET","query":{"start":"<string>","end":"<string>","longitude":"<string>","latitude":"<string>","timeZoneId":"<string>","format":"<string>"}}'
```

---

Full details and an interactive quickstart: https://orthogonal.com/discover/precip
