GeoVerify Developer Documentation · v0.1

Verify everything.Trust the trail.

Production: https://geoverifylogisticssoftware.com/api/v1 (requires X-GeoVerify-Key) · Sandbox: https://geoverifylogisticssoftware.com/api (no key, mock telemetry) — routing-agnostic verification for any delivery, dispatch, TMS, or fleet stack.

Quickstart

Three steps to your first verified event:

1Set the X-GeoVerify-Key header on every request (demo tenant key: gvk_demo_7f3a9c1e55d24b8e6a01 — request your own via Request Access).
2POST /event/ingest with a raw delivery event — coordinates, timestamps, claims, telemetry.
3POST /event/verify and read truth_status in the response: true, partial, or false.
60-second integration
curl -X POST https://geoverifylogisticssoftware.com/api/v1/event/verify \
  -H "Content-Type: application/json" \
  -H "X-GeoVerify-Key: gvk_demo_7f3a9c1e55d24b8e6a01" \
  -d '{ "event": { "planned_coordinates": { "lat": 32.52, "lng": -92.11 },
        "actual_coordinates": { "lat": 32.52005, "lng": -92.11003 },
        "planned_eta": "2026-07-14T14:30:00Z",
        "timestamp": "2026-07-14T14:31:12Z",
        "claimed_event_type": "delivered", "observed_event_type": "delivered",
        "telemetry": { "speed_kmh": 0, "accuracy_m": 7 } } }'

# → { "truth_status": "true", "distance_delta_m": 6.1, … }

Versioning: production traffic targets /api/v1. The unversioned /api sandbox remains keyless for evaluation and powers the public playground.

Truth Definition

Everything GeoVerify returns derives from one formula. An event is TRUE only when all of the following hold:

The truth condition
TRUTH = distance(actual, planned)  <  max_deviation_radius_meters
      AND timestamp within allowed_arrival_window
      AND telemetry consistent (score >= threshold)
      AND claim matches observed event
      AND evidence present and validated
      AND geofence rules satisfied

Anything less decomposes into partial or false, with the exact failing signals returned as deltas, flags, and scenario tags. No black boxes — every verdict is reconstructible from the response.

Overview

GeoVerify is the truth layer for delivery networks. Your routing engine provides the plan, your driver provides the claim, your devices provide the telemetry — GeoVerify tells you what actually happened. Every event you ingest is evaluated by three deterministic engines (truth, compliance, anomaly) and sealed into an immutable, SHA-256 chained audit trail.

The typical flow: POST /event/ingest → POST /event/verify → retrieve results via GET /event/truth, GET /event/compliance, and GET /event/audit.

Authentication

Production tenants authenticate with an API key sent in the X-GeoVerify-Key header. Keys are scoped per tenant; every record is tenant-isolated. OAuth2/JWT federation is available on the Enterprise tier.

Authenticated request
curl -X POST https://geoverifylogisticssoftware.com/api/v1/event/verify \
  -H "Content-Type: application/json" \
  -H "X-GeoVerify-Key: gvk_live_…" \
  -d '{ "event": { … } }'

