Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/swathapi-com:swathapi-com-swaths-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Swaths API
version: '1.0'
description: 'Verified severe-weather intelligence. Swath detects hail storms from live NEXRAD/MRMS radar and damaging-wind events from measured NWS storm reports, builds verified damage swath polygons, and joins them against parcel data to answer: which properties were hit, and how hard. Authentication: every /v1 endpoint takes `Authorization: Bearer sk_...`. Self-serve keys via POST /v1/signup (free tier: 2 trial credits, 60 requests/min — paid plans from $35/mo). Credit costs per successful call: Swath Report (GET /v1/swaths/{id}/properties) = 1 credit per property returned plus 25 credits per record fetched fresh from the parcel vendor, 10-credit minimum; report quote (GET /v1/swaths/{id}/properties/quote) = 1 credit; property lookup (GET /v1/property) = 2 credits; billing endpoints = 0; everything else = 1 credit. Failed requests are never billed. Paid plans: developer (40,000 credits/mo) and scale (600,000 credits/mo) via POST /v1/billing/checkout.'
servers:
- url: https://swathapi.com
security:
- ApiKeyAuth: []
tags:
- name: Swaths
paths:
/v1/swaths/geometry:
get:
operationId: swath_geometry_in_bbox
summary: Verified storm footprints in a viewport as a GeoJSON FeatureCollection
description: Every verified swath polygon intersecting the bbox, newest first, simplified for map display (~100 m tolerance by default). Properties carry storm id, type, verified time, peak hail size and peak wind. Built for drawing a storm layer under a canvassing map. Costs 1 credit.
parameters:
- name: bbox
in: query
required: true
schema:
type: string
description: '"west,south,east,north" in WGS84 degrees; at most 20 degrees on a side'
- name: since
in: query
required: false
schema:
type: string
description: ISO 8601; only storms verified at or after this time
- name: type
in: query
required: false
schema:
type: string
enum:
- hail
- wind
- name: limit
in: query
required: false
schema:
type: integer
default: 200
maximum: 500
- name: simplify
in: query
required: false
schema:
type: number
default: 0.001
description: Simplification tolerance in degrees; 0 = full resolution
responses:
'200':
description: GeoJSON FeatureCollection
content:
application/json:
schema:
type: object
properties:
type:
type: string
enum:
- FeatureCollection
features:
type: array
items:
type: object
properties:
type:
type: string
id:
type: string
geometry:
type: object
properties:
type: object
properties:
swath_id:
type: string
storm_id:
type: string
type:
type: string
county:
type: string
nullable: true
verified_at:
type: string
last_seen_at:
type: string
mesh_max_in:
type: number
nullable: true
wind_max_mph:
type: number
nullable: true
area_km2:
type: number
nullable: true
link:
type: string
count:
type: integer
truncated:
type: boolean
tags:
- Swaths
/v1/swaths/{id}:
get:
operationId: get_swath
summary: Get one swath summary by swath id (swath_...) or storm id (sw_...)
description: Costs 1 credit.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Swath id (swath_...) or its storm id (sw_...) — both work
responses:
'200':
description: Swath summary
content:
application/json:
schema:
$ref: '#/components/schemas/SwathDetail'
'401':
description: 'Missing, invalid, or revoked API key. Fix: pass Authorization: Bearer sk_... (get a key at /v1/signup).'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Monthly credit limit reached (code credits_exhausted). Fix: upgrade via POST /v1/billing/checkout or wait for the monthly reset.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such swath
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Per-minute rate limit for the plan exceeded (code rate_limited). Retry after a short wait.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Swaths
/v1/swaths/{id}/geometry:
get:
operationId: get_swath_geometry
summary: Get the swath damage footprint as a GeoJSON Feature (MultiPolygon)
description: Costs 1 credit. Geometry can be large for big storms.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Swath id (swath_...) or storm id (sw_...)
responses:
'200':
description: GeoJSON Feature with the swath polygon
content:
application/json:
schema:
$ref: '#/components/schemas/SwathGeometryFeature'
'401':
description: 'Missing, invalid, or revoked API key. Fix: pass Authorization: Bearer sk_... (get a key at /v1/signup).'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Monthly credit limit reached (code credits_exhausted). Fix: upgrade via POST /v1/billing/checkout or wait for the monthly reset.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such swath
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Per-minute rate limit for the plan exceeded (code rate_limited). Retry after a short wait.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Swaths
/v1/swaths/{id}/properties:
get:
operationId: get_swath_report
summary: 'Swath Report: affected properties inside a swath with per-property hail size…'
description: Properties in a swath with exposure.hail_in and exposure.score (0-1), sorted by score then value. Bills 1 credit per property returned +25 per fresh-fetched record (10 min) — preview via the quote endpoint. Free plan is cached-only (coverage.vendor_fetch = "skipped_free_plan").
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Swath id (swath_...) or storm id (sw_...)
- name: roof_age_min
in: query
required: false
schema:
type: number
description: Minimum estimated roof age in years
- name: roof_material
in: query
required: false
schema:
type: string
description: Exact roof material match, e.g. asphalt_shingle
- name: owner_occupied
in: query
required: false
schema:
type: boolean
description: true = owner-occupied only, false = non-owner-occupied only
- name: year_built_before
in: query
required: false
schema:
type: number
description: Built strictly before this year
- name: year_built_after
in: query
required: false
schema:
type: number
description: Built strictly after this year
- name: value_min
in: query
required: false
schema:
type: number
description: Minimum assessed value (USD)
- name: value_max
in: query
required: false
schema:
type: number
description: Maximum assessed value (USD)
- name: min_exposure_score
in: query
required: false
schema:
type: number
description: Minimum exposure score, 0 to 1
- name: limit
in: query
required: false
schema:
type: integer
default: 100
maximum: 1000
description: Page size (default 100, cap 1000)
- name: offset
in: query
required: false
schema:
type: integer
default: 0
description: Pagination offset
- name: format
in: query
required: false
schema:
type: string
enum:
- json
- csv
default: json
description: csv returns the same properties as a downloadable spreadsheet (address, roof age, owner-occupied, value, hail in, score) for CRM/canvassing import. Billing identical.
responses:
'200':
description: Report with matched properties
content:
application/json:
schema:
$ref: '#/components/schemas/SwathReport'
'400':
description: A filter parameter is not a number
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: 'Missing, invalid, or revoked API key. Fix: pass Authorization: Bearer sk_... (get a key at /v1/signup).'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Monthly credit limit reached (code credits_exhausted). Fix: upgrade via POST /v1/billing/checkout or wait for the monthly reset.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such swath
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Per-minute rate limit for the plan exceeded (code rate_limited). Retry after a short wait.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Swaths
/v1/swaths/{id}/properties/quote:
get:
operationId: get_report_quote
summary: 'Cost preview for the Swath Report: filtered cached-property count and…'
description: Runs the report's filtered COUNT over cached parcels (1 credit, no property rows). Returns total_cached, whether fresh vendor fetches are possible, and a clearly-labeled fresh_estimate (null when no basis). Billing of the real report always uses actual counts.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Swath id (swath_...) or storm id (sw_...)
- name: roof_age_min
in: query
required: false
schema:
type: number
description: Minimum estimated roof age in years
- name: roof_material
in: query
required: false
schema:
type: string
description: Exact roof material match, e.g. asphalt_shingle
- name: owner_occupied
in: query
required: false
schema:
type: boolean
description: true = owner-occupied only, false = non-owner-occupied only
- name: year_built_before
in: query
required: false
schema:
type: number
description: Built strictly before this year
- name: year_built_after
in: query
required: false
schema:
type: number
description: Built strictly after this year
- name: value_min
in: query
required: false
schema:
type: number
description: Minimum assessed value (USD)
- name: value_max
in: query
required: false
schema:
type: number
description: Maximum assessed value (USD)
- name: min_exposure_score
in: query
required: false
schema:
type: number
description: Minimum exposure score, 0 to 1
responses:
'200':
description: Cost preview
content:
application/json:
schema:
$ref: '#/components/schemas/ReportQuote'
'400':
description: A filter parameter is not a number
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: 'Missing, invalid, or revoked API key. Fix: pass Authorization: Bearer sk_... (get a key at /v1/signup).'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Monthly credit limit reached (code credits_exhausted). Fix: upgrade via POST /v1/billing/checkout or wait for the monthly reset.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such swath
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Per-minute rate limit for the plan exceeded (code rate_limited). Retry after a short wait.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Swaths
/v1/swaths/{id}/email-report:
post:
operationId: email_report
summary: Email a swath report summary to your account email (summary 1 credit; with…
description: Sends a branded report summary (max hail/wind, area, county, property count, storm link) to the account email your key was signed up with — no other recipients. Pass limit to include the top N properties, billed like the report endpoint. Keys without an account email get a 400.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Swath id (swath_...) or storm id (sw_...)
- name: limit
in: query
required: false
schema:
type: integer
maximum: 50
description: Include the top N properties by exposure (billed like the report, 10-credit minimum); omit for a 1-credit summary
- name: roof_age_min
in: query
required: false
schema:
type: number
description: Minimum estimated roof age in years
- name: roof_material
in: query
required: false
schema:
type: string
description: Exact roof material match, e.g. asphalt_shingle
- name: owner_occupied
in: query
required: false
schema:
type: boolean
description: true = owner-occupied only, false = non-owner-occupied only
- name: year_built_before
in: query
required: false
schema:
type: number
description: Built strictly before this year
- name: year_built_after
in: query
required: false
schema:
type: number
description: Built strictly after this year
- name: value_min
in: query
required: false
schema:
type: number
description: Minimum assessed value (USD)
- name: value_max
in: query
required: false
schema:
type: number
description: Maximum assessed value (USD)
- name: min_exposure_score
in: query
required: false
schema:
type: number
description: Minimum exposure score, 0 to 1
responses:
'200':
description: Report emailed to the account address
'400':
description: No account email on file, or a filter parameter is not a number
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: 'Missing, invalid, or revoked API key. Fix: pass Authorization: Bearer sk_... (get a key at /v1/signup).'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Monthly credit limit reached (code credits_exhausted). Fix: upgrade via POST /v1/billing/checkout or wait for the monthly reset.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No such swath
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Per-minute rate limit for the plan exceeded (code rate_limited). Retry after a short wait.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Email send failed — nothing billed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Email sending not configured on this server
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Swaths
components:
schemas:
ReportQuote:
type: object
description: Cost preview for a Swath Report — counts only, no property rows
properties:
storm_id:
type: string
swath_id:
type: string
total_cached:
type: integer
description: Cached properties matching the filters (1 credit each when returned)
fresh_possible:
type: boolean
description: Whether a paid-plan report could trigger live vendor fetches (uncovered tiles exist)
fresh_estimate:
type:
- integer
- 'null'
description: ESTIMATE of fresh-fetchable records (uncovered tiles × observed parcels-per-tile average); null when no basis. Billing uses actuals only.
quote:
type: object
properties:
cached_credits:
type: integer
description: total_cached × 1 credit
fresh_surcharge_per_record:
type: integer
description: Credits added per fresh-fetched record (25 at current rates)
minimum:
type: integer
description: Per-request billing floor (10 credits)
note:
type: string
SwathReport:
type: object
description: 'Swath Report: properties inside the swath, highest exposure first'
properties:
storm_id:
type: string
swath_id:
type: string
type:
type: string
enum:
- hail
- wind
verified_at:
type:
- string
- 'null'
format: date-time
mesh_max_in:
type:
- number
- 'null'
total:
type: integer
description: Total matching properties across all pages
count:
type: integer
description: Properties in this page
offset:
type: integer
coverage:
$ref: '#/components/schemas/Coverage'
billing:
$ref: '#/components/schemas/ReportBilling'
data:
type: array
items:
$ref: '#/components/schemas/ReportProperty'
SwathGeometryFeature:
type: object
description: GeoJSON Feature carrying the swath footprint
properties:
type:
type: string
enum:
- Feature
properties:
type: object
properties:
swath_id:
type: string
storm_id:
type: string
mesh_max_in:
type:
- number
- 'null'
geometry:
type: object
description: GeoJSON MultiPolygon in WGS84
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
description: Machine-readable error code, e.g. invalid_request, unauthorized, credits_exhausted, rate_limited, not_found, account_exists, billing_not_configured
message:
type: string
used:
type: number
description: Credits used this month (present on credits_exhausted)
plan:
type: string
description: Current plan (present on credits_exhausted)
Coverage:
type: object
description: Parcel-data coverage metadata for this report run
properties:
tiles_fetched:
type: integer
description: Vendor tiles fetched live during this call
parcels_fetched:
type: integer
description: Parcels fetched live during this call
vendor:
type: string
description: Parcel data source label
vendor_fetch:
type: string
enum:
- live
- skipped_free_plan
description: Whether live vendor fetches ran (free plan is cached-only)
ReportProperty:
type: object
properties:
address:
type: string
parcel_id:
type:
- string
- 'null'
year_built:
type:
- integer
- 'null'
sqft:
type:
- number
- 'null'
roof_material:
type:
- string
- 'null'
description: Reserved — not populated yet, always null.
roof_age_est:
type:
- number
- 'null'
description: Estimated roof age in years
roof_age_source:
type:
- string
- 'null'
description: Which input produced roof_age_est. Currently always 'year_built' — permit-derived roof ages are on the roadmap, not in the data yet.
last_roof_permit:
type:
- string
- 'null'
description: YYYY-MM-DD of the last roofing permit. Reserved — not populated yet, always null.
owner_occupied:
type:
- boolean
- 'null'
assessed_value:
type:
- number
- 'null'
description: Assessed value, USD
lat:
type:
- number
- 'null'
lng:
type:
- number
- 'null'
exposure:
$ref: '#/components/schemas/Exposure'
Exposure:
type: object
properties:
hail_in:
type:
- number
- 'null'
description: Max radar hail size at this parcel, inches
score:
type:
- number
- 'null'
description: 0 at the 1.00" detection threshold up to 1.0 at >= 3.00" hail
ReportBilling:
type: object
description: Actual credits billed for this report call (per-record pricing)
properties:
credits:
type: integer
description: 'Credits billed: properties_returned × 1 + fresh_fetched × fresh_surcharge_per_record, minimum applied'
properties_returned:
type: integer
description: Properties in this page — 1 credit each
fresh_fetched:
type: integer
description: Records fetched fresh from the parcel vendor during this call
fresh_surcharge_per_record:
type: integer
description: Credits per fresh-fetched record (25 at current rates)
minimum:
type: integer
description: Per-request billing floor (10 credits)
SwathDetail:
type: object
properties:
id:
type: string
description: Swath id (swath_...)
storm_id:
type: string
type:
type: string
enum:
- hail
- wind
started_at:
type: string
format: date-time
last_seen_at:
type: string
format: date-time
verified_at:
type:
- string
- 'null'
format: date-time
status:
type: string
mesh_max_in:
type:
- number
- 'null'
mesh_mean_in:
type:
- number
- 'null'
wind_max_mph:
type:
- number
- 'null'
area_km2:
type:
- number
- 'null'
updated_at:
type: string
format: date-time
securitySchemes:
ApiKeyAuth:
type: http
scheme: bearer
description: 'Swath API key, e.g. Authorization: Bearer sk_live_... Get one at POST /v1/signup or https://swathapi.com/signup'