{"schema_version":"1.1.0","sign_convention":"negative mm/yr = subsidence (sinking); positive = uplift","units":{"primary":"mm_yr","also":"in_yr","factor_mm_to_in":0.0393701,"selector_param":"units=mm|in"},"assessment_code":{"enum":["rapid_subsidence","notable_subsidence","stable","mild_uplift","strong_uplift","no_clear_trend"],"thresholds_mm_yr":{"rapid_subsidence":"v <= -8","notable_subsidence":"-8 < v <= -3","stable":"-3 < v < 3","mild_uplift":"3 <= v < 8","strong_uplift":"v >= 8","no_clear_trend":"abs(v) <= velocity_uncertainty_mm_yr (margin >= signal; OVERRIDES the sign-based codes above)"}},"confidence_tier":{"enum":["measured","likely","within_margin"],"from":"signal_to_noise = abs(velocity_vertical_mm_yr) / velocity_uncertainty_mm_yr","thresholds":{"measured":"SNR >= 2 — direction is confident (trust the sign + magnitude)","likely":"1 <= SNR < 2 — leans a direction but within one margin (suggestive, NOT conclusive)","within_margin":"SNR < 1 — the rate is inside its error bar (split by within_margin_kind)"},"note":"route DIRECTION on assessment_code, but gate TRUST on confidence_tier"},"within_margin_kind":{"enum":["stable","inconclusive",null],"note":"present only when confidence_tier=='within_margin'","stable":"a CONFIDENT no-significant-movement PASS (a real green-flag answer, BILLED $0.40)","inconclusive":"the radar can't give a trustworthy rate here (low coherence / stale) = a non-answer, returned as status:'inconclusive' with cost_usd:0 (NEVER billed — on motion, batch, and PDF)"},"signal_to_noise":{"type":"number","note":"abs(velocity_vertical_mm_yr) / velocity_uncertainty_mm_yr — the raw ratio behind confidence_tier"},"differential_motion":{"note":"optional block; present when the ground moves unevenly over ~150 m (neighbor_spread_mm_yr > 3). The foundation-relevant signal — uneven motion cracks buildings, uniform motion usually doesn't.","fields":["neighbor_spread_mm_yr","note"]},"trend":{"enum":["subsiding","stable","uplifting","no_clear_trend"]},"data_freshness":{"enum":["current","recent","stale","very_stale","unknown"],"days":{"current":"<=120","recent":"<=365","stale":"<=730","very_stale":">730"}},"calibration":{"enum":["gps_tied","relative"]},"geocode_match_type":{"enum":["coordinates","rooftop_interpolated","street_interpolated","area_centroid"],"scores":{"coordinates":1.0,"rooftop_interpolated":0.9,"street_interpolated":0.7,"area_centroid":0.4}},"motion_status":{"discriminator":"status","enum":["ok","no_data","no_coverage","stale_data","low_confidence","low_geocode_precision","no_new_data","inconclusive"],"billed":["ok"],"note":"every non-ok status is FREE (cost_usd:0). Discriminate on 'status'. 'inconclusive' = the honest free non-answer (see confidence_tier / within_margin_kind)."},"batch_item_status":{"enum":["ok","no_data","no_coverage","no_new_data","skipped_for_budget","insufficient_credits","invalid_item","invalid_address","unprocessed","inconclusive"]},"async_job_status":{"enum":["queued","processing","done","error"]},"error_codes":{"note":"JSON errors are {error(code), message, retryable, doc_url, request_id}","enum":["unauthorized","login_required","invalid_api_key","insufficient_credits","spend_cap_reached","forbidden_referer","account_suspended","rate_limited","address_not_found","need_address_or_coords","invalid_coordinates","bad_request","too_many_items","job_not_found","key_not_found","frame_not_found","invalid_email","disposable_email","email_exists","bad_mock","bad_amount","bad_method","message_required","card_unavailable","crypto_unavailable","stripe_error","crypto_error","invalid_arguments"]},"mcp_arg_map":{"note":"MCP tool args differ from REST param names","check_ground_motion":"explain->brief; supports dry_run/max_age_days/min_confidence/since; NOT units/fields/include/mock","get_motion_history":"from_date->reference_date, to_date->reference_date2 (both required for a delta); supports dry_run/max_age_days","get_account":"-> GET /api/v1/balance","check_portfolio":"addresses[] only (no per-item gates)","register_agent":"-> POST /api/v1/autonomous/register (no auth needed)","buy_credits":"-> POST /api/v1/buy (Bearer)"},"buy_api":{"endpoint":"POST /api/v1/buy","body":{"amount_usd":"1..10000","method":"stripe|crypto"},"returns":"checkout_url (stripe) or invoice_url+txn_id (crypto); credits land automatically after payment — poll /api/v1/balance"},"free_gates":["dry_run","max_age_days","min_confidence","since","min_geocode_score","min_significance"],"confidence_semantics":{"confidence":"pixel DATA quality (coherence x record length) — NOT trend certainty","trend_certainty":"use significant_nonzero / dry_run's likely_significant / the min_significance gate","why":"a 0.99-confidence pixel can still yield no_clear_trend when |velocity| <= uncertainty"},"test_mode":{"how":"POST /api/v1/autonomous/register {email, mode:'test'} -> sf_test_ key, $100 fake credits","behavior":"synthetic data, /api/v1/buy auto-credits, full billing lifecycle rehearsable at $0"},"webhooks":{"endpoint":"POST /api/v1/webhooks","events":["frame.updated","balance.low","batch.done"],"signing":"Standard-Webhooks style: HMAC-SHA256(secret, webhook-id + '.' + webhook-timestamp + '.' + body)"},"payload_control":["compact","fields","units"],"decision_tree":"get_coverage (free) or motion?dry_run=1 (free) to confirm coverage+cost -> motion to buy ($0.40) -> route on assessment_code. Misses & gated results are free.","index":"https://sibfly.com/api/v1","docs":"https://sibfly.com/llms.txt"}