The sandbox endpoints (/api/*) powering the public playground require no key and run against mock telemetry only. Production endpoints live under /api/v1 and reject requests without a valid key with 401.

Data Model

The event object is the atomic unit of truth. Coordinates are WGS-84 decimal degrees; timestamps are ISO-8601 UTC.

Event object
{
  "event_id": "evt_9f31ac02b7",
  "route_id": "rt_monroe_4412",
  "driver_id": "drv_8834",
  "device_id": "dev_px7a_221",
  "planned_coordinates":  { "lat": 32.5200,  "lng": -92.1100 },
  "actual_coordinates":   { "lat": 32.52005, "lng": -92.11003 },
  "planned_eta": "2026-07-14T14:30:00Z",
  "timestamp":   "2026-07-14T14:31:12Z",
  "claimed_event_type":  "delivered",
  "observed_event_type": "delivered",
  "telemetry": {
    "speed_kmh": 0, "heading": 212, "accuracy_m": 7, "battery": 68,
    "previous_coordinates": { "lat": 32.5089, "lng": -92.1041 },
    "previous_timestamp": "2026-07-14T14:24:00Z",
    "photo": { "gps_embedded": true, "timestamp": "2026-07-14T14:31:10Z",
               "hash": "9f2c1ab7…" }
  }
}
FieldTypeRequired
planned_coordinates / actual_coordinates{lat, lng}yes
timestamp / planned_etaISO-8601 UTCyes
claimed_event_type / observed_event_typestringyes
telemetry.speed_kmh / accuracy_m / headingnumberrecommended
telemetry.photo.{gps_embedded, timestamp, hash}objectper ruleset
route_id / driver_id / device_idstringrecommended

Truth Engine Logic

An event is TRUE when every one of these holds:

Truth condition
truth = distance(actual, planned)   <  max_deviation_radius_meters   (150 m)
      AND |timestamp − planned_eta|   <= allowed_arrival_window_minutes (10 min)
      AND telemetry_score             >= telemetry_consistency_threshold (0.80)
      AND claimed_event_type          == observed_event_type
      AND photo metadata validated (GPS + timestamp + hash)
      AND geofence rules satisfied

Output includes truth_status (true / partial / false), distance_delta_m, time_delta_minutes, telemetry_score, claim_consistency_score, and scenario_tags such as late_arrival, off_route, geofence_breach, telemetry_mismatch.

Compliance Rules

The compliance engine applies regulatory-grade checks: geofence entry/exit (point-in-polygon over your registered polygons), arrival window compliance, proximity validation, route adherence, device-vs-driver claim consistency, and required evidence presence (photo, signature, telemetry).

Output: compliance_flags (e.g. arrival_window_met, geofence_breach), a normalized compliance_score, and human-readable regulatory_notes suitable for audit packets.

Anomaly Detection

AnomalyTriggerSeverity
impossible_travel_speedspeed > 160 km/h at event time0.95
location_jumpimplied speed between fixes > 160 km/h0.90
claim_contradictionclaimed ≠ observed event type0.80
gps_drift_suspectedaccuracy_m > 100 at event time0.60
missing_evidencerequired photo metadata absent0.40

Each anomaly ships with a severity score and a recommended action — quarantine the event, freeze the claim payout, or request re-verification.

Audit Layer

Every verification writes an append-only audit record. Records are SHA-256 chained (each signature covers the previous one), timestamped, and exportable — ready to hand to insurers, regulators, and internal audit.

GET /event/audit/{event_id} — response excerpt
{
  "event_id": "evt_9f31ac02b7",
  "chain_length": 2,
  "records": [{
    "seq": 4182,
    "signature": "3f9a…c21d",
    "previous_signature": "a01b…77e4",
    "algorithm": "SHA-256 chain (GV1)",
    "reconciliation_log": [
      "planned vs actual distance delta: 6.1 m",
      "arrival time delta: 1.2 min",
      "telemetry consistency score: 1.0",
      "compliance score: 1.0 (4 checks)"
    ],
    "immutable": true,
    "created_at": "2026-07-14T14:31:13.104Z"
  }]
}

GET /event/audit/{event_id}/export downloads a signed, self-contained audit packet (JSON attachment) combining the truth evaluation, compliance record, and full chain — with an export_signature and a chain_valid integrity check. Built to hand directly to insurers and regulators.

Endpoint Reference

POST/event/ingest

Send raw delivery events — coordinates, timestamps, route IDs, and driver claims. Returns an ingestion signature. Idempotent per event_id.

Request
POST https://geoverifylogisticssoftware.com/api/v1/event/ingest

{
  "event_id": "evt_9f31ac02b7",
  "route_id": "rt_monroe_4412",
  "driver_id": "drv_8834",
  "device_id": "dev_px7a_221",
  "planned_coordinates":  { "lat": 32.5200,  "lng": -92.1100 },
  "actual_coordinates":   { "lat": 32.52005, "lng": -92.11003 },
  "planned_eta": "2026-07-14T14:30:00Z",
  "timestamp":   "2026-07-14T14:31:12Z",
  "claimed_event_type":  "delivered",
  "observed_event_type": "delivered",
  "telemetry": {
    "speed_kmh": 0, "heading": 212, "accuracy_m": 7, "battery": 68,
    "previous_coordinates": { "lat": 32.5089, "lng": -92.1041 },
    "previous_timestamp": "2026-07-14T14:24:00Z",
    "photo": { "gps_embedded": true, "timestamp": "2026-07-14T14:31:10Z",
               "hash": "9f2c1ab7…" }
  }
}
Response · 200
{
  "event_id": "evt_9f31ac02b7",
  "ingested_at": "2026-07-14T14:31:12.8Z",
  "signature": "b7c1…9a0e"
}
POST/event/verify

Run truth + compliance + anomaly engines over a single event. Optionally pass a rules object to override tenant defaults. Writes an audit record.

Request
POST https://geoverifylogisticssoftware.com/api/v1/event/verify

{
  "event": { …event object… },
  "rules": { "max_deviation_radius_meters": 150 }
}
Response · 200
{
  "event_id": "evt_9f31ac02b7",
  "truth_status": "true",
  "distance_delta_m": 6.1,
  "time_delta_minutes": 1.2,
  "telemetry_score": 1.0,
  "claim_consistency_score": 1.0,
  "scenario_tags": ["clean_delivery"],
  "compliance_flags": [
    "arrival_window_met", "deviation_radius_ok",
    "proximity_validated", "evidence_complete"
  ],
  "compliance_score": 1.0,
  "regulatory_notes": [],
  "anomaly_tags": [],
  "severity_score": 0.0,
  "recommended_actions": [],
  "audit_signature": "3f9a…c21d",
  "audit_seq": 4182,
  "evaluated_at": "2026-07-14T14:31:13.104Z"
}
POST/event/verify/batch

Verify up to 100 events in a single call. Each event runs the full truth, compliance, and anomaly pipeline and writes its own audit record. Returns per-event packets plus fleet-level tallies.

Request
POST https://geoverifylogisticssoftware.com/api/v1/event/verify/batch

{
  "events": [ { …event… }, { …event… } ],
  "rules": { "allowed_arrival_window_minutes": 15 }
}
Response · 200
{
  "total": 100,
  "verified_true": 91,
  "partial": 6,
  "flagged_false": 3,
  "results": [ { …verification packet per event… } ]
}
GET/event/truth/{event_id}

Retrieve the stored truth evaluation for an event — distance delta, time delta, integrity scores, and scenario tags.

Response · 200
{
  "event_id": "evt_9f31ac02b7",
  "truth_status": "true",
  "distance_delta_m": 6.1,
  "time_delta_minutes": 1.2,
  "telemetry_score": 1.0,
  "claim_consistency_score": 1.0,
  "scenario_tags": ["clean_delivery"]
}
GET/event/compliance/{event_id}

Retrieve compliance flags, the normalized compliance score, and regulatory notes for an event.

Response · 200
{
  "event_id": "evt_9f31ac02b7",
  "compliance_flags": ["arrival_window_met", "deviation_radius_ok"],
  "compliance_score": 1.0,
  "regulatory_notes": []
}
GET/event/audit/{event_id}

Pull the immutable, chained audit trail for an event — signatures, reconciliation log, evidence hashes, truth and compliance summaries. Append /export for a signed downloadable packet.

GET/rules · PUT /rules

Read or update your tenant ruleset — arrival window, deviation radius, proximity threshold, telemetry threshold, and named zones (service_area, depot, no_go) the compliance engine enforces. Editable visually in the Zone Editor (/geofences).

Request
PUT https://geoverifylogisticssoftware.com/api/v1/rules

{
  "max_deviation_radius_meters": 150,
  "allowed_arrival_window_minutes": 10,
  "geofence_polygon": [ { "lat": 32.51, "lng": -92.12 }, … ]
}
Response · 200
{
  "ok": true,
  "tenant_id": "tn_4f2c9a01b3",
  "rules": { …merged ruleset… }
}
POST/webhooks/register

Register an HTTPS endpoint for signed deliveries — choose from event_verified, compliance_failed, anomaly_detected. The signing secret is returned exactly once. GET /webhooks lists subscriptions, DELETE /webhooks/{subscription_id} removes one.

Request
POST https://geoverifylogisticssoftware.com/api/v1/webhooks/register

{
  "url": "https://your-system.example/geoverify-hook",
  "events": ["anomaly_detected", "compliance_failed"]
}
Response · 200
{
  "subscription_id": "sub_7a19c2e04d",
  "secret": "whsec_…  (shown once)",
  "events": ["anomaly_detected", "compliance_failed"]
}

Webhooks

GeoVerify pushes verification outcomes to your systems the moment they happen. You register an HTTPS endpoint; we call it with a signed payload.

event_verifiedA verification completed — includes truth_status and deltas
compliance_failedAny compliance check failed — includes flags and regulatory notes
anomaly_detectedAn anomaly fired — includes tag, severity, recommended action
Webhook payload — event_verified
POST https://your-system.example/geoverify-hook
X-GeoVerify-Signature: hmac-sha256=…
X-GeoVerify-Event: event_verified

{
  "event_id": "evt_9f31ac02b7",
  "truth_status": "true",
  "compliance_score": 1.0,
  "anomaly_tags": [],
  "audit_signature": "3f9a…c21d",
  "occurred_at": "2026-07-14T14:31:13.104Z"
}

Verify every delivery with the X-GeoVerify-Signature HMAC header — an HMAC-SHA256 of the raw request body using your subscription secret. Rotate secrets anytime via POST /webhooks/{subscription_id}/rotate-secret — signing switches immediately and the previous secret remains acceptable for a 24h grace period, so rotation causes no downtime. Failed deliveries retry automatically with backoff (+10s, +30s, +90s) and every attempt is logged for audit. Registration is live: POST /api/v1/webhooks/register (see Endpoint Reference).

Error Codes

400Malformed coordinates or timestampValidate WGS-84 ranges and ISO-8601 format
404No record for event_idVerify the event before retrieving truth/audit
422Missing required fieldSee field table in Data Model
429Rate limit exceededPer-key per-minute limit (default 60, admin-tunable); honor Retry-After and back off
5xxEngine unavailableRetry with idempotency key; events are never double-charged

Best Practices

  • INGEST AT EVENT TIME — verification quality degrades with delayed telemetry.
  • ALWAYS SEND previous_coordinates — it powers location-jump and spoofing detection.
  • USE STABLE event_id VALUES — ingest and verify are idempotent per ID.
  • PIN RULESETS PER TENANT — geofences and windows should be versioned, not ad hoc.
  • EXPORT AUDIT CHAINS DAILY for insurer and regulatory reconciliation.
  • TEST IN THE PLAYGROUND — /playground runs the same engines against mock telemetry.
GeoVerify

The neutral truth layer for delivery networks. We don't replace your tools — we verify them.

SOC 2-ALIGNED CONTROLS

IMMUTABLE AUDIT TRAILS · SHA-256 CHAINED

WGS-84 COORDINATE VALIDATION

© 2026 GEOVERIFY SYSTEMS