> ## Documentation Index
> Fetch the complete documentation index at: https://docs.govly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Enumerate every Place of a category within a jurisdiction

> Enumerate every canonical Govly Place of a category within a jurisdiction — every county in California, every school district in Texas. Use /api/tools/v1/places/search instead to look up a place by name; this endpoint takes no query and does no relevance ranking. Results are cursor-paginated: keep requesting with meta.nextCursor until it is null, or you have only part of the set. meta.total is the exact size of the full set. Ordering is stable but arbitrary, not alphabetical — sort client-side when presenting a list. At least one of categories or isoCodes is required. isoCodes matches the place's own code exactly and is not a hierarchy — "US" matches only the country record, so use "US-XX" to enumerate inside a state, while a bare foreign code such as "JP" correctly scopes overseas military installations. Unlike place search, hasRecords here is computed from live data rather than a search index.




## OpenAPI

````yaml /openapi/tools-v1.yaml post /api/tools/v1/places/list
openapi: 3.1.0
info:
  title: Govly Tools API (Alpha)
  version: 1.0.0-alpha
  description: >
    ALPHA / UNSTABLE: This API is still in active development. Endpoint
    behavior, request fields, response fields, error codes, and operation names
    may change before the Tools API is declared stable.

    REST-callable tool surface for agent and automation workflows. Agents are
    the primary consumer, but integrations can be built on this API. Responses
    are JSON for typed clients; MCP tools may render action results into
    text-oriented formats separately.
servers:
  - url: https://app.govly.com
security:
  - bearerApiKey: []
  - headerApiKey: []
tags:
  - name: Opportunities
    description: Search, fetch, and inspect Govly opportunity records.
  - name: Awards
    description: Search and inspect awarded government contracts.
  - name: Contacts
    description: Search and inspect government points of contact.
  - name: Signals
    description: Search clustered procurement and market intelligence signals.
  - name: Places
    description: Resolve place names to canonical Govly Place ids.
  - name: Product Catalogs
    description: List government contract price lists and search their line items.
  - name: Workspaces
    description: Create, update, and inspect opportunity workspaces.
  - name: Workspace Members
    description: Add users and teams to workspaces.
  - name: Workspace Attachments
    description: List and upload workspace attachments.
  - name: Workspace Comments
    description: Post comments to workspaces.
  - name: Follows
    description: Follow opportunities and related workspace activity.
  - name: Saved Searches
    description: List saved opportunity searches and cached matches.
  - name: Documents
    description: >-
      Read document representations and request temporary original-file
      downloads.
  - name: Quote Submissions
    description: >-
      Inspect quote submission requirements, submit quotes, and poll submission
      status.
  - name: Inbox
    description: Read and triage the authenticated user's matched inbox items.
paths:
  /api/tools/v1/places/list:
    post:
      tags:
        - Places
      summary: Enumerate every Place of a category within a jurisdiction
      description: >
        Enumerate every canonical Govly Place of a category within a
        jurisdiction — every county in California, every school district in
        Texas. Use /api/tools/v1/places/search instead to look up a place by
        name; this endpoint takes no query and does no relevance ranking.
        Results are cursor-paginated: keep requesting with meta.nextCursor until
        it is null, or you have only part of the set. meta.total is the exact
        size of the full set. Ordering is stable but arbitrary, not alphabetical
        — sort client-side when presenting a list. At least one of categories or
        isoCodes is required. isoCodes matches the place's own code exactly and
        is not a hierarchy — "US" matches only the country record, so use
        "US-XX" to enumerate inside a state, while a bare foreign code such as
        "JP" correctly scopes overseas military installations. Unlike place
        search, hasRecords here is computed from live data rather than a search
        index.
      operationId: list_places
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                categories:
                  type: array
                  items:
                    type: string
                    enum:
                      - postal_code
                      - county
                      - municipality
                      - region
                      - country
                      - military_installation
                      - school_district
                  description: >-
                    Place categories to enumerate, such as county or
                    school_district.
                isoCodes:
                  type: array
                  maxItems: 60
                  items:
                    type: string
                  description: >
                    Jurisdiction codes to enumerate within, matched exactly
                    (e.g. US-CA). Not hierarchical — "US" matches only the
                    country record. At most 60 codes per call, which is above
                    the 53 needed to cover every US state and territory at once.
                perPage:
                  type: integer
                  default: 25
                  maximum: 100
                  description: Results per page. Default 25, maximum 100.
                cursor:
                  type: string
                  description: >
                    Opaque cursor from meta.nextCursor of the previous page. A
                    cursor is bound to the filters that produced it and is
                    rejected if you change them.
      responses:
        '200':
          description: A page of places
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - meta
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Place'
                  meta:
                    $ref: '#/components/schemas/PlaceListMeta'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
components:
  schemas:
    Place:
      type: object
      description: A canonical Govly Place, resolved from a name.
      required:
        - id
        - name
        - category
        - jurisdictionIsoCode
        - hasRecords
      properties:
        id:
          type: string
          description: >
            Govly Place id, as a string. Matches the ES place_ids keyword field
            directly, so it can be used as a filter value without conversion.
        name:
          type: string
        category:
          type: string
          enum:
            - postal_code
            - county
            - municipality
            - region
            - country
            - military_installation
            - school_district
        jurisdictionIsoCode:
          type: string
          description: The place's own ISO 3166-1 or 3166-2 code, e.g. US or US-NC.
        hasRecords:
          type: boolean
          description: >
            False means the place is in the gazetteer but matches no
            opportunities or awards, so filtering by its id returns nothing.
        nameMatch:
          type: string
          enum:
            - exact
            - partial
            - semantic
          description: >
            How the name matched. Optional — omitted entirely when not
            applicable. semantic means the query did not really match and this
            is the nearest record; confirm before filtering on it. partial is
            expected for county and municipality lookups, whose canonical names
            carry a suffix.
    PlaceListMeta:
      type: object
      description: Cursor pagination metadata for place enumeration.
      required:
        - perPage
        - returned
        - total
      properties:
        perPage:
          type: integer
          description: Effective page size after clamping. Default 25, maximum 100.
        returned:
          type: integer
          description: Places on this page.
        total:
          type: integer
          description: >
            Exact size of the whole filtered set, independent of page size.
            Compare it against what you have collected to know whether the walk
            is complete.
        nextCursor:
          type: string
          nullable: true
          description: >
            Pass as cursor to fetch the next page. Null means the set is
            exhausted; keep requesting until it is, or you have only part of the
            answer. A cursor is bound to the filters that produced it and is
            rejected if you change them.
    ErrorEnvelope:
      type: object
      required:
        - errors
      properties:
        errors:
          type: array
          items:
            type: object
            required:
              - status
              - code
              - title
              - detail
            properties:
              status:
                type: string
              code:
                type: string
              title:
                type: string
              detail:
                type: string
              source:
                type: object
                properties:
                  pointer:
                    type: string
  responses:
    Error:
      description: Error response
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    bearerApiKey:
      type: http
      scheme: bearer
      bearerFormat: API key
    headerApiKey:
      type: apiKey
      in: header
      name: X-API-KEY

````