{"slug": "tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly", "title": "Tell your AI agent if the ground is sinking: measured ground-motion with SibFly + LangChain", "summary": "SibFly packages NASA's OPERA Sentinel-1 InSAR satellite data into a single API call that returns measured ground motion for any US address, in mm/year. A LangChain agent can query the service in about 30 lines of code, with free dry runs and a pay-per-reading model that only charges for valid, high-confidence results. The tool is also available as an MCP server for any MCP client.", "body_md": "Most \"is this property risky?\" data your agent can reach is *modeled* — a prediction from soil maps and flood zones. There's a different, underused signal: **measured** ground motion. Satellites have been tracking how far the ground has physically moved, to the millimeter, for years.\n\n[SibFly](https://sibfly.com) packages that into one call: give it a US address, get back how fast the ground is sinking or rising, in mm/year, derived from NASA's OPERA Sentinel-1 InSAR dataset. Measured, not modeled. Negative = sinking.\n\nThis post wires it into a LangChain agent in about 30 lines.\n\nGround subsidence (sinking) quietly wrecks foundations, and it's invisible on a normal map. It shows up in radar interferometry (InSAR): compare two satellite passes over the same spot and you can measure sub-centimeter vertical change. NASA processes this for all of North America and publishes it for free — but the raw data is 400 MB HDF5 granules in radar geometry, not something an agent can query per address.\n\nSibFly does the ETL and serves the pixel: `GET /api/v1/motion?address=...`\n\n→ a JSON verdict.\n\n```\npip install -U langchain-sibfly\nexport SIBFLY_API_KEY=\"sf_live_...\"\n```\n\nGrab a key with free starter credits at [sibfly.com](https://sibfly.com). Agents can also self-register with no human in the loop:\n\n```\ncurl -X POST https://sibfly.com/api/v1/autonomous/register \\\n  -H \"Content-Type: application/json\" -d '{\"email\":\"you@example.com\"}'\n# -> { \"api_key\": \"sf_live_...\", \"credits_usd\": 1.0, ... }\npython\nfrom langchain_sibfly import SibflyGroundMotion\n\nmotion = SibflyGroundMotion()  # reads SIBFLY_API_KEY\n\nprint(motion.invoke({\"address\": \"1100 Congress Ave, Austin, TX\"}))\n{\n    \"status\": \"ok\",\n    \"velocity_vertical_mm_yr\": -6.0,\n    \"velocity_uncertainty_mm_yr\": 1.5,\n    \"assessment_code\": \"notable_subsidence\",\n    \"confidence\": 0.86,\n    \"data_age_days\": 73,\n    \"cost_usd\": 0.4,\n    \"credits_remaining_usd\": 0.6,\n}\n```\n\nRoute your logic on `assessment_code`\n\n— a stable enum (`rapid_subsidence`\n\n, `notable_subsidence`\n\n, `stable`\n\n, `mild_uplift`\n\n, `strong_uplift`\n\n) — not on the human-readable string.\n\nThe thing I appreciate as someone who builds agents: **misses are free.** Out-of-coverage, no-data, too-stale, and low-confidence responses all come back HTTP 200 with `cost_usd: 0`\n\n. You only pay $0.40 when you get a real covered reading. And there's a free preview:\n\n```\n# free: coverage + confidence + would_cost_usd, no charge\nmotion.invoke({\"lat\": 30.3244, \"lon\": -97.8102, \"dry_run\": True})\n```\n\nYou can also refuse to pay for data you'd reject, server-side:\n\n``` php\nmotion.invoke({\n    \"address\": \"...\",\n    \"max_age_days\": 400,     # too old -> free \"stale_data\"\n    \"min_confidence\": 0.7,   # too noisy -> free \"low_confidence\"\n})\npython\nfrom langchain_sibfly import SibflyGroundMotion\nfrom langchain_anthropic import ChatAnthropic\nfrom langgraph.prebuilt import create_react_agent\n\nagent = create_react_agent(\n    ChatAnthropic(model=\"claude-sonnet-5\"),\n    tools=[SibflyGroundMotion()],\n)\n\nout = agent.invoke({\"messages\": [\n    (\"user\", \"Is the ground sinking under 1100 Congress Ave, Austin TX? \"\n             \"Check coverage first so we don't waste a call.\")\n]})\nprint(out[\"messages\"][-1].content)\n```\n\nThe agent will typically `dry_run`\n\nfirst (free), see it's covered, then pull the real reading.\n\nSibFly also runs a hosted MCP server, so any MCP client can use it with no SDK:\n\n```\nhttps://sibfly.com/mcp   (Streamable HTTP, Bearer auth)\n```\n\nIt's in the official MCP registry as `com.sibfly/ground-motion`\n\n. Tools: `check_ground_motion`\n\n, `check_coverage`\n\n, `check_portfolio`\n\n, `get_motion_history`\n\n, `get_account`\n\n.\n\nThis is a **screening** signal, not an engineering survey. It tells you a parcel is moving and roughly how fast; it doesn't replace a geotechnical report. SibFly returns an uncertainty (`±mm/yr`\n\n), a confidence score, and a `neighbor_consistent`\n\nflag so your agent can tell a real trend from a single noisy pixel. Treat it like a credit-score check: fast, cheap, directional.\n\n`llama-index-tools-sibfly`", "url": "https://wpnews.pro/news/tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly", "canonical_source": "https://dev.to/jamessib/tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly-langchain-2dc1", "published_at": "2026-07-01 01:19:15+00:00", "updated_at": "2026-07-01 01:48:40.164753+00:00", "lang": "en", "topics": ["developer-tools", "artificial-intelligence", "ai-agents"], "entities": ["SibFly", "NASA", "OPERA Sentinel-1", "LangChain", "LangGraph", "Claude", "MCP"], "alternates": {"html": "https://wpnews.pro/news/tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly", "markdown": "https://wpnews.pro/news/tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly.md", "text": "https://wpnews.pro/news/tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly.txt", "jsonld": "https://wpnews.pro/news/tell-your-ai-agent-if-the-ground-is-sinking-measured-ground-motion-with-sibfly.jsonld"}}