{
  "name": "unmap",
  "description": "Worldwide vector maps and Canadian geocoding and routing as agent-callable services. Find a Canadian address or place by name and get its coordinates, identify what is at a coordinate, list nearby places of a given category, plan a driving, cycling, walking or truck route, and compute travel-time isochrones. Map tiles cover the world; geocoding and routing cover Canada. Relief and elevation are separate HTTP services whose active DEM release and extent are recorded at https://api.unmap.dev/coverage.json; Canadian vector contours retain their own coverage. Open data, with English, French and, where source data carries them, Indigenous-language names.",
  "supportedInterfaces": [
    {
      "url": "https://api.unmap.dev/a2a",
      "protocolBinding": "JSONRPC",
      "protocolVersion": "1.0"
    }
  ],
  "provider": {
    "organization": "unmap",
    "url": "https://unmap.dev"
  },
  "version": "3.2.0",
  "documentationUrl": "https://unmap.dev/docs/agents/a2a",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "extendedAgentCard": false
  },
  "securitySchemes": {
    "bearer": {
      "httpAuthSecurityScheme": {
        "description": "An unmap API key as a bearer token: `Authorization: Bearer um_sk_live_...`.",
        "scheme": "Bearer"
      }
    },
    "apiKey": {
      "apiKeySecurityScheme": {
        "description": "An unmap API key in its own header: `X-API-Key: um_sk_live_...`.",
        "location": "header",
        "name": "X-API-Key"
      }
    }
  },
  "securityRequirements": [
    {
      "schemes": {
        "bearer": {
          "list": []
        }
      }
    },
    {
      "schemes": {
        "apiKey": {
          "list": []
        }
      }
    }
  ],
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "skills": [
    {
      "id": "geocode_search",
      "name": "Search Canadian places",
      "description": "Find Canadian addresses, streets, localities, regions and points of interest by name. BM25-ranked over roughly 19 million records, with bilingual and Indigenous-language names on the same record. Use this when you have a complete query and want the best answer. Canada only: a query for somewhere else returns nothing useful rather than an error.",
      "tags": [
        "geocoding",
        "search",
        "canada",
        "addresses",
        "places",
        "maps"
      ],
      "examples": [
        "{\"skill\": \"geocode_search\", \"query\": \"17 Ave SW, Calgary\", \"limit\": 3}",
        "{\"skill\": \"geocode_search\", \"query\": \"rue Sainte-Catherine, Montréal\", \"language\": \"fr\"}"
      ]
    },
    {
      "id": "geocode_reverse",
      "name": "Look up what is at a coordinate",
      "description": "Find the Canadian places nearest to a longitude/latitude, ordered by true geodesic distance. Use this to turn a coordinate into an address or place name. A coordinate outside Canada is an error, outside_coverage, not the nearest Canadian place. A longitude or latitude outside WGS84 is 400 bad_request, not that code.",
      "tags": [
        "geocoding",
        "reverse",
        "canada",
        "coordinates",
        "maps"
      ],
      "examples": [
        "{\"skill\": \"geocode_reverse\", \"coordinate\": [-114.0625, 51.0447]}"
      ]
    },
    {
      "id": "geocode_nearby",
      "name": "Find places of a kind nearby",
      "description": "Find Canadian features of a given category near a point, nearest first: pharmacies, cafés, parking, schools and so on. Categories are canonical ids like 'health.pharmacy', or plain English or French words like 'pharmacy' or 'pharmacie', which the API resolves for you. Prefer this over geocode_search whenever the question is 'what kind of thing is near here', because free text search cannot express a category and will match street names instead. A point outside Canada is outside_coverage, not the nearest Canadian place. A longitude or latitude outside WGS84 is 400 bad_request, not that code.",
      "tags": [
        "geocoding",
        "poi",
        "categories",
        "nearby",
        "canada",
        "maps"
      ],
      "examples": [
        "{\"skill\": \"geocode_nearby\", \"categories\": [\"health.pharmacy\"], \"near\": [-114.0625, 51.0447], \"radius\": 2000}"
      ]
    },
    {
      "id": "route",
      "name": "Get directions between two points",
      "description": "Road distance, travel time and the route line between two points on the Canadian road graph. Exactly two points: there are no intermediate waypoints, so build a multi-stop trip one leg at a time. Pass steps: true for written turn-by-turn directions, in English or French (language); there is no voice narration. An endpoint outside Canada is outside_coverage. A longitude or latitude outside WGS84 is 400 invalid_location, not that code. A Canadian trip the graph cannot connect, including Iqaluit to the mainland, is no_route.",
      "tags": [
        "routing",
        "directions",
        "navigation",
        "canada",
        "maps",
        "travel"
      ],
      "examples": [
        "{\"skill\": \"route\", \"from\": [-114.0625, 51.0447], \"to\": [-113.4909, 53.5461], \"mode\": \"auto\"}",
        "{\"skill\": \"route\", \"from\": [-73.5673, 45.5017], \"to\": [-73.5540, 45.5088], \"steps\": true, \"language\": \"fr\"}"
      ]
    },
    {
      "id": "isochrone",
      "name": "Map how far you can get in a given time",
      "description": "Travel-time polygons ('how far can I get in 10 minutes') around a point in Canada, returned as GeoJSON. At most four time bands, each 120 minutes or less. Road modes use the road graph; mode 'transit' walks and rides scheduled transit from depart_at, and a transit band can be a MultiPolygon because a ride reaches separate areas. A centre outside Canada is outside_coverage, and the graph is not asked; so is a transit centre with no scheduled transit nearby. A longitude or latitude outside WGS84 is 400 invalid_location, not that code.",
      "tags": [
        "routing",
        "isochrone",
        "reachability",
        "geojson",
        "canada",
        "maps"
      ],
      "examples": [
        "{\"skill\": \"isochrone\", \"near\": [-79.3832, 43.6532], \"minutes\": [5, 10, 15], \"mode\": \"pedestrian\"}",
        "{\"skill\": \"isochrone\", \"near\": [-79.3806, 43.6452], \"minutes\": [30, 60], \"mode\": \"transit\", \"depart_at\": \"2026-10-15T08:30\"}"
      ]
    },
    {
      "id": "identify",
      "name": "Identify what is at a point",
      "description": "Ask which Canadian catalog features contain a coordinate: which municipality, which survey cell, which well or pipeline or parcel. This is the click-at-a-point question, and it is not the same as reverse geocoding: geocode_reverse finds the nearest named places, identify returns the polygons the point falls inside. Defaults to municipalities, which every key can read. Industry layers need their add-on.",
      "tags": [
        "identify",
        "catalog",
        "canada",
        "layers",
        "point-in-polygon"
      ],
      "examples": [
        "{\"skill\": \"identify\", \"coordinate\": [-114.0719, 51.0447]}",
        "{\"skill\": \"identify\", \"coordinate\": [-114.0719, 51.0447], \"layers\": [\"survey.dls\"]}"
      ]
    },
    {
      "id": "data_query",
      "name": "List catalog features in a bounding box",
      "description": "Pull the features of one Canadian catalog layer that fall inside a bounding box: every well in a township, every survey cell over a map view. One layer per call. A layer that only draws as tiles and has no queryable table says so and names the ones that do.",
      "tags": [
        "catalog",
        "query",
        "bbox",
        "canada",
        "layers"
      ],
      "examples": [
        "{\"skill\": \"data_query\", \"layer\": \"energy.wells\", \"bbox\": [-114.3, 50.9, -113.8, 51.2]}"
      ]
    },
    {
      "id": "list_layers",
      "name": "List the Canadian layer catalog",
      "description": "The named Canadian layers unmap serves, with the source, licence, attribution, coverage and known gaps of each, plus which add-on it needs and whether it answers identify and bbox queries. Read this before promising a layer to a user: coverage is recorded honestly per layer and several are one province rather than national. Needs no arguments and touches no backend.",
      "tags": [
        "catalog",
        "layers",
        "canada",
        "licensing",
        "coverage"
      ],
      "examples": [
        "{\"skill\": \"list_layers\"}",
        "{\"skill\": \"list_layers\", \"addon\": \"energy\"}"
      ]
    }
  ]
}
