The ESRI service is the bridge between an ArcGIS Online feature layer and the Universal Pole Model. It reads poles from a feature layer into UPM documents, and writes analyzed results — findings, replacement priorities, fix proposals — back to the same layer (or a sibling result layer).

Direct REST access requires Tier B onboarding. URLs and bearer-token credentials are issued during embedder onboarding — until then, route equivalent calls through the Overhead gateway →. Email hello@epcstudio.io to start.

Authentication

ESRI calls require both your platform API key and an AGOL token scoped to the target feature layer. Pass the AGOL token in an X-AGOL-Token header.

Endpoints

POST /pull/polygon

Pull every pole feature inside a polygon into UPM documents.

curl https://$VERTICAL_AI_BASE_URL/pull/polygon \
  -H "Authorization: Bearer $VERTICAL_AI_KEY" \
  -H "X-AGOL-Token: $AGOL_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "feature_layer_url": "https://services.arcgis.com/.../FeatureServer/0",
    "polygon": { "rings": [[ [lon,lat], [lon,lat], ... ]] },
    "attachment_layer_url": "https://services.arcgis.com/.../FeatureServer/1"
  }'

Returns a list of UPM documents, one per pole feature inside the polygon, with attachments joined from the attachment layer.

POST /pull/feature

Pull a single feature by objectid or globalid. Same response shape, single-pole.

POST /push/results

Write analyzed results back to a feature layer. Configurable field map — point the request at your layer’s schema and tell the service which UPM finding/proposal fields go into which feature fields.

POST /push/symbols

Push standardized pole and equipment symbols (transformers, switches, risers) into a feature layer so the rendered map matches platform symbology.

Field mapping

The service ships with a default field map for common AGOL pole-attachment templates, but you almost always want to declare your own. Send a field_map object in the request body:

{
  "field_map": {
    "pole": {
      "objectid":   "OBJECTID",
      "height_ft":  "POLE_HEIGHT",
      "class":      "POLE_CLASS",
      "species":    "POLE_SPECIES"
    },
    "attachment": {
      "owner":      "ATTACH_OWNER",
      "height_ft":  "ATTACH_HEIGHT",
      "type":       "ATTACH_TYPE"
    },
    "result": {
      "verdict":    "ANALYSIS_VERDICT",
      "fix_summary":"FIX_SUMMARY",
      "fix_cost":   "FIX_COST_USD"
    }
  }
}

Fields the map doesn’t reference are left alone.

See also