Postfinder Places API

The directory as the site's pages have it: countries, regions, suburbs and places.

Operations 7

GET /v1/countries Every country the directory covers #
GET /v1/countries/{country} One country and its regions #
GET /v1/countries/{country}/regions/{region} One region and its suburbs #
GET /v1/countries/{country}/categories/{category} One kind of place across a country #
GET /v1/localities/{country}/{region}/{locality} One suburb: every place in it #
GET /v1/places Places in a suburb, filtered #
GET /v1/places/{publicID} One place in full #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/postfinder-io:postfinder-io-places-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

postfinder-io-places-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: PostFinder Places API
  version: 1.0.0
  description: 'The directory behind postfinder.io, as an API: post offices, post boxes, parcel lockers, drop off and collection points in Australia, New Zealand, the United Kingdom, the United States and Canada, and the suburbs and postcodes they sit in.'
  contact:
    name: PostFinder
    url: https://postfinder.io/en/contact/
servers:
- url: https://api.postfinder.io
  description: Production
security: []
tags:
- name: Places
  description: 'The directory as the site''s pages have it: countries, regions, suburbs and places.'
paths:
  /v1/countries:
    get:
      tags:
      - Places
      operationId: countries
      summary: Every country the directory covers
      description: Each with how many regions, suburbs and locations it holds.
      parameters: []
      responses:
        '200':
          description: The countries.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CountriesResponse'
  /v1/countries/{country}:
    get:
      tags:
      - Places
      operationId: country
      summary: One country and its regions
      description: The regions with a page, largest first.
      parameters:
      - name: country
        in: path
        required: true
        description: 'Country slug as the site''s URLs use it: australia, new-zealand, united-kingdom, united-states, canada.'
        example: australia
        schema:
          type: string
      responses:
        '200':
          description: The country.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CountryResponse'
        '404':
          description: No such country.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /v1/countries/{country}/regions/{region}:
    get:
      tags:
      - Places
      operationId: region
      summary: One region and its suburbs
      description: A page of the region's suburbs, alphabetical, with the total for paging.
      parameters:
      - name: country
        in: path
        required: true
        description: 'Country slug as the site''s URLs use it: australia, new-zealand, united-kingdom, united-states, canada.'
        example: australia
        schema:
          type: string
      - name: region
        in: path
        required: true
        description: Region slug.
        example: victoria
        schema:
          type: string
      - name: limit
        in: query
        required: false
        description: How many suburbs. Outside 1 to 500, the default applies.
        schema:
          type: integer
          minimum: 1
          maximum: 500
          default: 200
      - name: offset
        in: query
        required: false
        description: How many to skip, for the next page.
        schema:
          type: integer
          minimum: 0
          default: 0
      responses:
        '200':
          description: The region.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegionResponse'
        '404':
          description: No such region in that country.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /v1/countries/{country}/categories/{category}:
    get:
      tags:
      - Places
      operationId: category
      summary: One kind of place across a country
      description: '"Parcel lockers in Australia": counts per region and the busiest suburbs, not a national list of every locker. A category with nothing in it answers 404 rather than an empty page.'
      parameters:
      - name: country
        in: path
        required: true
        description: 'Country slug as the site''s URLs use it: australia, new-zealand, united-kingdom, united-states, canada.'
        example: australia
        schema:
          type: string
      - name: category
        in: path
        required: true
        description: The kind of place.
        example: parcel-lockers
        schema:
          type: string
          enum:
          - post-offices
          - post-boxes
          - express-post-boxes
          - parcel-lockers
          - drop-off-points
          - collection-points
      - name: region
        in: query
        required: false
        description: A region slug, to narrow the counts and the busiest suburbs to one region.
        schema:
          type: string
        example: victoria
      responses:
        '200':
          description: The category.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CategoryResponse'
        '404':
          description: No such country, or nothing of that category in it.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /v1/localities/{country}/{region}/{locality}:
    get:
      tags:
      - Places
      operationId: locality
      summary: 'One suburb: every place in it'
      description: Every open place in the suburb, with counts per category and operator and the nearest suburbs, which is the page a suburb has on the site.
      parameters:
      - name: country
        in: path
        required: true
        description: 'Country slug as the site''s URLs use it: australia, new-zealand, united-kingdom, united-states, canada.'
        example: australia
        schema:
          type: string
      - name: region
        in: path
        required: true
        description: Region slug.
        example: victoria
        schema:
          type: string
      - name: locality
        in: path
        required: true
        description: Suburb slug.
        example: coburg
        schema:
          type: string
      responses:
        '200':
          description: The suburb.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocalityResponse'
        '404':
          description: No such suburb.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /v1/places:
    get:
      tags:
      - Places
      operationId: places
      summary: Places in a suburb, filtered
      description: 'Filter one suburb''s places by operator or category.


        The suburb is named by its numeric id, which no other endpoint returns; for most uses the suburb endpoint, which takes slugs, is the one to call.'
      parameters:
      - name: locality
        in: query
        required: true
        description: The suburb's numeric id.
        schema:
          type: integer
      - name: brand
        in: query
        required: false
        description: 'An operator key: auspost.'
        schema:
          type: string
      - name: category
        in: query
        required: false
        description: A kind of place.
        schema:
          type: string
          enum:
          - post-offices
          - post-boxes
          - express-post-boxes
          - parcel-lockers
          - drop-off-points
          - collection-points
      - name: limit
        in: query
        required: false
        description: How many places. Outside 1 to 200, the default applies.
        schema:
          type: integer
          minimum: 1
          maximum: 200
          default: 50
      responses:
        '200':
          description: The places, by name.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlacesResponse'
        '400':
          description: locality is missing or not a number.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /v1/places/{publicID}:
    get:
      tags:
      - Places
      operationId: place
      summary: One place in full
      description: 'Everything about one place: address, opening hours, what it accepts, what is close by, and what visitors said. The id is permanent, so a stored id reads back the same place for as long as it exists.'
      parameters:
      - name: publicID
        in: path
        required: true
        description: The place's permanent id, the last segment of its URL.
        example: 5puvhnr4
        schema:
          type: string
          pattern: ^[a-z2-7]{8}$
      responses:
        '200':
          description: The place.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlaceResponse'
        '404':
          description: No place has that id.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
