{
  "_type": "export",
  "__export_format": 4,
  "__export_date": "2026-04-21T00:00:00.000Z",
  "__export_source": "geog-ai-openapi-generator",
  "resources": [
    {
      "_id": "wrk_geog_ai",
      "_type": "workspace",
      "parentId": null,
      "name": "geog.ai Spatial Intelligence API",
      "description": "geog.ai turns coordinates into spatial decisions. Every API call resolves location into\nenriched context — terrain, jurisdiction, neighbors, atmospheric conditions — and optionally\nruns physics-based propagation models to answer \"what happens next?\"\n\n**Base URL:** `https://api.geog.ai/v1`\n\n**Response modes:**\n- **Synchronous** — context queries and RF/graph lookups return immediately (typically <200 ms)\n- **Async jobs** — propagation simulations (`/simulate/*`) return a job ID; results delivered\n  via webhook or polled via `GET /jobs/{job_id}`\n- **Streaming** — real-time plume tracking via SSE (`/simulate/plume/stream`, Site Calibration plans only)\n\nEvery response is wrapped in a standard envelope that includes a confidence score (0.0–1.0),\nmodel version, calibration age, and data provenance.",
      "scope": "collection"
    },
    {
      "_id": "env_geog_ai_base",
      "_type": "environment",
      "parentId": "wrk_geog_ai",
      "name": "Base Environment",
      "data": {
        "base_url": "https://api.geog.ai/v1",
        "api_key": "geog_test_sk_replace_me"
      },
      "dataPropertyOrder": {
        "&": [
          "base_url",
          "api_key"
        ]
      },
      "color": null,
      "isPrivate": false,
      "metaSortKey": 1
    },
    {
      "_id": "env_geog_ai_prod",
      "_type": "environment",
      "parentId": "env_geog_ai_base",
      "name": "Production",
      "data": {
        "base_url": "https://api.geog.ai/v1",
        "api_key": "geog_live_sk_replace_me"
      },
      "dataPropertyOrder": {
        "&": [
          "base_url",
          "api_key"
        ]
      },
      "color": "#22c55e",
      "isPrivate": true,
      "metaSortKey": 2
    },
    {
      "_id": "fld_df83f82c9d0418613863088a",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Context API",
      "description": "Resolve spatial state for registered devices and arbitrary coordinates.",
      "metaSortKey": -1000
    },
    {
      "_id": "fld_6340394bbc7dc04dc57b2615",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Simulate API",
      "description": "Physics-based propagation simulations (async jobs).",
      "metaSortKey": -999
    },
    {
      "_id": "fld_47ed5ff696f363a7d97f8b42",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "RF API",
      "description": "Radio-frequency coverage, link budget, and mesh analysis.",
      "metaSortKey": -998
    },
    {
      "_id": "fld_b935efa5d8d60b730c87e91b",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Optimize API",
      "description": "Node and sensor placement optimization; coverage and gap analysis.",
      "metaSortKey": -997
    },
    {
      "_id": "fld_ef09ead1db413a0e72354182",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Trajectory API",
      "description": "Spatiotemporal trajectory storage, retrieval, and prediction.",
      "metaSortKey": -996
    },
    {
      "_id": "fld_bacb4a4b959df708e5535bb7",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Graph API",
      "description": "Spatial graph operations — influence spread, evacuation routing, upstream tracing.",
      "metaSortKey": -995
    },
    {
      "_id": "fld_f5ed075f00edd0132316935e",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Calibration",
      "description": "Site-specific model calibration state.",
      "metaSortKey": -994
    },
    {
      "_id": "fld_437736fdb5bb707abdc04848",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Jobs",
      "description": "Async job status polling.",
      "metaSortKey": -993
    },
    {
      "_id": "fld_ca09c54bff74a82bae543ebe",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Capabilities",
      "description": "Deterministic capability registry — the truthful catalog of user-level spatial operations (with status, inputs/outputs, dependencies, validation rules) plus the public dataset/region coverage summary.",
      "metaSortKey": -992
    },
    {
      "_id": "fld_0e524de0b8226a149e73a5ad",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Analyze",
      "description": "AI Spatial Analyst — natural-language analysis (`POST /analyze`) with a deterministic planner-safety pipeline, plus the MCP server endpoint (`POST /mcp`). The LLM only selects registered capabilities; every computation runs deterministically through the capability layer.",
      "metaSortKey": -991
    },
    {
      "_id": "fld_cf2e5f26fef855ce77a1ba3a",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Plans",
      "description": "SpatialAnalysisPlan — serializable, auditable multi-step analysis plans executed deterministically through the capability layer, with per-step validation records, normalized provenance, and trust levels.",
      "metaSortKey": -990
    },
    {
      "_id": "fld_fdfe2da709ca2c4f3b21ce6a",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "Webhooks",
      "description": "Register HTTPS callbacks to receive async job results, signed with HMAC-SHA256.\n\n## Event payloads\n\nEvery delivery, regardless of event type, uses the same JSON envelope —\n`{ ok, event, result, meta }` — where `event` matches the\n`X-Geog-Event` header and `result` is a per-event payload. Receivers\nshould dispatch on `event` and parse `result` against the matching\nschema:\n\n| `event` | `result` schema |\n| --- | --- |\n| `job.complete` | [`JobEventPayload`](#tag/Webhooks/JobEventPayload) (`status=\"complete\"`, `result.result` populated) — full body schema: [`JobCompleteEvent`](#tag/Webhooks/JobCompleteEvent) |\n| `job.failed` | [`JobEventPayload`](#tag/Webhooks/JobEventPayload) (`status=\"failed\"`, `error` populated) — full body schema: [`JobFailedEvent`](#tag/Webhooks/JobFailedEvent) |\n| `calibration.updated` | [`CalibrationUpdatedPayload`](#tag/Webhooks/CalibrationUpdatedPayload) — full body schema: [`CalibrationUpdatedEvent`](#tag/Webhooks/CalibrationUpdatedEvent) |\n| `webhook.disabled` | [`WebhookDisabledPayload`](#tag/Webhooks/WebhookDisabledPayload) — same shape as `GET /webhooks/{id}/health` (`WebhookHealth`), so receivers do not need a follow-up health call. Full body schema: [`WebhookDisabledEvent`](#tag/Webhooks/WebhookDisabledEvent) |\n\nThe discriminated union of all four POST body shapes is\n[`WebhookEventDelivery`](#tag/Webhooks/WebhookEventDelivery).\n",
      "metaSortKey": -989
    },
    {
      "_id": "req_d4e1a9b366fda999b4f1517e",
      "_type": "request",
      "parentId": "fld_ca09c54bff74a82bae543ebe",
      "name": "List registered spatial capabilities",
      "description": "Returns the capability registry — user-level spatial operations backed by ground-truth classification (never claiming more than the implementation supports) — plus the machine-readable error taxonomy and result trust levels. Public, no authentication required.\n\n`GET /capabilities`\n\n_operationId:_ `listCapabilities`",
      "method": "GET",
      "url": "{{ base_url }}/capabilities",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "status",
          "value": "available",
          "description": "",
          "disabled": true
        },
        {
          "name": "category",
          "value": "",
          "description": "",
          "disabled": true
        },
        {
          "name": "async",
          "value": "False",
          "description": "",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 1,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_3a7703b8d8371b98f18df7fe",
      "_type": "request",
      "parentId": "fld_ca09c54bff74a82bae543ebe",
      "name": "Public dataset/region coverage summary",
      "description": "Which regions and datasets are actually covered — DEM sources with regions/resolutions, live dataset row counts, and routing-engine availability. Missing coverage is reported, never hidden. Public.\n\n`GET /capabilities/coverage`\n\n_operationId:_ `getCapabilityCoverage`",
      "method": "GET",
      "url": "{{ base_url }}/capabilities/coverage",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 2,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_aec0507ea476f7305dff1a50",
      "_type": "request",
      "parentId": "fld_ca09c54bff74a82bae543ebe",
      "name": "Capability detail",
      "description": "`GET /capabilities/{capability_id}`\n\n_operationId:_ `getCapability`",
      "method": "GET",
      "url": "{{ base_url }}/capabilities/{capability_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 3,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_43b5ccf46342637d55f6fa31",
      "_type": "request",
      "parentId": "fld_ca09c54bff74a82bae543ebe",
      "name": "Execute one registered capability directly",
      "description": "The capability-API access level — run a single registered capability with explicit inputs. The result carries the standard validation record, normalized provenance, and trust level. Unknown capabilities are impossible: only registry ids resolve. Executing a simulation capability requires the `simulate` key scope and an optimization capability requires `optimize`; read-only keys receive 403.\n\n`POST /capabilities/{capability_id}/execute`\n\n_operationId:_ `executeCapability`",
      "method": "POST",
      "url": "{{ base_url }}/capabilities/{capability_id}/execute",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"inputs\": {}\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 4,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_9a0b78b4fc04755c3ef1f79c",
      "_type": "request",
      "parentId": "fld_0e524de0b8226a149e73a5ad",
      "name": "Natural-language spatial analysis (AI Spatial Analyst)",
      "description": "Translates a natural-language query into a SpatialAnalysisPlan via an LLM planner, then forces the candidate through a deterministic validation gauntlet (schema → registered capabilities → required inputs → tier/cost) BEFORE anything executes. `execution: \"plan\"` returns the validated plan without executing; `execution: \"auto\"` additionally executes it deterministically through the capability layer and returns per-step outputs, validation records, provenance, and trust level. The LLM never invents spatial calculations and no LLM-generated code ever runs. LLM token cost is metered against the tenant and reported in `planner.token_cost_units`. Auto mode requires the `simulate` key scope, plus `optimize` when the plan contains an optimization step (403 otherwise).\n\n`POST /analyze`\n\n_operationId:_ `analyze`",
      "method": "POST",
      "url": "{{ base_url }}/analyze",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"query\": \"\",\n  \"context\": {},\n  \"execution\": \"plan\",\n  \"narrative\": false\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 5,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_7b7c708c6513f8bfc8b1b84d",
      "_type": "request",
      "parentId": "fld_0e524de0b8226a149e73a5ad",
      "name": "MCP server endpoint (Streamable HTTP, JSON-RPC 2.0)",
      "description": "Model Context Protocol server exposing high-level spatial tools (get_spatial_context, find_nearby, find_within, get_elevation, get_terrain_profile, analyze_trajectory, calculate_route, calculate_evacuation_route, simulate_flood, list_capabilities, execute_analysis_plan) that delegate to the deterministic capability registry. Supports `initialize`, `ping`, `tools/list`, `tools/call`. Connect any MCP client with transport \"streamable-http\", URL `https://api.geog.ai/v1/mcp`, and an `Authorization: Bearer <key>` header — see the MCP guide in the docs. Tool calls enforce capability-aware key scopes: simulate_flood needs `simulate`, and execute_analysis_plan needs every scope its steps require (403 otherwise).\n\n`POST /mcp`\n\n_operationId:_ `mcpRpc`",
      "method": "POST",
      "url": "{{ base_url }}/mcp",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"\",\n  \"params\": {}\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 6,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_9067998bd2616a8144407e7e",
      "_type": "request",
      "parentId": "fld_cf2e5f26fef855ce77a1ba3a",
      "name": "List plans for the caller",
      "description": "`GET /plans`\n\n_operationId:_ `listPlans`",
      "method": "GET",
      "url": "{{ base_url }}/plans",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "limit",
          "value": "50",
          "description": "",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 7,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_40c7ccaaa62c90abd02e76c4",
      "_type": "request",
      "parentId": "fld_cf2e5f26fef855ce77a1ba3a",
      "name": "Create a SpatialAnalysisPlan",
      "description": "Validates every step against the capability registry, computes the cost/tier estimate, and persists the plan as a draft. Plans are serializable, auditable, and executable independently of any LLM.\n\n`POST /plans`\n\n_operationId:_ `createPlan`",
      "method": "POST",
      "url": "{{ base_url }}/plans",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"objective\": \"\",\n  \"steps\": [\n    {\n      \"capability_id\": \"\",\n      \"inputs\": {},\n      \"label\": \"\"\n    }\n  ],\n  \"assumptions\": [\n    \"\"\n  ],\n  \"required_data\": [\n    \"\"\n  ]\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 8,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_a78e5da5adc8d0d875315076",
      "_type": "request",
      "parentId": "fld_cf2e5f26fef855ce77a1ba3a",
      "name": "Plan detail (including step results)",
      "description": "`GET /plans/{plan_id}`\n\n_operationId:_ `getPlan`",
      "method": "GET",
      "url": "{{ base_url }}/plans/{plan_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 9,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_b5150dd68359ab8503e0756e",
      "_type": "request",
      "parentId": "fld_cf2e5f26fef855ce77a1ba3a",
      "name": "Execute a plan deterministically, step by step",
      "description": "Runs each capability step in order through the existing job/execution layer. Every intermediate step result — output, validation record, normalized provenance, trust level — is persisted and returned. A step failure stops execution with the machine-readable taxonomy error recorded on that step.\n\n`POST /plans/{plan_id}/execute`\n\n_operationId:_ `executePlan`",
      "method": "POST",
      "url": "{{ base_url }}/plans/{plan_id}/execute",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 10,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_786099de1c36881d848b820b",
      "_type": "request",
      "parentId": "fld_cf2e5f26fef855ce77a1ba3a",
      "name": "Intermediate step results for a plan",
      "description": "`GET /plans/{plan_id}/steps`\n\n_operationId:_ `getPlanSteps`",
      "method": "GET",
      "url": "{{ base_url }}/plans/{plan_id}/steps",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 11,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_d632ec0ff8c04f20752501f5",
      "_type": "request",
      "parentId": "fld_df83f82c9d0418613863088a",
      "name": "Resolve SpatialState for a registered device",
      "description": "Returns the full `SpatialState` for a registered device — terrain, jurisdiction, wind vector,\nnearby entities, atmospheric stability class, and asset proximity. Enrichment runs at ingest\ntime; this call returns the pre-computed state.\n\n**Pricing:** $0.001 / call\n\n`GET /context`\n\n_operationId:_ `getContext`",
      "method": "GET",
      "url": "{{ base_url }}/context",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "device_id",
          "value": "sensor_h2s_023",
          "description": "Registered device identifier.",
          "disabled": false
        },
        {
          "name": "include",
          "value": "terrain,jurisdiction,wind",
          "description": "Comma-separated context fields to include. Default: all. Options: terrain, jurisdiction, wind, nearby, assets, calibration.",
          "disabled": true
        },
        {
          "name": "max_age_s",
          "value": "300",
          "description": "Maximum acceptable state age in seconds. Older states trigger fresh enrichment.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 12,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_b0f4a07547ad29d1e713ad9d",
      "_type": "request",
      "parentId": "fld_df83f82c9d0418613863088a",
      "name": "Batch context resolution (up to 500 devices)",
      "description": "Resolves SpatialState for up to 500 devices in a single request. Partial failures\nare represented with `null` result entries and an error sub-object.\n\n**Pricing:** $0.001 / device\n\n`GET /context/batch`\n\n_operationId:_ `getContextBatch`",
      "method": "GET",
      "url": "{{ base_url }}/context/batch",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "device_ids",
          "value": "[\"sensor_h2s_023\",\"sensor_h2s_024\",\"drone_01\"]",
          "description": "JSON-encoded array of device IDs. Max 500 per request.",
          "disabled": false
        },
        {
          "name": "include",
          "value": "",
          "description": "Comma-separated context fields to include (see /context).",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 13,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_c29d8577dd81df461f79f845",
      "_type": "request",
      "parentId": "fld_df83f82c9d0418613863088a",
      "name": "Proximity search",
      "description": "Returns all registered entities within a given radius of a coordinate, optionally\nfiltered by type. Results are ordered by distance.\n\n**Pricing:** $0.001 / call\n\n`GET /nearby`\n\n_operationId:_ `getNearby`",
      "method": "GET",
      "url": "{{ base_url }}/nearby",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "lat",
          "value": "31.96",
          "description": "WGS84 latitude of center point.",
          "disabled": false
        },
        {
          "name": "lon",
          "value": "-99.9",
          "description": "WGS84 longitude of center point.",
          "disabled": false
        },
        {
          "name": "radius_m",
          "value": "500",
          "description": "Search radius in meters. Max 50,000 m.",
          "disabled": false
        },
        {
          "name": "type",
          "value": "gas_sensor",
          "description": "Filter by entity type. Built-in values: gas_sensor, water_sensor, rf_node, asset, personnel, drone. Any registered custom type is also accepted.",
          "disabled": true
        },
        {
          "name": "limit",
          "value": "50",
          "description": "Maximum results to return. Default 50, max 500.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 14,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_19229eda1c5d5a107ee6d9f6",
      "_type": "request",
      "parentId": "fld_df83f82c9d0418613863088a",
      "name": "Polygon containment query",
      "description": "Returns all registered entities whose location falls within a given GeoJSON polygon.\nUsed for zone-based queries — \"which sensors are inside this permit boundary?\"\n\n**Pricing:** $0.001 / call (+$0.001/entity if include_context=true)\n\n`GET /within`\n\n_operationId:_ `getWithin`",
      "method": "GET",
      "url": "{{ base_url }}/within",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "geometry",
          "value": "",
          "description": "URL-encoded GeoJSON Polygon or MultiPolygon.",
          "disabled": false
        },
        {
          "name": "type",
          "value": "",
          "description": "Entity type filter. Same built-in values as /nearby (gas_sensor, water_sensor, rf_node, asset, personnel, drone), plus any registered custom type.",
          "disabled": true
        },
        {
          "name": "include_context",
          "value": "False",
          "description": "If true, includes full SpatialState for each result (billed at $0.001/entity).",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 15,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_62d66ee08ee8d7f780ef5284",
      "_type": "request",
      "parentId": "fld_df83f82c9d0418613863088a",
      "name": "Jurisdiction resolution for any coordinate",
      "description": "Returns all applicable regulatory jurisdictions and permit obligations for a given\ncoordinate — air quality authority, watershed governance, noise ordinance, and\ncross-boundary relationships.\n\n**Pricing:** $0.0005 / call (free when device_id is passed to /context)\n\n`GET /jurisdiction`\n\n_operationId:_ `getJurisdiction`",
      "method": "GET",
      "url": "{{ base_url }}/jurisdiction",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "lat",
          "value": "31.9686",
          "description": "WGS84 latitude. Required unless device_id is provided.",
          "disabled": true
        },
        {
          "name": "lon",
          "value": "-99.9018",
          "description": "WGS84 longitude. Required unless device_id is provided.",
          "disabled": true
        },
        {
          "name": "device_id",
          "value": "",
          "description": "Alternative to lat/lon — uses the device's registered coordinates.",
          "disabled": true
        },
        {
          "name": "domains",
          "value": "air,water",
          "description": "Comma-separated domain filter. Options: air, water, noise, land, fire. Default: all.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 16,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_4fd621e0535c4f3a7801e64d",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Atmospheric dispersion simulation",
      "description": "Runs an atmospheric dispersion model for a point or area source. Tier 1 uses Gaussian\nplume (fast screening, <8 s). Tier 2 uses AERMOD-style regulatory-grade modeling\n(15–60 s). Tier 3 uses Lagrangian particle tracking for non-steady-state scenarios\n(minutes). Returns concentration isopleths, predicted readings at registered sensor\nlocations, and affected zone classifications.\n\n**Pricing:** $0.05–$0.25 / run depending on tier.\n\n`POST /simulate/plume`\n\n_operationId:_ `simulatePlume`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/plume",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"source\": {\n    \"lat\": 31.9642,\n    \"lon\": -99.9035,\n    \"alt_m\": 545,\n    \"emission_rate_gs\": 2.4,\n    \"stack_height_m\": 12\n  },\n  \"wind\": {\n    \"speed_ms\": 8.2,\n    \"bearing_deg\": 312\n  },\n  \"stability_class\": \"D\",\n  \"duration_min\": 60,\n  \"tier\": 2,\n  \"species\": \"H2S\",\n  \"output_receptors\": [\n    \"sensor_h2s_021\",\n    \"sensor_h2s_023\",\n    \"sensor_h2s_024\"\n  ]\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 17,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_34397eb5c4ea0fa0d3b61c09",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Live plume tracking via Server-Sent Events",
      "description": "Opens a Server-Sent Events (SSE) stream that delivers a running plume\nsimulation in real time. The client POSTs a `PlumeStreamRequest` with\n`Accept: text/event-stream`; the server responds `200 OK` with\n`Content-Type: text/event-stream` and emits a sequence of named events\nuntil the simulation completes or the client disconnects.\n\n**Event types** (the SSE `event:` field):\n\n- `tick` — heartbeat with simulation clock and wind vector, emitted\n  every `tick_interval_s` seconds\n- `concentration` — updated isopleth polygons and per-receptor\n  concentrations, emitted on every tick after the field stabilises\n- `alert` — emitted when an `alert_thresholds` value is crossed at\n  any receptor or isopleth\n- `end` — terminal event with run summary; clients should stop\n  reconnecting after receiving this\n\nEvery event carries a stable `id:` field. Clients that drop the\nconnection should reconnect with `Last-Event-ID` to resume from the\nlast event seen. The official SDKs (`streamPlume` in TypeScript,\n`stream_plume` in Python) implement this reconnect-with-backoff\nbehaviour automatically.\n\n**Availability:** Site Calibration plans only.\n\n**Pricing:** $0.25 / run, billed once on `end`.\n\n`POST /simulate/plume/stream`\n\n_operationId:_ `streamPlume`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/plume/stream",
      "headers": [
        {
          "name": "Accept",
          "value": "text/event-stream"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"source\": {\n    \"lat\": 31.9642,\n    \"lon\": -99.9035,\n    \"alt_m\": 545,\n    \"emission_rate_gs\": 2.4,\n    \"stack_height_m\": 12\n  },\n  \"wind\": {\n    \"speed_ms\": 8.2,\n    \"bearing_deg\": 312\n  },\n  \"stability_class\": \"D\",\n  \"duration_min\": 60,\n  \"species\": \"H2S\",\n  \"output_receptors\": [\n    \"sensor_h2s_021\",\n    \"sensor_h2s_023\",\n    \"sensor_h2s_024\"\n  ],\n  \"tick_interval_s\": 5,\n  \"alert_thresholds\": {\n    \"warn\": 1.0,\n    \"action\": 5.0,\n    \"evacuate\": 10.0\n  }\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 18,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_3e7c71f5fd0341f2ccac5ee2",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Flood and hydrological simulation",
      "description": "Runs DEM-based watershed delineation, SCS Curve Number rainfall-runoff modeling,\nkinematic wave channel routing, and 2D inundation mapping. Returns flood extent\npolygons at multiple return intervals, time-to-crest forecasts, and sensors predicted\nto be inundated.\n\nEither `watershed_id` or `area` is required.\n\n**Pricing:** $0.10 / run\n\n`POST /simulate/flood`\n\n_operationId:_ `simulateFlood`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/flood",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"watershed_id\": \"basin_colorado_mid\",\n  \"precip_mm\": 85,\n  \"duration_hr\": 3,\n  \"return_periods\": [\n    10,\n    100\n  ],\n  \"antecedent_moisture\": \"wet\"\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 19,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_8872c13daa869e326d9b994b",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Single-node RF coverage simulation",
      "description": "Runs the ITM/Longley-Rice terrain propagation model for a single RF node. Returns a\ncoverage probability polygon at the specified RSSI threshold, plus a raster heatmap\nand link budget summary. Either `node_id` or `lat/lon/alt_m` is required.\n\n**Pricing:** $0.08 / run\n\n`POST /simulate/rf_coverage`\n\n_operationId:_ `simulateRFCoverage`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/rf_coverage",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"node_id\": \"rf_node_A7\",\n  \"frequency_mhz\": 915,\n  \"tx_power_dbm\": 20,\n  \"rssi_threshold_dbm\": -95,\n  \"antenna_height_m\": 6,\n  \"model\": \"itm\"\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 20,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_150d41755c189a59c977af09",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Noise propagation simulation",
      "description": "Runs ISO 9613-2 octave-band outdoor sound propagation from a point or line source.\nAccounts for geometric spreading, atmospheric absorption, ground effect, barrier\ninsertion loss, and vegetation attenuation. Returns noise contour polygons (isodB\nlines) and exceedance flags at registered receptor locations.\n\nEither `source_id` or a source geometry must be provided.\n\n**Pricing:** $0.08 / run\n\n`POST /simulate/noise`\n\n_operationId:_ `simulateNoise`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/noise",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"source_id\": \"compressor_C4\",\n  \"octave_bands_db\": [\n    82,\n    86,\n    91,\n    95,\n    93,\n    88,\n    84,\n    79\n  ],\n  \"contour_levels_dba\": [\n    45,\n    55,\n    65\n  ]\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 21,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_9309a8f4e8aad39a392cd0cc",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Thermal / heat diffusion simulation",
      "description": "Models heat propagation from industrial sources, fire events, or equipment failures.\nReturns time-to-temperature-threshold at monitored locations and hot zone polygons.\n\n**Pricing:** $0.08 / run\n\n`POST /simulate/thermal`\n\n_operationId:_ `simulateThermal`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/thermal",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"source\": {\n    \"lat\": 31.9642,\n    \"lon\": -99.9035,\n    \"power_kw\": 850,\n    \"temperature_c\": 240\n  },\n  \"duration_min\": 120,\n  \"threshold_c\": [\n    40,\n    60,\n    80\n  ],\n  \"output_receptors\": [\n    \"sensor_temp_07\",\n    \"sensor_temp_12\"\n  ]\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 22,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_f09cb963541424fbbe96cc18",
      "_type": "request",
      "parentId": "fld_6340394bbc7dc04dc57b2615",
      "name": "Fire spread simulation",
      "description": "Models wildfire spread using terrain, fuel model, and weather conditions. Returns fire\nperimeter polygons at specified time intervals, rate-of-spread vectors, and smoke plume\ntrajectory (linked to `/simulate/plume` for full smoke transport).\n\n**Pricing:** $0.15 / run\n\n`POST /simulate/fire`\n\n_operationId:_ `simulateFire`",
      "method": "POST",
      "url": "{{ base_url }}/simulate/fire",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"ignition_point\": {\n    \"type\": \"Point\",\n    \"coordinates\": [\n      -119.42,\n      34.21\n    ]\n  },\n  \"fuel_model\": \"GR2\",\n  \"weather\": {\n    \"wind_speed_ms\": 8.3,\n    \"wind_bearing_deg\": 225,\n    \"rh_pct\": 12,\n    \"temp_c\": 38\n  },\n  \"duration_hr\": 24,\n  \"output_intervals_hr\": [\n    1,\n    4,\n    12,\n    24\n  ]\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 23,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_fd9cf96eb026d7b2a5bc87e3",
      "_type": "request",
      "parentId": "fld_47ed5ff696f363a7d97f8b42",
      "name": "Coverage polygon for a registered node",
      "description": "Returns the coverage probability polygon for a registered RF node at a given RSSI\nthreshold. Cached per node until terrain or node configuration changes.\n\n**Pricing:** $0.08 / call\n\n`GET /rf/coverage`\n\n_operationId:_ `getRFCoverage`",
      "method": "GET",
      "url": "{{ base_url }}/rf/coverage",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "node",
          "value": "rf_node_A7",
          "description": "Registered RF node ID.",
          "disabled": false
        },
        {
          "name": "threshold_dbm",
          "value": "-92",
          "description": "RSSI threshold in dBm. Default -90 dBm.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 24,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_72e1a66b1f0682cb64d857b3",
      "_type": "request",
      "parentId": "fld_47ed5ff696f363a7d97f8b42",
      "name": "Point-to-point RF link budget",
      "description": "Returns the link budget between two registered nodes — predicted RSSI, fade margin,\nFresnel zone clearance, and obstruction analysis. Returns a pass/fail recommendation\ngiven the specified reliability threshold.\n\n**Pricing:** $0.03 / call\n\n`GET /rf/link`\n\n_operationId:_ `getRFLink`",
      "method": "GET",
      "url": "{{ base_url }}/rf/link",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "from",
          "value": "rf_node_A7",
          "description": "Source node ID.",
          "disabled": false
        },
        {
          "name": "to",
          "value": "rf_node_B3",
          "description": "Target node ID.",
          "disabled": false
        },
        {
          "name": "reliability_pct",
          "value": "99.0",
          "description": "Required link reliability percentage. Default 99.0.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 25,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_484f6421cb824fa12e1c6ce1",
      "_type": "request",
      "parentId": "fld_47ed5ff696f363a7d97f8b42",
      "name": "Coverage gap heatmap within an area",
      "description": "Identifies coverage gaps within a defined area given existing node topology. Returns a\nGeoJSON heatmap of gap severity and a list of H3 cells with insufficient coverage.\n\n**Pricing:** $0.05 / call\n\n`GET /rf/gaps`\n\n_operationId:_ `getRFGaps`",
      "method": "GET",
      "url": "{{ base_url }}/rf/gaps",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "area",
          "value": "",
          "description": "URL-encoded GeoJSON Polygon defining the area to analyze.",
          "disabled": false
        },
        {
          "name": "threshold_dbm",
          "value": "-90",
          "description": "RSSI below which a cell is considered a gap. Default -90 dBm.",
          "disabled": true
        },
        {
          "name": "node_ids",
          "value": "",
          "description": "Comma-separated node IDs to analyze against. Default all registered nodes in area.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 26,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_8e328a023b60c72f6349f743",
      "_type": "request",
      "parentId": "fld_47ed5ff696f363a7d97f8b42",
      "name": "Full mesh connectivity matrix",
      "description": "Computes the full link budget matrix for a mesh network — every node-to-node pair,\nwith failure probability based on calibrated path loss models. Returns a connectivity\nmatrix, mesh reliability score, single-points-of-failure, and failure scenario analysis.\n\nAsync job; typical completion 15–40 seconds for networks up to 200 nodes.\n\n**Pricing:** $0.15 / run\n\n`POST /rf/mesh/viability`\n\n_operationId:_ `rfMeshViability`",
      "method": "POST",
      "url": "{{ base_url }}/rf/mesh/viability",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"node_ids\": [\n    \"rf_node_A7\",\n    \"rf_node_B3\",\n    \"rf_node_C2\",\n    \"rf_node_D9\"\n  ],\n  \"min_path_reliability_pct\": 99.5,\n  \"failure_scenarios\": [\n    {\n      \"node_id\": \"rf_node_A7\",\n      \"failure_probability\": 0.05\n    }\n  ]\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 27,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_4b85593e8cb365cf8be5139b",
      "_type": "request",
      "parentId": "fld_47ed5ff696f363a7d97f8b42",
      "name": "Node placement optimizer for RF coverage",
      "description": "Given existing mesh topology, terrain, and coverage requirements, returns the top-N\ncandidate locations that maximize marginal coverage gain.\n\n**Pricing:** $1.00–$5.00 / run\n\n`POST /rf/optimize/placement`\n\n_operationId:_ `rfOptimizePlacement`",
      "method": "POST",
      "url": "{{ base_url }}/rf/optimize/placement",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"area\": {\n    \"type\": \"Polygon\",\n    \"coordinates\": [\n      [\n        [\n          \"-99.92 - 31.95\",\n          [\n            -99.88,\n            31.95\n          ],\n          [\n            -99.88,\n            31.99\n          ],\n          [\n            -99.92,\n            31.99\n          ],\n          [\n            -99.92,\n            31.95\n          ]\n        ]\n      ]\n    ]\n  },\n  \"coverage_threshold\": 0.95,\n  \"existing_nodes\": [\n    \"rf_node_A7\",\n    \"rf_node_B3\"\n  ],\n  \"candidate_count\": 5,\n  \"frequency_mhz\": 915,\n  \"constraints\": {\n    \"min_distance_from_edge_m\": 50,\n    \"require_road_access\": true\n  }\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 28,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_3a5bf4d204db5e0c0ee75e31",
      "_type": "request",
      "parentId": "fld_b935efa5d8d60b730c87e91b",
      "name": "General node placement optimizer",
      "description": "Generalizes RF placement to any monitoring objective — air quality sensor spacing\n(accounting for plume physics), flood gauge placement (watershed coverage), or\nacoustic monitor placement (source coverage). Returns ranked candidate locations with\nobjective-specific marginal gain scores.\n\n**Pricing:** $1.00–$5.00 / run\n\n`POST /optimize/node_placement`\n\n_operationId:_ `optimizeNodePlacement`",
      "method": "POST",
      "url": "{{ base_url }}/optimize/node_placement",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"area\": {\n    \"type\": \"Polygon\",\n    \"coordinates\": [\n      [\n        [\n          \"-99.92 - 31.95\",\n          [\n            -99.88,\n            31.95\n          ],\n          [\n            -99.88,\n            31.99\n          ],\n          [\n            -99.92,\n            31.99\n          ],\n          [\n            -99.92,\n            31.95\n          ]\n        ]\n      ]\n    ]\n  },\n  \"coverage_threshold\": 0.9,\n  \"existing_nodes\": [\n    \"sensor_h2s_021\",\n    \"sensor_h2s_023\"\n  ],\n  \"objective\": \"plume_detection\"\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 29,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_4313a6b684c4326f67d5bfbb",
      "_type": "request",
      "parentId": "fld_b935efa5d8d60b730c87e91b",
      "name": "Vertical-aware sensor placement optimization",
      "description": "Recommends sensor placement for a given ZOOID vertical — accounts for the vertical's\nspecific measurement physics, regulatory requirements, and deployment constraints.\n\n**Pricing:** $2.00–$5.00 / run\n\n`POST /optimize/sensor_placement`\n\n_operationId:_ `optimizeSensorPlacement`",
      "method": "POST",
      "url": "{{ base_url }}/optimize/sensor_placement",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"vertical\": \"V01\",\n  \"area\": {\n    \"type\": \"Polygon\",\n    \"coordinates\": [\n      [\n        [\n          \"-99.92 - 31.95\",\n          [\n            -99.88,\n            31.95\n          ],\n          [\n            -99.88,\n            31.99\n          ],\n          [\n            -99.92,\n            31.99\n          ],\n          [\n            -99.92,\n            31.95\n          ]\n        ]\n      ]\n    ]\n  },\n  \"target_coverage_pct\": 0.95,\n  \"budget_nodes\": 8\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 30,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_0104b8f489e8794e302e15b2",
      "_type": "request",
      "parentId": "fld_b935efa5d8d60b730c87e91b",
      "name": "Coverage analysis for an area",
      "description": "Returns the current monitoring coverage fraction for a given area and sensor type.\nCoverage is defined by the spatial footprint of registered sensors given their\ndetection physics.\n\n**Pricing:** $0.01 / call\n\n`GET /coverage`\n\n_operationId:_ `getCoverage`",
      "method": "GET",
      "url": "{{ base_url }}/coverage",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "area",
          "value": "",
          "description": "URL-encoded GeoJSON polygon defining the area of interest.",
          "disabled": false
        },
        {
          "name": "type",
          "value": "gas_sensor",
          "description": "Sensor type to assess coverage for.",
          "disabled": false
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 31,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_b2130979d1a22fb249e8d80f",
      "_type": "request",
      "parentId": "fld_b935efa5d8d60b730c87e91b",
      "name": "Monitoring gap analysis for an area",
      "description": "Identifies monitoring gaps within a defined area — H3 cells where no sensor provides\nadequate coverage given detection physics. Returns a GeoJSON gap heatmap and summary\nstatistics.\n\n**Pricing:** $0.01 / call\n\n`GET /gaps`\n\n_operationId:_ `getGaps`",
      "method": "GET",
      "url": "{{ base_url }}/gaps",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "area",
          "value": "",
          "description": "URL-encoded GeoJSON polygon defining the area of interest.",
          "disabled": false
        },
        {
          "name": "threshold_m",
          "value": "400",
          "description": "Maximum acceptable distance from any sensor in metres. Default 500 m.",
          "disabled": true
        },
        {
          "name": "type",
          "value": "",
          "description": "Sensor type filter.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 32,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_a2330035a829ffc88d902361",
      "_type": "request",
      "parentId": "fld_ef09ead1db413a0e72354182",
      "name": "Trajectory history for a moving entity",
      "description": "Returns the stored trajectory (sequence of positions with timestamps and uncertainty\nbounds) for a registered moving entity over a specified time window.\n\n**Pricing:** $0.002 / call\n\n`GET /trajectory`\n\n_operationId:_ `getTrajectory`",
      "method": "GET",
      "url": "{{ base_url }}/trajectory",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "entity_id",
          "value": "drone_01",
          "description": "Registered entity ID (drone, vehicle, or personnel).",
          "disabled": false
        },
        {
          "name": "from",
          "value": "2026-04-21T02:00:00Z",
          "description": "Start of time window (ISO 8601).",
          "disabled": false
        },
        {
          "name": "to",
          "value": "2026-04-21T03:00:00Z",
          "description": "End of time window (ISO 8601). Max window 30 days.",
          "disabled": false
        },
        {
          "name": "resolution_s",
          "value": "0",
          "description": "Temporal resolution of returned positions in seconds. Default raw (all recorded positions).",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 33,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_b18171fb8a908b57ed44f012",
      "_type": "request",
      "parentId": "fld_ef09ead1db413a0e72354182",
      "name": "Trajectory prediction / dead reckoning",
      "description": "Predicts the future trajectory of a moving entity given current position, velocity,\nand historical movement patterns. Returns a predicted path with expanding uncertainty\nbounds. Used for drone flight path prediction, fleet routing optimization, and\npersonnel zone arrival forecasting.\n\n**Pricing:** $0.005 / call\n\n`POST /trajectory/predict`\n\n_operationId:_ `trajectoryPredict`",
      "method": "POST",
      "url": "{{ base_url }}/trajectory/predict",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"entity_id\": \"drone_01\",\n  \"lookahead_min\": 30,\n  \"mission_plan\": {\n    \"type\": \"LineString\",\n    \"coordinates\": [\n      [\n        -99.9024,\n        31.9701\n      ],\n      [\n        -99.898,\n        31.9755\n      ],\n      [\n        -99.8932,\n        31.981\n      ]\n    ]\n  }\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 34,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_14c48db90d34a7f4d315c4ea",
      "_type": "request",
      "parentId": "fld_bacb4a4b959df708e5535bb7",
      "name": "Network-reachable nodes within a cost radius from a source",
      "description": "Given a source point and a network-distance `radius_cost`, returns every node in the\nnamed routing network reachable within that cost. Backed by `pgr_drivingDistance` over\n`geo_road_networks`, scoped to the caller's tenant and vertical. Reachable nodes are\nordered by ascending accumulated cost.\n\n**Pricing:** $0.005 / call\n\n`POST /route/influence_spread`\n\n_operationId:_ `postRouteInfluenceSpread`",
      "method": "POST",
      "url": "{{ base_url }}/route/influence_spread",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"vertical_id\": \"oilgas\",\n  \"network_id\": \"wellpad_07\",\n  \"source\": {\n    \"lat\": 31.9686,\n    \"lng\": -102.0779\n  },\n  \"radius_cost\": 1000\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 35,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_54c25cd779f46f335d2daadd",
      "_type": "request",
      "parentId": "fld_bacb4a4b959df708e5535bb7",
      "name": "Least-cost route to the nearest safe zone, avoiding active hazards",
      "description": "Returns the least-cost route from a starting point to whichever of the supplied\n`safe_zones` is cheapest to reach, routing around active hazard geometries. The avoid\nset is auto-populated from recent *succeeded* simulate jobs (live plume, flood, fire,\nRF-failure FeatureCollections) within `freshness_minutes`. Uses pgRouting on the named\nnetwork.\n\n**Pricing:** $0.01 / call\n\n`POST /route/evacuation`\n\n_operationId:_ `postRouteEvacuation`",
      "method": "POST",
      "url": "{{ base_url }}/route/evacuation",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"vertical_id\": \"oilgas\",\n  \"network_id\": \"wellpad_07\",\n  \"from\": {\n    \"lat\": 31.9686,\n    \"lng\": -102.0779\n  },\n  \"safe_zones\": [\n    {\n      \"lat\": 31.9721,\n      \"lng\": -102.0742\n    },\n    {\n      \"lat\": 31.965,\n      \"lng\": -102.081\n    }\n  ],\n  \"freshness_minutes\": 30\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 36,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_21d3ab7b209f871bfa97ebcc",
      "_type": "request",
      "parentId": "fld_f5ed075f00edd0132316935e",
      "name": "Site-specific model calibration state",
      "description": "Returns the current calibration state for a given propagation model and site —\nincluding calibration age, parameter corrections applied, and prediction accuracy\nmetrics over the last 30/90 days.\n\nRequires Site Calibration plan.\n\n**Pricing:** $0.001 / call (Site Calibration plan only)\n\n`GET /model/calibration`\n\n_operationId:_ `getModelCalibration`",
      "method": "GET",
      "url": "{{ base_url }}/model/calibration",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "model",
          "value": "plume",
          "description": "Propagation model to query calibration state for.",
          "disabled": false
        },
        {
          "name": "site_id",
          "value": "wellpad_07",
          "description": "Site identifier.",
          "disabled": false
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 37,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_1839f56f48d44c43375088c9",
      "_type": "request",
      "parentId": "fld_437736fdb5bb707abdc04848",
      "name": "Poll async job status and retrieve result",
      "description": "Returns the current status of an async simulation job. When status is `complete`,\nthe full result is included in the `result` field of the response envelope.\nJobs expire 48 hours after completion.\n\n`GET /jobs/{job_id}`\n\n_operationId:_ `getJob`",
      "method": "GET",
      "url": "{{ base_url }}/jobs/job_01hx2a3f9k8qmzn7p",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 38,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_60129b6d3609e6976737c4cd",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "List all registered webhooks for the account",
      "description": "Returns every webhook registered on the calling account, ordered by `created_at` descending.\nThe signing `secret` is **never** returned by this endpoint — it is only available on the\ninitial `POST /webhooks` response. To rotate a secret, delete the webhook and register a new one.\n\n`GET /webhooks`\n\n_operationId:_ `listWebhooks`",
      "method": "GET",
      "url": "{{ base_url }}/webhooks",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "active",
          "value": "False",
          "description": "If supplied, filters the result to only active (`true`) or paused (`false`) webhooks.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 39,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_97b904bcd8d897a84bb1c18f",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Register a webhook endpoint to receive async job results",
      "description": "Registers an HTTPS callback URL on your account. Once registered, every async job your\naccount creates (`/simulate/*`, `/rf/mesh/viability`, `/rf/optimize/placement`,\n`/optimize/*`) will POST its full result envelope to this URL when it transitions to\n`complete` or `failed`. Per-job overrides can still be supplied via the `webhook_url`\nfield on the job request body.\n\n## Delivery payload\n\nEach delivery is a `POST` with `Content-Type: application/json` containing the standard\n`{ ok, event, result, meta }` envelope. The shape of `result` depends on `event` — see\nthe per-event schemas at the top of the [Webhooks tag](#tag/Webhooks): `JobCompleteEvent`,\n`JobFailedEvent`, `CalibrationUpdatedEvent`, and `WebhookDisabledEvent` (the discriminated\nunion is `WebhookEventDelivery`). For `job.complete` and `job.failed`, `result` is the\nsame body returned by `GET /jobs/{job_id}` once the job has reached a terminal state.\n\nThe following headers are always set on the delivery:\n\n| Header | Description |\n| --- | --- |\n| `X-Geog-Signature` | Hex-encoded HMAC-SHA256 of `{timestamp}.{raw_body}` using the webhook secret. Format: `t=<unix_ts>,v1=<hex_digest>` |\n| `X-Geog-Event` | Event type (`job.complete`, `job.failed`, `calibration.updated`, `webhook.disabled`). Always matches the `event` field in the body. |\n| `X-Geog-Delivery` | Unique delivery ID — safe to use for idempotency on the receiver side |\n| `X-Geog-Webhook-Id` | ID of the registered webhook that produced this delivery |\n| `X-Geog-Test` | Present and set to `true` only on deliveries produced by `POST /webhooks/{id}/test`. Absent on real job-driven deliveries — receivers can use it to short-circuit production side-effects for synthetic traffic |\n\n## Verifying the signature (HMAC-SHA256)\n\n1. Read the `X-Geog-Signature` header and parse the comma-separated `t=` (unix timestamp,\n   seconds) and `v1=` (hex digest) parts.\n2. Reject the delivery if `|now - t| > 300` seconds to mitigate replay attacks.\n3. Concatenate `t`, a literal `.`, and the raw request body bytes.\n4. Compute `HMAC-SHA256(secret, payload).hexdigest()` and compare it to `v1` using a\n   constant-time comparison (e.g. `hmac.compare_digest`). Reject on mismatch.\n\n## Retry behaviour\n\nNon-2xx responses (or no response within 10 seconds) trigger automatic retries with\nexponential backoff at 30s, 2m, 10m, 30m, 2h, 6h, and 24h. After 7 failed attempts the\ndelivery is marked `undeliverable`. If 50% of deliveries in the last hour have failed\nthe webhook is automatically disabled (`active=false`, `disabled_reason=auto_failure_rate`)\nand an email is sent to the account owner. To detect this auto-disable programmatically\nrather than relying on the owner's inbox, either subscribe to the `webhook.disabled`\nevent (delivered on the final attempt before the webhook is paused — best subscribed on\na separately-monitored receiver) or poll `GET /webhooks/{id}/health`, which returns the\ncurrent rolling-hour failure rate, the auto-disable threshold, and the `disabled_at`\ntimestamp once tripped. All deliveries (including failures) are visible on the dashboard\nfor 30 days.\n\n`POST /webhooks`\n\n_operationId:_ `registerWebhook`",
      "method": "POST",
      "url": "{{ base_url }}/webhooks",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"url\": \"https://api.acme.com/hooks/geog\",\n  \"events\": [\n    \"job.complete\",\n    \"job.failed\",\n    \"webhook.disabled\"\n  ],\n  \"description\": \"Production plume results \\u2192 SOC pipeline\",\n  \"active\": true\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 40,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_9c4fc045014241ec7b075887",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Retrieve a single registered webhook",
      "description": "Returns the current configuration of one webhook. The signing `secret` is **not**\nreturned — it is only available on the original `POST /webhooks` response. Rotate by\ndeleting and re-registering.\n\n`GET /webhooks/{webhook_id}`\n\n_operationId:_ `getWebhook`",
      "method": "GET",
      "url": "{{ base_url }}/webhooks/{webhook_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 41,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_fa71a397c462f25b589ab925",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Update a registered webhook",
      "description": "Partially updates a webhook. Send only the fields you want to change. Common uses:\ntoggling `active` to pause/resume deliveries, re-pointing `url` after a backend\nmigration, or narrowing the subscribed `events`.\n\nThe signing `secret` cannot be changed via this endpoint. To rotate it, `DELETE` the\nwebhook and register a new one with `POST /webhooks` — store the new secret from that\nresponse, then cut over your verification code.\n\n`PATCH /webhooks/{webhook_id}`\n\n_operationId:_ `updateWebhook`",
      "method": "PATCH",
      "url": "{{ base_url }}/webhooks/{webhook_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"url\": \"https://api.acme.com/hooks/geog-v2\",\n  \"events\": [\n    \"job.complete\",\n    \"job.failed\",\n    \"webhook.disabled\"\n  ],\n  \"description\": \"Production plume results \\u2192 SOC pipeline (v2)\",\n  \"active\": false\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 42,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_3d52d18825f01eab65401db4",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Delete a registered webhook",
      "description": "Permanently removes a webhook. Deliveries already in flight may still arrive briefly,\nbut no new deliveries will be queued. Use this to revoke a leaked endpoint or to rotate\nthe signing secret (delete, then `POST /webhooks` to register a fresh one).\n\n`DELETE /webhooks/{webhook_id}`\n\n_operationId:_ `deleteWebhook`",
      "method": "DELETE",
      "url": "{{ base_url }}/webhooks/{webhook_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 43,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_2e6314353ad01804d9daa7cc",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Send a synthetic event to a webhook to verify the receiver",
      "description": "Generates a synthetic delivery for the registered webhook and POSTs it to the URL\nexactly as a real event would be sent — same envelope shape, same `X-Geog-Signature`\nHMAC, same retry rules. Designed for day-one verification of a brand-new receiver\nbefore any real job has run: confirm that the URL is reachable, the TLS certificate\nis valid, and the receiver's signature-verification code accepts the payload.\n\n## Distinguishing test deliveries\n\nTest deliveries carry an additional `X-Geog-Test: true` header on the outbound POST,\nand the resulting `WebhookDelivery` record reports `test: true`. The synthetic\n`job_id` is prefixed `job_test_` so it cannot collide with a real job. Either signal\nis safe to gate on; the header is recommended so the receiver can short-circuit\nproduction side-effects (alerting, billing, downstream writes) before parsing the\nbody.\n\nTest deliveries appear in `GET /webhooks/{id}/deliveries` alongside real ones, are\nsubject to the same retry schedule and auto-disable rules, and are throttled to 60\ntest deliveries per webhook per hour (`TEST_RATE_LIMITED`).\n\n`POST /webhooks/{id}/test`\n\n_operationId:_ `sendWebhookTestEvent`",
      "method": "POST",
      "url": "{{ base_url }}/webhooks/whk_01hx2f8q7n3tdvm5j/test",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"event\": \"job.complete\"\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 44,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_6abda9a5d95bf2f5cbd0eab2",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "List recent deliveries for a webhook",
      "description": "Returns a paginated list of delivery attempts for the given webhook, newest first.\nMirrors the delivery log shown on the dashboard and is intended for debugging\nreceiver-side bugs without waiting for the next real job.\n\nDeliveries are retained for 30 days; older records return an empty page rather than\nan error. Use the `status` filter to narrow to actively-failing deliveries you may\nwant to replay after fixing your handler.\n\n`GET /webhooks/{id}/deliveries`\n\n_operationId:_ `listWebhookDeliveries`",
      "method": "GET",
      "url": "{{ base_url }}/webhooks/whk_01hx2f8q7n3tdvm5j/deliveries",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "status",
          "value": "failed",
          "description": "Filter results to a single delivery status. Default returns all statuses.",
          "disabled": true
        },
        {
          "name": "event",
          "value": "job.complete",
          "description": "Filter results to a single event type.",
          "disabled": true
        },
        {
          "name": "test",
          "value": "True",
          "description": "Filter by delivery origin. `true` returns only synthetic deliveries produced\nby `POST /webhooks/{id}/test`; `false` returns only real job-driven\ndeliveries. Omit (the default) to return both kinds.\n\nComposes with `status` and `event` using AND semantics — for example,\n`?test=true&status=failed` returns only failed test deliveries, useful when\nverifying a brand-new receiver without scrolling past real job results.\n",
          "disabled": true
        },
        {
          "name": "created_after",
          "value": "2026-04-21T02:00:00Z",
          "description": "Inclusive lower bound on the delivery's `created_at` timestamp (ISO 8601, UTC).\nOnly deliveries first queued at or after this instant are returned.\n\nComposes with `status`, `event`, and `test` using AND semantics — for example,\n`?status=failed&created_after=2026-04-21T02:00:00Z&created_before=2026-04-21T03:00:00Z`\nreturns only failed deliveries queued during that one-hour window, useful for\nscoping a debug session to a known outage. Bounded by the 30-day retention window.\n",
          "disabled": true
        },
        {
          "name": "created_before",
          "value": "2026-04-21T03:00:00Z",
          "description": "Exclusive upper bound on the delivery's `created_at` timestamp (ISO 8601, UTC).\nOnly deliveries first queued strictly before this instant are returned.\n\nMay be combined with `created_after` to define a closed-open `[after, before)`\nrange, or used on its own to scope to \"everything older than X\". Composes with\n`status`, `event`, and `test` using AND semantics, identical to the other filters.\n",
          "disabled": true
        },
        {
          "name": "limit",
          "value": "25",
          "description": "Page size (max 100).",
          "disabled": true
        },
        {
          "name": "cursor",
          "value": "",
          "description": "Opaque pagination cursor returned as `meta.next_cursor` on the previous page. Omit for the first page.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 45,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_4034c5db8376d4d428b3ea9b",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Export filtered deliveries as CSV",
      "description": "Returns the same filtered, paginated rows as `GET /webhooks/{id}/deliveries`,\nserialised as a CSV stream rather than a JSON envelope. Intended for one-off\nops investigations: pipe the response into a file, hand it to a teammate, or\npaste it into a spreadsheet without scripting against the JSON endpoint.\n\nThe response uses `Content-Type: text/csv; charset=utf-8` and is sent with\n`Content-Disposition: attachment; filename=\"deliveries-<webhook_id>.csv\"`\nso browsers and `curl -OJ` save it directly to disk.\n\n## CSV format\n\n- First row is a header. Columns are emitted in this fixed order, matching\n  the JSON `WebhookDelivery` fields:\n\n  `id,webhook_id,event,job_id,status,attempt_count,response_code,response_ms,response_body_excerpt,error,signature_timestamp,created_at,last_attempt_at,delivered_at,next_attempt_at,test`\n\n- Rows are newest-first, identical to the JSON ordering.\n- Values follow [RFC 4180](https://datatracker.ietf.org/doc/html/rfc4180):\n  fields containing commas, quotes, or newlines are wrapped in double quotes,\n  and embedded double quotes are doubled (`\"` → `\"\"`). The\n  `response_body_excerpt` column in particular often needs quoting.\n- JSON `null` values (e.g. `job_id` for non-job events, `delivered_at` while\n  still pending) are emitted as **empty fields**, not the literal string\n  `null`. The `test` boolean is emitted as `true` / `false`.\n- Timestamps are ISO 8601 UTC, identical to the JSON representation.\n- Line terminator is `\\r\\n`.\n\n## Filters\n\nHonours all the same query parameters as the JSON endpoint with identical\nAND semantics: `status`, `event`, `test`, `created_after`, `created_before`,\n`limit`, and `cursor`. The 30-day retention window applies — older rows are\nsimply absent from the CSV rather than producing an error.\n\n## Pagination\n\nCSV bodies cannot carry a JSON `meta` object, so the next-page cursor is\nreturned in the **`X-Next-Cursor` response header**. When there are no more\npages the header is omitted. To export every matching delivery, follow the\ncursor:\n\n```bash\ncursor=\"\"\nwhile :; do\n  resp=$(curl -sS -D - -H \"Authorization: Bearer $GEOG_KEY\" \\\n    \"https://api.geog.ai/v1/webhooks/$ID/deliveries.csv?status=failed${cursor:+&cursor=$cursor}\")\n  # append body (stripping the header row on subsequent pages) to the output file...\n  cursor=$(printf '%s' \"$resp\" | awk 'BEGIN{IGNORECASE=1} /^x-next-cursor:/ {print $2}' | tr -d '\\r')\n  [ -z \"$cursor\" ] && break\ndone\n```\n\nThe same `meta.request_id` value that the JSON endpoint returns is exposed\nas the `X-Request-Id` response header for support tickets.\n\n`GET /webhooks/{id}/deliveries.csv`\n\n_operationId:_ `exportWebhookDeliveriesCsv`",
      "method": "GET",
      "url": "{{ base_url }}/webhooks/whk_01hx2f8q7n3tdvm5j/deliveries.csv",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "status",
          "value": "failed",
          "description": "Filter results to a single delivery status. Default returns all statuses. Identical semantics to the JSON endpoint.",
          "disabled": true
        },
        {
          "name": "event",
          "value": "job.complete",
          "description": "Filter results to a single event type. Identical semantics to the JSON endpoint.",
          "disabled": true
        },
        {
          "name": "test",
          "value": "True",
          "description": "Filter by delivery origin. `true` returns only synthetic deliveries\nproduced by `POST /webhooks/{id}/test`; `false` returns only real\njob-driven deliveries. Omit (the default) to return both kinds.\nComposes with `status` and `event` using AND semantics, identical to\nthe JSON endpoint.\n",
          "disabled": true
        },
        {
          "name": "created_after",
          "value": "2026-04-21T02:00:00Z",
          "description": "Inclusive lower bound on the delivery's `created_at` timestamp\n(ISO 8601, UTC). Identical semantics to the JSON endpoint —\nfor example, `?status=failed&created_after=2026-04-21T02:00:00Z&created_before=2026-04-21T03:00:00Z`\nexports only failed deliveries queued during that one-hour window,\nuseful for handing a teammate the exact slice that lines up with an\noutage.\n",
          "disabled": true
        },
        {
          "name": "created_before",
          "value": "2026-04-21T03:00:00Z",
          "description": "Exclusive upper bound on the delivery's `created_at` timestamp\n(ISO 8601, UTC). May be combined with `created_after` to define a\nclosed-open `[after, before)` range. Identical semantics to the JSON\nendpoint.\n",
          "disabled": true
        },
        {
          "name": "limit",
          "value": "25",
          "description": "Page size (max 100). Identical default and bounds to the JSON endpoint.",
          "disabled": true
        },
        {
          "name": "cursor",
          "value": "",
          "description": "Opaque pagination cursor returned in the `X-Next-Cursor` response\nheader on the previous page. Omit for the first page. The cursor\nformat is interchangeable with the JSON endpoint's `meta.next_cursor`.\n",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 46,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_569091bbd8b7d30ef15136df",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Re-send a previously attempted webhook delivery",
      "description": "Re-queues a previously attempted delivery for immediate re-send to the webhook's\ncurrently registered URL. Useful after fixing a receiver-side bug — there is no need\nto wait for the next real job.\n\n**Replays use the original payload and signature timestamp.** The exact bytes that\nwere originally signed are re-sent, and the original `X-Geog-Signature` (including\nits `t=` value) and `X-Geog-Delivery` ID are reused. This means:\n\n- HMAC verification on the receiver behaves identically to the original delivery.\n- The 5-minute replay-window check (`|now - t| > 300`) **will reject the request**\n  if the original signature timestamp is older than 5 minutes. Receivers that need\n  to accept replays of old deliveries should relax this check for requests carrying\n  a known `X-Geog-Delivery` ID.\n- Idempotent receivers keyed on `X-Geog-Delivery` will naturally deduplicate.\n\nThe replay attempt counts toward the webhook's retry budget and the delivery's\n`attempt_count` is incremented. Calling replay on a delivery whose `status` is\nalready `pending` returns `409 DELIVERY_ALREADY_PENDING`.\n\n`POST /webhooks/{id}/deliveries/{delivery_id}/replay`\n\n_operationId:_ `replayWebhookDelivery`",
      "method": "POST",
      "url": "{{ base_url }}/webhooks/whk_01hx2f8q7n3tdvm5j/deliveries/whd_01hx2g4n8p7rqzm3k/replay",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 47,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_6b649e049574492026723685",
      "_type": "request",
      "parentId": "fld_fdfe2da709ca2c4f3b21ce6a",
      "name": "Read the rolling-hour delivery health for a webhook",
      "description": "Returns the same rolling-window failure-rate counters that drive the platform's\nauto-disable rule, plus the current `active` / `disabled_reason` state. Use this\nendpoint to detect — programmatically, without depending on the account owner's\ninbox — when a webhook has been auto-disabled after sustained delivery failures\n(≥50% failed deliveries in the last hour), or is trending toward it.\n\nTypical patterns:\n\n- **Polling guard.** Call once a minute from the same job that registered the\n  webhook. Alert your own on-call channel as soon as `status == \"degraded\"`\n  (failure rate has crossed 25%) so you can fix the receiver before the platform\n  auto-disables it. Treat `status == \"disabled\"` with `disabled_reason ==\n  \"auto_failure_rate\"` as a hard incident.\n- **Post-mortem.** After receiving a `webhook.disabled` event delivery (or the\n  owner-email alert), call this endpoint to read `failure_rate`, `failed_count`,\n  `undeliverable_count`, and `last_success_at` to understand exactly what tripped\n  the auto-disable rule.\n\nThis endpoint is read-only and cheap — it does not consume webhook delivery quota\nand is rate-limited only by the standard account-level rate limit.\n\n`GET /webhooks/{id}/health`\n\n_operationId:_ `getWebhookHealth`",
      "method": "GET",
      "url": "{{ base_url }}/webhooks/whk_01hx2f8q7n3tdvm5j/health",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 48,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "fld_bebdf38b02f0b482f8da08b4",
      "_type": "request_group",
      "parentId": "wrk_geog_ai",
      "name": "STAC Catalog",
      "description": "",
      "metaSortKey": -487
    },
    {
      "_id": "req_a054cd29e0649b7e7ebc2224",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "STAC catalog root",
      "description": "STAC-API §1.0.0 catalog root. Carries the conformance set and\nnavigation links. Tenant-scoped: collections listed are filtered\nto the caller's `vertical_ids` and own `tenant_id`.\n\n**Conformance set:** Core, Collections, OGC API Features, Item Search\n(GET + POST). CQL2 filter is intentionally **not** advertised — see\nthe geog.ai roadmap entry `geog-ai-15` for the planned addition.\n\n**Pricing:** $0.002 / call (read family, 2.0 cost units).\n\n`GET /v1/stac/`\n\n_operationId:_ `stacRoot`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 49,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_a93d62cbc13d55f34af37e6c",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "STAC conformance classes implemented by this server",
      "description": "`GET /v1/stac/conformance`\n\n_operationId:_ `stacConformance`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/conformance",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 50,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_ccb82fef64001a7a4495adce",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "List STAC Collections visible to the caller",
      "description": "One Collection per `(engine, vertical_id)` tuple the tenant has\nproduced jobs for. Each Collection carries `extent.spatial.bbox`,\n`extent.temporal.interval`, a per-tenant `license` (varies by plan),\nand a `providers` chain naming geog.ai as licensor and the engine\nas processor.\n\n`GET /v1/stac/collections`\n\n_operationId:_ `stacCollections`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/collections",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 51,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_2d71dcadc52ea9c122e43fa9",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "Fetch a single STAC Collection",
      "description": "`GET /v1/stac/collections/{collection_id}`\n\n_operationId:_ `stacCollection`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/collections/{collection_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 52,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_2049057a64db0573a3b3ebdf",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "List STAC Items within a Collection",
      "description": "`GET /v1/stac/collections/{collection_id}/items`\n\n_operationId:_ `stacCollectionItems`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/collections/{collection_id}/items",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "bbox",
          "value": "",
          "description": "WGS84 bbox `min_lng,min_lat,max_lng,max_lat`. Pushed into PostGIS via ST_Intersects.",
          "disabled": true
        },
        {
          "name": "datetime",
          "value": "",
          "description": "ISO 8601 instant (`2024-01-01T00:00:00Z`) or interval (`start/end`, `..` for open ends).",
          "disabled": true
        },
        {
          "name": "limit",
          "value": "50",
          "description": "",
          "disabled": true
        },
        {
          "name": "cursor",
          "value": "",
          "description": "Opaque HMAC-signed pagination cursor returned by the previous page's `next` link.",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 53,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_0e3655df664ae2d5bcdfc4d1",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "Fetch a single STAC Item",
      "description": "`GET /v1/stac/collections/{collection_id}/items/{item_id}`\n\n_operationId:_ `stacItem`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/collections/{collection_id}/items/{item_id}",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 54,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_f16f7133f70c29d03c191958",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "STAC Item Search (GET)",
      "description": "STAC §15 Item Search. Supported predicates:\n  - `bbox` — pushed into PostGIS via `ST_Intersects`.\n  - `datetime` — ISO instant or `start/end` interval.\n  - `collections` — comma-separated `{engine}__{vertical_id}` list.\n  - `limit` / `cursor` — opaque signed pagination.\n\nTenant-scoped: every result row is intersected against the caller's\n`vertical_ids` and `tenant_id` (per Phase 3 §3.11 acceptance\ncriterion 9). CQL2 filtering is **not** supported on this\nendpoint — see roadmap entry `geog-ai-15`.\n\n`GET /v1/stac/search`\n\n_operationId:_ `stacSearchGet`",
      "method": "GET",
      "url": "{{ base_url }}/v1/stac/search",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        }
      ],
      "parameters": [
        {
          "name": "bbox",
          "value": "",
          "description": "",
          "disabled": true
        },
        {
          "name": "datetime",
          "value": "",
          "description": "",
          "disabled": true
        },
        {
          "name": "collections",
          "value": "",
          "description": "",
          "disabled": true
        },
        {
          "name": "limit",
          "value": "50",
          "description": "",
          "disabled": true
        },
        {
          "name": "cursor",
          "value": "",
          "description": "",
          "disabled": true
        }
      ],
      "body": {},
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 55,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    },
    {
      "_id": "req_64b776fa7539c5d3e5895247",
      "_type": "request",
      "parentId": "fld_bebdf38b02f0b482f8da08b4",
      "name": "STAC Item Search (POST)",
      "description": "Identical predicate set to `GET /v1/stac/search`, sent as a JSON\nbody. STAC clients use this surface when query strings would\nexceed proxy URL-length limits, or when posting array-shaped\n`bbox` / `collections` values.\n\n`POST /v1/stac/search`\n\n_operationId:_ `stacSearchPost`",
      "method": "POST",
      "url": "{{ base_url }}/v1/stac/search",
      "headers": [
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "parameters": [],
      "body": {
        "mimeType": "application/json",
        "text": "{\n  \"bbox\": [\n    -100.0,\n    31.0,\n    -99.5,\n    32.0\n  ],\n  \"datetime\": \"2026-04-01T00:00:00Z/2026-04-30T23:59:59Z\",\n  \"collections\": [\n    \"plume_aermod__oilgas\"\n  ],\n  \"limit\": 50\n}"
      },
      "authentication": {
        "type": "bearer",
        "token": "{{ api_key }}",
        "prefix": ""
      },
      "metaSortKey": 56,
      "settingStoreCookies": true,
      "settingSendCookies": true,
      "settingDisableRenderRequestBody": false,
      "settingEncodeUrl": true,
      "settingRebuildPath": true,
      "settingFollowRedirects": "global"
    }
  ]
}
