curl --request POST \
--url https://app.govly.com/api/tools/v1/places/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"categories": [],
"isoCodes": [
"<string>"
],
"cursor": "<string>",
"perPage": 25
}
'import requests
url = "https://app.govly.com/api/tools/v1/places/search"
payload = {
"query": "<string>",
"categories": [],
"isoCodes": ["<string>"],
"cursor": "<string>",
"perPage": 25
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
categories: [],
isoCodes: ['<string>'],
cursor: '<string>',
perPage: 25
})
};
fetch('https://app.govly.com/api/tools/v1/places/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.govly.com/api/tools/v1/places/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'categories' => [
],
'isoCodes' => [
'<string>'
],
'cursor' => '<string>',
'perPage' => 25
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.govly.com/api/tools/v1/places/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"categories\": [],\n \"isoCodes\": [\n \"<string>\"\n ],\n \"cursor\": \"<string>\",\n \"perPage\": 25\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.govly.com/api/tools/v1/places/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"categories\": [],\n \"isoCodes\": [\n \"<string>\"\n ],\n \"cursor\": \"<string>\",\n \"perPage\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.govly.com/api/tools/v1/places/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"categories\": [],\n \"isoCodes\": [\n \"<string>\"\n ],\n \"cursor\": \"<string>\",\n \"perPage\": 25\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"name": "<string>",
"category": "postal_code",
"jurisdictionIsoCode": "<string>",
"hasRecords": true,
"nameMatch": "exact"
}
],
"meta": {
"perPage": 123,
"returned": 123,
"nextCursor": "<string>"
}
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}Resolve place names to canonical Place ids
Resolve a place name to canonical Govly Place ids — counties, municipalities, states, ZIP codes, school districts, military installations, and countries. Results are relevance-ranked with records-bearing places first. Paging walks the matches for a query, not a category — use /api/tools/v1/places/list to enumerate a jurisdiction. Place ids are market-agnostic, but opportunity and award searches are market-scoped, so a returned id may not be searchable under the caller’s subscription.
curl --request POST \
--url https://app.govly.com/api/tools/v1/places/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"categories": [],
"isoCodes": [
"<string>"
],
"cursor": "<string>",
"perPage": 25
}
'import requests
url = "https://app.govly.com/api/tools/v1/places/search"
payload = {
"query": "<string>",
"categories": [],
"isoCodes": ["<string>"],
"cursor": "<string>",
"perPage": 25
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
categories: [],
isoCodes: ['<string>'],
cursor: '<string>',
perPage: 25
})
};
fetch('https://app.govly.com/api/tools/v1/places/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.govly.com/api/tools/v1/places/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'categories' => [
],
'isoCodes' => [
'<string>'
],
'cursor' => '<string>',
'perPage' => 25
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.govly.com/api/tools/v1/places/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"categories\": [],\n \"isoCodes\": [\n \"<string>\"\n ],\n \"cursor\": \"<string>\",\n \"perPage\": 25\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.govly.com/api/tools/v1/places/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"categories\": [],\n \"isoCodes\": [\n \"<string>\"\n ],\n \"cursor\": \"<string>\",\n \"perPage\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.govly.com/api/tools/v1/places/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"categories\": [],\n \"isoCodes\": [\n \"<string>\"\n ],\n \"cursor\": \"<string>\",\n \"perPage\": 25\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"name": "<string>",
"category": "postal_code",
"jurisdictionIsoCode": "<string>",
"hasRecords": true,
"nameMatch": "exact"
}
],
"meta": {
"perPage": 123,
"returned": 123,
"nextCursor": "<string>"
}
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The place name to resolve, such as "redstone arsenal".
200Restrict to these place categories, to disambiguate a name shared across categories.
postal_code, county, municipality, region, country, military_installation, school_district Restrict to these jurisdiction codes, matched exactly (e.g. US-NC). Not hierarchical — "US" matches only the country record. A bare foreign code such as "JP" scopes overseas military installations.
Opaque cursor from the previous response's meta.nextCursor. Omit for the first page. Only valid for the exact query, categories, and isoCodes that produced it.
Results per page. Default 25, maximum 100.
x <= 100Was this page helpful?