components:
  schemas:
    Review:
      type: object
      description: One approved review.
      properties:
        id:
          type: integer
          description: Review id.
        name:
          type: string
          description: The name the reviewer chose.
        outcome:
          type: string
          description: How the visit went.
          enum:
          - as_listed
          - different
          - no_go
        rating:
          type:
          - integer
          - 'null'
          description: One to five, or null when not rated.
          minimum: 1
          maximum: 5
        body:
          type: string
          description: What they wrote, when they wrote anything.
        created_at:
          type: string
          description: When it was written.
          format: date-time
      required:
      - id
      - name
      - outcome
      - rating
      - created_at
      additionalProperties: false
    CountrySummary:
      type: object
      description: A country and how much the directory holds for it.
      properties:
        iso2:
          type: string
          description: ISO 3166-1 alpha-2 code.
        slug:
          type: string
          description: The country as the site's URLs write it.
        name:
          type: string
          description: The country's name.
        region_count:
          type: integer
          description: Regions with a page.
        locality_count:
          type: integer
          description: Suburbs with a page.
        place_count:
          type: integer
          description: Locations held.
      required:
      - iso2
      - slug
      - name
      - region_count
      - locality_count
      - place_count
      additionalProperties: false
    PlacesResponse:
      type: object
      description: Places in a suburb.
      properties:
        data:
          type: array
          description: Places, by name.
          items:
            $ref: '#/components/schemas/Place'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
        next_cursor:
          type: string
          description: 'Reserved for paging. Never set today: the first page is the whole answer, up to limit.'
      required:
      - data
      - generated_at
      additionalProperties: false
    CategoryHub:
      type: object
      description: 'One category across a country: counts per region and the busiest suburbs, not a list of every place.'
      properties:
        country:
          $ref: '#/components/schemas/Country'
        category:
          type: string
          description: The category.
          enum:
          - post-offices
          - post-boxes
          - express-post-boxes
          - parcel-lockers
          - drop-off-points
          - collection-points
        total:
          type: integer
          description: Places of this category in the country (or region, when narrowed).
        regions:
          type: array
          description: Regions holding this category, busiest first.
          items:
            $ref: '#/components/schemas/RegionSummary'
        localities:
          type: array
          description: The busiest suburbs for this category, up to 60.
          items:
            $ref: '#/components/schemas/LocalityLink'
      required:
      - country
      - category
      - total
      - regions
      - localities
      additionalProperties: false
    CountriesResponse:
      type: object
      description: Every country covered.
      properties:
        data:
          type: array
          description: Countries.
          items:
            $ref: '#/components/schemas/CountrySummary'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
      required:
      - data
      - generated_at
      additionalProperties: false
    PlaceDetail:
      type: object
      description: One place in full, with where it sits, what is close by, reviews and photos.
      properties:
        country:
          $ref: '#/components/schemas/Country'
        region:
          $ref: '#/components/schemas/Region'
        locality:
          $ref: '#/components/schemas/Locality'
        place:
          $ref: '#/components/schemas/Place'
        nearby:
          type: array
          description: Other places close by, nearest first.
          items:
            $ref: '#/components/schemas/PlaceLink'
        reviews:
          $ref: '#/components/schemas/Reviews'
        photos:
          type: array
          description: Approved photos, newest first.
          items:
            $ref: '#/components/schemas/Photo'
      required:
      - country
      - region
      - locality
      - place
      - nearby
      - reviews
      - photos
      additionalProperties: false
    Facet:
      type: object
      description: One value and how many places have it.
      properties:
        key:
          type: string
          description: The category or brand key.
        count:
          type: integer
          description: How many places.
      required:
      - key
      - count
      additionalProperties: false
    Locality:
      type: object
      description: A suburb or town.
      properties:
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        name:
          type: string
          description: The suburb's name.
        postcode:
          type: string
          description: The postcode people write for it. Absent where the country's postcodes are not held.
        lat:
          type: number
          description: Latitude of the suburb's centre, where held.
        lng:
          type: number
          description: Longitude of the suburb's centre, where held.
        place_count:
          type: integer
          description: How many locations it holds.
      required:
      - slug
      - name
      - place_count
      additionalProperties: false
    RegionResponse:
      type: object
      description: One region.
      properties:
        data:
          $ref: '#/components/schemas/RegionDetail'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
      required:
      - data
      - generated_at
      additionalProperties: false
    CountryDetail:
      type: object
      description: A country and its regions.
      properties:
        country:
          $ref: '#/components/schemas/Country'
        regions:
          type: array
          description: Every region with a page, largest first.
          items:
            $ref: '#/components/schemas/RegionSummary'
      required:
      - country
      - regions
      additionalProperties: false
    LocalityResponse:
      type: object
      description: One suburb.
      properties:
        data:
          $ref: '#/components/schemas/LocalityDetail'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
      required:
      - data
      - generated_at
      additionalProperties: false
    Country:
      type: object
      description: A country the directory covers.
      properties:
        iso2:
          type: string
          description: ISO 3166-1 alpha-2 code.
        slug:
          type: string
          description: 'The country as postfinder.io''s URLs write it: australia, new-zealand.'
        name:
          type: string
          description: The country's name.
      required:
      - iso2
      - slug
      - name
      additionalProperties: false
    Region:
      type: object
      description: A state, province or other first level division.
      properties:
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        code:
          type: string
          description: 'The short code, where the country has them: VIC, NSW. Absent where it has none.'
        name:
          type: string
          description: The region's name.
      required:
      - slug
      - name
      additionalProperties: false
    PlaceResponse:
      type: object
      description: One place.
      properties:
        data:
          $ref: '#/components/schemas/PlaceDetail'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
      required:
      - data
      - generated_at
      additionalProperties: false
    LocalityDetail:
      type: object
      description: 'A suburb: every place in it, with facet counts and its neighbours.'
      properties:
        country:
          $ref: '#/components/schemas/Country'
        region:
          $ref: '#/components/schemas/Region'
        locality:
          $ref: '#/components/schemas/Locality'
        categories:
          type: array
          description: How many places of each category.
          items:
            $ref: '#/components/schemas/Facet'
        brands:
          type: array
          description: How many places of each operator.
          items:
            $ref: '#/components/schemas/Facet'
        places:
          type: array
          description: Every open place in the suburb.
          items:
            $ref: '#/components/schemas/Place'
        neighbours:
          type: array
          description: Nearby suburbs, nearest first.
          items:
            $ref: '#/components/schemas/LocalityLink'
      required:
      - country
      - region
      - locality
      - categories
      - brands
      - places
      - neighbours
      additionalProperties: false
    LocalitySummary:
      type: object
      description: A suburb in a region's list.
      properties:
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        name:
          type: string
          description: The suburb's name.
        postcode:
          type: string
          description: Its postcode, where held.
        place_count:
          type: integer
          description: Locations held.
      required:
      - slug
      - name
      - place_count
      additionalProperties: false
    Place:
      type: object
      description: One post office, post box, parcel locker, drop off or collection point.
      properties:
        public_id:
          type: string
          description: 'The place''s permanent id: minted once, never reused, and the stable end of its URL.'
          pattern: ^[a-z2-7]{8}$
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        name:
          type: string
          description: The name on the door.
        brand:
          type: string
          description: 'Which operator runs it, as a key: auspost, parcelpoint, nzpost.'
        category:
          type: string
          description: What kind of place it is.
          enum:
          - post-offices
          - post-boxes
          - express-post-boxes
          - parcel-lockers
          - drop-off-points
          - collection-points
        address:
          type: string
          description: 'The street address, where the source gives one. Absent otherwise: most post boxes have none.'
        lat:
          type: number
          description: Latitude.
        lng:
          type: number
          description: Longitude.
        hours:
          type: object
          description: 'Opening hours as the source publishes them, with a tz, the source''s own text, and a weekly map of day to open and close pairs. Open by design: sources carry extra keys (temporary closures, a counter''s separate hatch hours) and a reader should keep what it does not know.'
          additionalProperties: true
        attributes:
          type: object
          description: 'Whatever else the source says: phone, services, what can be sent or collected. Open by design, because each source names its own keys; read the ones you need.'
          additionalProperties: true
        last_verified_at:
          type: string
          description: When a source last confirmed the record.
          format: date-time
        closed_at:
          type: string
          description: When the place was recorded as closed. Only a place page shows a closed place.
          format: date-time
      required:
      - public_id
      - slug
      - name
      - brand
      - category
      - lat
      - lng
      additionalProperties: false
    RegionDetail:
      type: object
      description: A region and a page of its suburbs.
      properties:
        country:
          $ref: '#/components/schemas/Country'
        region:
          $ref: '#/components/schemas/Region'
        localities:
          type: array
          description: This page of the region's suburbs, alphabetical.
          items:
            $ref: '#/components/schemas/LocalitySummary'
        locality_total:
          type: integer
          description: How many suburbs the region has in all, for paging.
      required:
      - country
      - region
      - localities
      - locality_total
      additionalProperties: false
    PlaceLink:
      type: object
      description: Another place close by, with enough to link to its page.
      properties:
        public_id:
          type: string
          description: The place's permanent id.
          pattern: ^[a-z2-7]{8}$
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        name:
          type: string
          description: The name on the door.
        brand:
          type: string
          description: Operator key.
        category:
          type: string
          description: What kind of place it is.
          enum:
          - post-offices
          - post-boxes
          - express-post-boxes
          - parcel-lockers
          - drop-off-points
          - collection-points
        address:
          type: string
          description: Street address, where held.
        country:
          type: string
          description: Country slug.
        region:
          type: string
          description: Region slug.
        locality:
          type: string
          description: Suburb slug.
        distance_km:
          type: number
          description: Straight line distance in kilometres.
      required:
      - public_id
      - slug
      - name
      - brand
      - category
      - country
      - region
      - locality
      - distance_km
      additionalProperties: false
    ReviewSummary:
      type: object
      description: What visitors said, summarised.
      properties:
        count:
          type: integer
          description: Approved reviews.
        average:
          type:
          - number
          - 'null'
          description: Mean rating out of five, or null with no rated reviews.
        last_as_listed_at:
          type:
          - string
          - 'null'
          format: date-time
          description: When a visitor last found the place as listed, or null.
      required:
      - count
      - average
      - last_as_listed_at
      additionalProperties: false
    CategoryResponse:
      type: object
      description: One category across a country.
      properties:
        data:
          $ref: '#/components/schemas/CategoryHub'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
      required:
      - data
      - generated_at
      additionalProperties: false
    RegionSummary:
      type: object
      description: A region and how much it holds.
      properties:
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        code:
          type: string
          description: The short code, where the country has them.
        name:
          type: string
          description: The region's name.
        locality_count:
          type: integer
          description: Suburbs with a page.
        place_count:
          type: integer
          description: Locations held (on a category page, of that category only).
      required:
      - slug
      - name
      - locality_count
      - place_count
      additionalProperties: false
    Reviews:
      type: object
      description: 'Approved reviews: a summary and the most recent.'
      properties:
        summary:
          $ref: '#/components/schemas/ReviewSummary'
        recent:
          type: array
          description: The most recent, newest first.
          items:
            $ref: '#/components/schemas/Review'
      required:
      - summary
      - recent
      additionalProperties: false
    Problem:
      type: object
      description: An RFC 7807 problem. The title says what went wrong and the detail, when present, what to do about it.
      properties:
        type:
          type: string
          description: Always about:blank.
        title:
          type: string
          description: What went wrong, in a few words.
        status:
          type: integer
          description: The HTTP status, repeated.
        detail:
          type: string
          description: What to do about it. May be empty.
      required:
      - type
      - title
      - status
      - detail
      additionalProperties: false
    CountryResponse:
      type: object
      description: One country.
      properties:
        data:
          $ref: '#/components/schemas/CountryDetail'
        generated_at:
          type: string
          description: When the answer was made. Answers are cached at the edge, so it can be up to an hour old.
          format: date-time
      required:
      - data
      - generated_at
      additionalProperties: false
    Photo:
      type: object
      description: An approved photo. Fetch it at https://postfinder.io/media/{id}.
      properties:
        id:
          type: string
          description: Photo id.
        credit:
          type: string
          description: Who took it, when they asked to be credited.
        licence:
          type: string
          description: Its licence.
        width:
          type: integer
          description: Pixels.
        height:
          type: integer
          description: Pixels.
        created_at:
          type: string
          description: When it was added.
          format: date-time
      required:
      - id
      - licence
      - width
      - height
      - created_at
      additionalProperties: false
    LocalityLink:
      type: object
      description: Another suburb, with enough to link to its page.
      properties:
        country:
          type: string
          description: Country slug.
        region:
          type: string
          description: Region slug.
        slug:
          type: string
          description: The URL segment this row has on postfinder.io.
        name:
          type: string
          description: The suburb's name.
        place_count:
          type: integer
          description: Locations held.
        distance_km:
          type: number
          description: Distance in kilometres from the suburb asked about; 0 where distance is not the ordering.
      required:
      - country
      - region
      - slug
      - name
      - place_count
      - distance_km
      additionalProperties: false
x-provenance:
  method: harvested
  publisher: Postfinder
  source: https://api.postfinder.io/v1/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)