{"name":"Geocode AI","description":"Look up any administrative boundary in the world (country, state, county, city, district, postcode) by name or point and get its polygon in one call, or describe an area in plain language and get a validated polygon back. REST, MCP, CLI and plugins for Claude and Codex.","docs":"https://geo-coder-service.vercel.app/docs","openapi":"https://geo-coder-service.vercel.app/openapi.json","mcp":"https://geo-coder-service.vercel.app/mcp","llms":"https://geo-coder-service.vercel.app/llms.txt","auth":"Authorization: Bearer geo_… (free key at https://geo-coder-service.vercel.app/dashboard)","instructions":"Geocode AI. Boundaries and areas API for every place on Earth. Administrative boundaries come from OpenStreetMap and are cached, so repeat lookups are instant.\n\nWorkflow:\n1. A named place (country, state, county, city, district, postcode): search_boundaries with the name (add the country or parent to disambiguate), pick the result whose admin level and parents match, then get_boundary with its id for the polygon. Never guess an id.\n2. A coordinate: reverse_boundaries returns every boundary containing it, country down to neighbourhood.\n3. Everything inside a boundary (states of a country, counties of a state): list_children with the parent's id.\n4. Which zone each of many points falls in: contains_points (one batch, not one call per point).\n5. Several boundaries as one shape: union_boundaries with their ids.\n6. A described area that is not one named place (\"the Bay Area minus San Francisco\", a service area clause from a contract): create_area with the text. It runs an AI agent for 30 s to a few minutes and costs 50 units, so use it only when search + get cannot answer.\n7. Missing feature or a bug: list_feedback, then upvote_feedback a match, else (with the human's OK) request_feature or report_issue. The board is public: no keys or personal data.\n\nBoundary ids are r<OSM relation id> (r396499) or w<way id>; R62422, relation/62422 and osm.org URLs are accepted on input, the canonical form comes back. Reuse ids already in the conversation.\n\nCosts: one unit per boundary geometry, reverse lookup or point batch; searching and browsing are free; a described area is 50 units. The Free plan includes 1,000 units a month. On a 402 (quota) stop and tell the human; never upgrade a plan. get_pricing has the current plans.\n\nWithout a key only the public tools work (20 calls a minute per IP). A free key (geo_…) from https://geo-coder-service.vercel.app/dashboard or `npx @meterapp/geocode login` unlocks the rest.\n\nResults are GeoJSON (WGS84, lon/lat order). When you show a polygon to a human, say which boundary it is (name, admin level, parent) so they can confirm it is the right one.\n\nTools:\n- search_boundaries (free, no key needed): Search boundaries.\n- get_boundary (1 unit, no key needed): Get boundary polygon.\n- export_boundary (1 unit): Export boundary file.\n- reverse_boundaries (1 unit): Boundaries at a point.\n- list_children (free, no key needed): List subdivisions.\n- contains_points (units vary with the input): Points in boundary.\n- union_boundaries (units vary with the input): Merge boundaries.\n- create_area (50 units): Create area from a description.\n- get_account (free): Get account.\n- update_profile (free): Update profile.\n- get_usage (free): Get usage.\n- list_api_keys (free): List API keys.\n- create_api_key (free): Create API key.\n- revoke_api_key (free): Revoke API key.\n- get_email_preferences (free): Get email preferences.\n- update_email_preferences (free): Update email preferences.\n- list_feedback (free, no key needed): List feature requests and issues.\n- get_feedback (free, no key needed): Get a feature request or issue.\n- request_feature (free): Request a feature.\n- report_issue (free): Report an issue.\n- upvote_feedback (free): Upvote a feature request or issue.\n- remove_feedback_vote (free): Remove an upvote.\n- comment_on_feedback (free): Comment on a feature request or issue.\n- get_pricing (free, no key needed): Get plans and prices.\n\nREST: https://geo-coder-service.vercel.app/openapi.json · Docs for agents: https://geo-coder-service.vercel.app/llms.txt","ops":[{"name":"search_boundaries","group":"boundaries","title":"Search boundaries","description":"Finds administrative boundaries (countries, states, counties, cities, districts) and postcode areas by name, in any language. Filter by country, kind or admin_level; bias toward a point with near. Free and public. Returns candidates with id, kind, admin_level, country, parents, bbox, centroid and population, but no polygon: pass the id to get_boundary for that.","read_only":true,"public":true,"units":0,"http":{"method":"GET","path":"/v1/boundaries/search"},"rpc":{"method":"POST","path":"/v1/ops/search_boundaries"},"input_schema":{"type":"object","properties":{"q":{"type":"string","minLength":1,"maxLength":200,"description":"A place name, e.g. \"Berlin\", \"Alameda County\", \"75011\"."},"country":{"description":"Limit to countries: ISO 3166-1 alpha-2, comma-separated (e.g. US or de,at,ch).","type":"string","pattern":"^[A-Za-z]{2}(,[A-Za-z]{2})*$"},"kind":{"description":"Only this kind (normalized across countries): country, state, region, province, county, district, municipality, city, borough, ward, neighbourhood, postal_code.","type":"string","enum":["country","state","region","province","county","district","municipality","city","borough","ward","neighbourhood","postal_code"]},"admin_level":{"description":"Only this OSM admin_level (2 = country; meaning varies by country below that).","type":"integer","minimum":1,"maximum":12},"near":{"description":"lat,lon to prefer results near, e.g. 37.77,-122.42.","type":"string","pattern":"^\\s*-?\\d+(\\.\\d+)?\\s*,\\s*-?\\d+(\\.\\d+)?\\s*$"},"limit":{"default":10,"description":"At most this many results (1–40, default 10).","type":"integer","minimum":1,"maximum":40}},"required":["q"]},"example":{"q":"Alameda County","country":"US"}},{"name":"get_boundary","group":"boundaries","title":"Get boundary polygon","description":"Returns one boundary as a GeoJSON Feature: its polygon at a chosen detail plus properties (name, kind, admin_level, parents, bbox, area_km2, population, wikidata). Fetched from OpenStreetMap the first time anyone asks, then served from cache. Costs 1 unit; detail=low is also public without a key (for map previews). include=parents adds the full hierarchy, include=children the direct subdivisions. If the polygon is too big for one response, geometry is null and download_url points to the file.","read_only":true,"public":true,"units":1,"http":{"method":"GET","path":"/v1/boundaries/{id}"},"rpc":{"method":"POST","path":"/v1/ops/get_boundary"},"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Boundary id: r<OSM relation id> (e.g. r62422 for Berlin) or w<way id>. Also accepts R62422, relation/62422, -62422, an openstreetmap.org URL, wikidata:Q64 or iso:US-CA."},"detail":{"description":"Simplification relative to the boundary's size: low (~1,000 points across; the default without a key), medium (the default with a key, ~5,000), high (~25,000), full (unsimplified OSM).","type":"string","enum":["low","medium","high","full"]},"precision":{"description":"Coordinate decimals (3–7). Defaults to what the detail level needs.","type":"integer","minimum":3,"maximum":7},"include":{"description":"Comma-separated extras: parents, children.","type":"array","items":{"type":"string","enum":["parents","children"]}}},"required":["id","include"]},"example":{"id":"r62422","detail":"low","include":["parents"]}},{"name":"export_boundary","group":"boundaries","title":"Export boundary file","description":"Builds a boundary's polygon as a file (geojson, kml, wkt, svg or gml) at a detail level and returns a permanent public URL on our CDN; the REST route redirects straight to it. Use it for large polygons, GIS tools and bulk downloads. Costs 1 unit; each file is built once and then shared.","read_only":true,"public":false,"units":1,"http":{"method":"GET","path":"/v1/boundaries/{id}.{format}"},"rpc":{"method":"POST","path":"/v1/ops/export_boundary"},"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Boundary id: r<OSM relation id> (e.g. r62422 for Berlin) or w<way id>. Also accepts R62422, relation/62422, -62422, an openstreetmap.org URL, wikidata:Q64 or iso:US-CA."},"format":{"default":"geojson","description":"geojson (a Feature), kml, wkt, svg or gml.","type":"string","enum":["geojson","kml","wkt","svg","gml"]},"detail":{"default":"medium","description":"Simplification relative to the boundary's size: low (~1,000 points across, maps and previews), medium (default, ~5,000), high (~25,000), full (unsimplified OSM).","type":"string","enum":["low","medium","high","full"]}},"required":["id"]},"example":{"id":"r62422","format":"kml","detail":"medium"}},{"name":"reverse_boundaries","group":"boundaries","title":"Boundaries at a point","description":"Every administrative boundary containing a point, country first down to the smallest district, plus postcode areas. Use it to tag an address, a store or a delivery with its country, state, county and city in one call. Costs 1 unit. Returns ids you can pass to get_boundary.","read_only":true,"public":false,"units":1,"http":{"method":"GET","path":"/v1/boundaries/reverse"},"rpc":{"method":"POST","path":"/v1/ops/reverse_boundaries"},"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude, -90 to 90."},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude, -180 to 180."}},"required":["lat","lon"]},"example":{"lat":52.52,"lon":13.405}},{"name":"list_children","group":"boundaries","title":"List subdivisions","description":"The direct subdivisions of a boundary: a country's states, a state's counties, a city's districts. Without admin_level it picks the next level that exists. Free and public. Use it to build drill-down pickers or to cover a region with its parts.","read_only":true,"public":true,"units":0,"http":{"method":"GET","path":"/v1/boundaries/{id}/children"},"rpc":{"method":"POST","path":"/v1/ops/list_children"},"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Boundary id: r<OSM relation id> (e.g. r62422 for Berlin) or w<way id>. Also accepts R62422, relation/62422, -62422, an openstreetmap.org URL, wikidata:Q64 or iso:US-CA."},"admin_level":{"description":"Subdivision admin_level; default: the next level below the parent that exists.","type":"integer","minimum":3,"maximum":12}},"required":["id"]},"example":{"id":"r165475"}},{"name":"contains_points","group":"boundaries","title":"Points in boundary","description":"Tests up to 10,000 points ([lon, lat] pairs) against one boundary and returns a boolean per point plus the inside count. Use it for geofencing, service-area checks and filtering customer lists. Costs 1 unit per 1,000 points.","read_only":true,"public":false,"units":"varies","http":{"method":"POST","path":"/v1/boundaries/{id}/contains"},"rpc":{"method":"POST","path":"/v1/ops/contains_points"},"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Boundary id: r<OSM relation id> (e.g. r62422 for Berlin) or w<way id>. Also accepts R62422, relation/62422, -62422, an openstreetmap.org URL, wikidata:Q64 or iso:US-CA."},"points":{"minItems":1,"maxItems":10000,"type":"array","items":{"type":"array","prefixItems":[{"type":"number","minimum":-180,"maximum":180},{"type":"number","minimum":-90,"maximum":90}],"items":false,"minItems":2,"maxItems":2},"description":"Points as [lon, lat] (GeoJSON order)."}},"required":["id","points"]},"example":{"id":"r62422","points":[[13.405,52.52],[2.35,48.86]]}},{"name":"union_boundaries","group":"boundaries","title":"Merge boundaries","description":"Merges boundaries into one polygon: the union of include minus the union of exclude (e.g. three counties minus one city). Use it for sales territories, delivery zones and service areas. Up to 50 boundaries; costs 1 unit per boundary. Returns a GeoJSON Feature with area_km2. To describe an area in words instead, use create_area.","read_only":true,"public":false,"units":"varies","http":{"method":"POST","path":"/v1/boundaries/union"},"rpc":{"method":"POST","path":"/v1/ops/union_boundaries"},"input_schema":{"type":"object","properties":{"include":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":200,"description":"Boundary id: r<OSM relation id> (e.g. r62422 for Berlin) or w<way id>. Also accepts R62422, relation/62422, -62422, an openstreetmap.org URL, wikidata:Q64 or iso:US-CA."},"description":"Boundary ids to merge."},"exclude":{"default":[],"description":"Boundary ids to cut out.","maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":200,"description":"Boundary id: r<OSM relation id> (e.g. r62422 for Berlin) or w<way id>. Also accepts R62422, relation/62422, -62422, an openstreetmap.org URL, wikidata:Q64 or iso:US-CA."}},"detail":{"default":"medium","description":"Simplification relative to the boundary's size: low (~1,000 points across, maps and previews), medium (default, ~5,000), high (~25,000), full (unsimplified OSM).","type":"string","enum":["low","medium","high","full"]}},"required":["include"]},"example":{"include":["r396499","r396479"],"exclude":["r2833530"],"detail":"low"}},{"name":"create_area","group":"areas","title":"Create area from a description","description":"Turns a plain-language description of an area (\"Alameda and Contra Costa counties excluding San Jose, plus SFO\") or wording from a contract or policy into one validated land-only polygon. An AI agent plans includes/excludes from real administrative boundaries; you get GeoJSON plus each part's source, or a 422 explaining what could not be mapped. Takes 30 s to a few minutes. For a single named place use search_boundaries + get_boundary instead: it is instant and costs 1 unit.","read_only":false,"public":false,"units":50,"http":{"method":"POST","path":"/v1/areas"},"rpc":{"method":"POST","path":"/v1/ops/create_area"},"input_schema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":3000,"description":"The description of the area."},"country":{"description":"ISO 3166-1 alpha-2 country code, if known.","type":"string","minLength":2,"maxLength":2},"source":{"description":"Who wrote the description (agency, company). Optional context.","type":"string","maxLength":200},"seed":{"description":"A point that must be inside the area.","type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lon"]}},"required":["text"]},"example":{"text":"Alameda and Contra Costa counties, excluding the City of Oakland","country":"US"}},{"name":"get_account","group":"account","title":"Get account","description":"The signed-in account: email, plan, this month's usage against the plan's limit, and rate limit. Call it to check remaining quota before a large batch.","read_only":true,"public":false,"units":0,"http":{"method":"GET","path":"/v1/account"},"rpc":{"method":"POST","path":"/v1/ops/get_account"},"input_schema":{"type":"object","properties":{}},"example":null},{"name":"update_profile","group":"account","title":"Update profile","description":"Sets the account's name, company and use case (what you are building). Send only the fields to change; an empty string clears one. Free. Returns the updated profile.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/account"},"rpc":{"method":"POST","path":"/v1/ops/update_profile"},"input_schema":{"type":"object","properties":{"name":{"description":"Your name, used in emails (\"Hey {first name},\").","type":"string","maxLength":120},"company":{"description":"Company or project.","type":"string","maxLength":120},"use_case":{"description":"What you are building with boundaries and areas.","type":"string","maxLength":1000}}},"example":{"name":"Ada Lovelace","company":"Analytical Engines","use_case":"Delivery zones from postcodes"}},{"name":"get_usage","group":"usage","title":"Get usage","description":"Daily usage for the last N days (default 30), by op, with cache hit counts. Use it to explain a bill or spot a runaway client.","read_only":true,"public":false,"units":0,"http":{"method":"GET","path":"/v1/usage"},"rpc":{"method":"POST","path":"/v1/ops/get_usage"},"input_schema":{"type":"object","properties":{"days":{"default":30,"description":"How many days back.","type":"integer","minimum":1,"maximum":90}}},"example":null},{"name":"list_api_keys","group":"keys","title":"List API keys","description":"The account's API keys (prefix, name, last use; never the secret).","read_only":true,"public":false,"units":0,"http":{"method":"GET","path":"/v1/keys"},"rpc":{"method":"POST","path":"/v1/ops/list_api_keys"},"input_schema":{"type":"object","properties":{"include_revoked":{"default":false,"type":"boolean"}}},"example":null},{"name":"create_api_key","group":"keys","title":"Create API key","description":"Creates an API key and returns the secret once. Store it in an environment variable (GEOCODE_API_KEY); it cannot be shown again.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/keys"},"rpc":{"method":"POST","path":"/v1/ops/create_api_key"},"input_schema":{"type":"object","properties":{"name":{"default":"Default key","description":"A label, e.g. the app or environment.","type":"string","minLength":1,"maxLength":80}}},"example":{"name":"production"}},{"name":"revoke_api_key","group":"keys","title":"Revoke API key","description":"Revokes an API key by id. Requests with it fail with 401 immediately.","read_only":false,"public":false,"units":0,"http":{"method":"DELETE","path":"/v1/keys/{id}"},"rpc":{"method":"POST","path":"/v1/ops/revoke_api_key"},"input_schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The key's id from list_api_keys."}},"required":["id"]},"example":null},{"name":"get_email_preferences","group":"account","title":"Get email preferences","description":"Which automated emails the account receives: the global subscription and one switch per kind (getting-started notes, first boundary, usage milestones, quota warnings, check-ins, monthly digest). Free. Sign-in codes are always sent.","read_only":true,"public":false,"units":0,"http":{"method":"GET","path":"/v1/account/email-preferences"},"rpc":{"method":"POST","path":"/v1/ops/get_email_preferences"},"input_schema":{"type":"object","properties":{}},"example":null},{"name":"update_email_preferences","group":"account","title":"Update email preferences","description":"Turns automated emails on or off: `subscribed: false` stops all of them (the same as the unsubscribe link), `subscribed: true` resubscribes, and `kinds` switches individual kinds. Kinds not named keep their setting. Free. Returns the preferences after the change.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/account/email-preferences"},"rpc":{"method":"POST","path":"/v1/ops/update_email_preferences"},"input_schema":{"type":"object","properties":{"subscribed":{"description":"false = unsubscribe from every automated email; true = resubscribe.","type":"boolean"},"kinds":{"description":"Per-kind switches, e.g. {\"digest\": false}.","type":"object","properties":{"journey":{"description":"A few short notes in your first two weeks, each with the next step.","type":"boolean"},"first_boundary":{"description":"One note when you fetch your first boundary.","type":"boolean"},"milestone":{"description":"When your account passes 100, 1,000, 10,000 or 100,000 requests.","type":"boolean"},"quota":{"description":"When you have used 80% and 100% of this month's plan.","type":"boolean"},"winback":{"description":"A note if your API keys go quiet for a few weeks.","type":"boolean"},"digest":{"description":"On the 1st: last month's requests, cache hits and top operations.","type":"boolean"}}}}},"example":{"kinds":{"digest":false}}},{"name":"list_feedback","group":"feedback","title":"List feature requests and issues","description":"The public feedback board: feature requests and issue reports with their status and upvotes, most upvoted first. Free and needs no key (with a key, each item says whether you voted). Call it before request_feature or report_issue to find an existing item to upvote instead of filing a duplicate, or when the human asks what is planned.","read_only":true,"public":true,"units":0,"http":{"method":"GET","path":"/v1/feedback"},"rpc":{"method":"POST","path":"/v1/ops/list_feedback"},"input_schema":{"type":"object","properties":{"kind":{"default":"all","description":"feature = feature requests, issue = bug reports.","type":"string","enum":["feature","issue","all"]},"status":{"default":"active","description":"active = open, planned or in progress.","type":"string","enum":["active","all","open","planned","in_progress","done","declined","duplicate"]},"sort":{"default":"top","description":"top = most upvoted, new = most recent.","type":"string","enum":["top","new"]},"q":{"description":"Words to find in the title.","type":"string","maxLength":100},"mine":{"description":"Only items you filed (needs a key).","anyOf":[{"type":"boolean"},{"type":"string","enum":["true","false"]}]},"limit":{"default":20,"description":"Page size, at most 100.","type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}},"example":{"kind":"feature","q":"postcode"}},{"name":"get_feedback","group":"feedback","title":"Get a feature request or issue","description":"One feedback item with its status, upvotes and comments. Free and needs no key.","read_only":true,"public":true,"units":0,"http":{"method":"GET","path":"/v1/feedback/{id}"},"rpc":{"method":"POST","path":"/v1/ops/get_feedback"},"input_schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]},"example":{"id":1}},{"name":"request_feature","group":"feedback","title":"Request a feature","description":"Files a feature request on the public board and upvotes it for you. Use it when the human wants something the API cannot do yet (a boundary type, export format, op or option). Check list_feedback first and upvote an existing request instead of filing a duplicate. Free; needs a key; 10 new items per account a day. Returns the item and similar existing requests. Everything on the board is public (never the author's email). Do not include API keys, personal data or customer data.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/feedback/features"},"rpc":{"method":"POST","path":"/v1/ops/request_feature"},"input_schema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":140,"description":"What you want, in one line."},"details":{"default":"","description":"Why you need it and what you are building; concrete examples help it get planned.","type":"string","maxLength":5000}},"required":["title"]},"example":{"title":"Export boundaries as Shapefile","details":"Our GIS team imports zones into ArcGIS, which wants .shp."}},{"name":"report_issue","group":"feedback","title":"Report an issue","description":"Reports a problem on the public board: a failing or wrong API call (pass its request_id from the X-Request-Id header or the error's request_id, and the op), a wrong or missing boundary, a docs error, or anything else broken. Check list_feedback with kind=issue first and upvote a matching report instead. Free; needs a key; 10 new items per account a day. Only you see the request_id. Everything on the board is public (never the author's email). Do not include API keys, personal data or customer data.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/feedback/issues"},"rpc":{"method":"POST","path":"/v1/ops/report_issue"},"input_schema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":140,"description":"What is wrong, in one line."},"details":{"default":"","description":"What you did, what you expected and what happened (status, error code, boundary id).","type":"string","maxLength":5000},"request_id":{"description":"The request_id of the failing call, if there was one.","type":"string","maxLength":100},"op":{"description":"The op the failing call used, e.g. get_boundary.","type":"string","maxLength":80}},"required":["title"]},"example":{"title":"get_boundary returns 404 for r62422","details":"Berlin by relation id: 404 not_found since this morning.","op":"get_boundary"}},{"name":"upvote_feedback","group":"feedback","title":"Upvote a feature request or issue","description":"Adds your upvote to a feature request or issue; votes decide what gets built and fixed first. Idempotent: one vote per account. A vote on a duplicate goes to the original. Free; needs a key. Returns the item with its new vote count.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/feedback/{id}/vote"},"rpc":{"method":"POST","path":"/v1/ops/upvote_feedback"},"input_schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]},"example":{"id":1}},{"name":"remove_feedback_vote","group":"feedback","title":"Remove an upvote","description":"Takes back your upvote on a feature request or issue. Free; needs a key. Returns the item with its new vote count.","read_only":false,"public":false,"units":0,"http":{"method":"DELETE","path":"/v1/feedback/{id}/vote"},"rpc":{"method":"POST","path":"/v1/ops/remove_feedback_vote"},"input_schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]},"example":{"id":1}},{"name":"comment_on_feedback","group":"feedback","title":"Comment on a feature request or issue","description":"Adds context to an existing feature request or issue: your use case, another failing request, a workaround. Prefer it (with upvote_feedback) over filing a near-duplicate. Free; needs a key; 50 comments per account a day. Everything on the board is public (never the author's email). Do not include API keys, personal data or customer data.","read_only":false,"public":false,"units":0,"http":{"method":"POST","path":"/v1/feedback/{id}/comments"},"rpc":{"method":"POST","path":"/v1/ops/comment_on_feedback"},"input_schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."},"body":{"type":"string","minLength":1,"maxLength":5000,"description":"The comment."}},"required":["id","body"]},"example":{"id":1,"body":"Same for us: we need this for French départements."}},{"name":"get_pricing","group":"account","title":"Get plans and prices","description":"The plans (monthly price, included units, rate limit) and what each kind of call costs in units. Free and needs no key. Call it before a large batch, or when the human asks what something costs; never quote prices from memory.","read_only":true,"public":true,"units":0,"http":{"method":"GET","path":"/v1/pricing"},"rpc":{"method":"POST","path":"/v1/ops/get_pricing"},"input_schema":{"type":"object","properties":{}},"example":{}}]}