---
title: "Get application by council and reference"
method: GET
path: "/v1/applications/ref/{council}/{reference}"
tags: ["Applications"]
---

# Get application by council and reference

`GET /v1/applications/ref/{council}/{reference}`

## Request

- Base URL: `https://api.planwire.io`
- URL: `https://api.planwire.io/v1/applications/ref/{council}/{reference}`
- Auth: API key in header `X-API-Key`

Fetch the stored record using a council ID and URL-encoded council reference. This does not re-check the council's planning page. Use the returned application id with POST /v1/applications/{id}/refresh for a supported queued source check, then inspect freshness on a subsequent read. include=supplier adds pilot supplier insights. This is a metered request with the same free/paid restrictions as application ID lookup.

## Path parameters

- `council` string, required
- `reference` string, required

## Query parameters

- `include` string

## Response `200`

Success

- object
  - `data` Application
    - `id` string, uuid: Internal PlanWire UUID for fetching this stored record. For durable customer records, store councilId plus reference and use the reference lookup endpoint.
    - `councilId` string
    - `reference` string
    - `url` string, uri, nullable
    - `address` string, nullable
    - `postcode` string, nullable
    - `uprn` string, nullable: Unique Property Reference Number where source-native, officially matched, or matched from OS Open UPRN coordinates.
    - `uprnMatchMethod` 'source_native' | 'official_address_match' | 'os_open_coordinate' | 'manual', nullable: How the UPRN was attached to the record.
    - `uprnMatchConfidence` number, nullable: 0 to 1 confidence score for the UPRN match.
    - `uprnMatchedAt` string, date-time, nullable: When the UPRN was attached to the record.
    - `lat` number, nullable
    - `lng` number, nullable
    - `description` string, nullable
    - `applicationType` string, nullable
    - `status` string, nullable
    - `decision` string, nullable
    - `decisionOutcome` 'approved' | 'refused' | 'withdrawn' | 'other' | 'unknown': PlanWire-normalised decision bucket derived from the council decision text, falling back to status when needed.
    - `receivedDate` string, date, nullable
    - `validatedDate` string, date, nullable
    - `decisionDate` string, date, nullable
    - `decisionFirstSeenAt` string, date-time, nullable: When PlanWire first observed a decision date or usable decision outcome for this record. Null for decision facts observed before this field existed.
    - `applicationDate` string, date, nullable: Best available council application date: receivedDate or validatedDate.
    - `applicationDateSource` 'receivedDate' | 'validatedDate', nullable
    - `applicantName` string, nullable
    - `agentName` string, nullable
    - `documents` object[]: Source document links and metadata where the authority source supplies them.
      - `title` string
      - `url` string, uri
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `sourceCheckedAt` string, date-time, nullable: Top-level representation of freshness.recordCheckedAt. Prefer the freshness object for individual-check results.
    - `sourceCheckFailedAt` string, date-time, nullable: Top-level representation of freshness.recordCheckFailedAt; retained after a later successful check.
    - `sourceCheckError` string, nullable: Top-level representation of freshness.recordCheckError; cleared on a successful check.
    - `council` object: The local planning authority that published the application.
      - `id` string
      - `name` string
    - `source` object: Where the record came from, and when that source was last checked.
      - `type` string: Portal software the council runs.
      - `label` string
      - `lastScrapedAt` string, date-time, nullable: Latest source check timestamp. Kept for API compatibility.
    - `propertyIdentity` object: UPRN property identity and match provenance. Use this to join PlanWire planning records to EPC, price-paid, property and internal asset datasets.
      - `uprn` string, nullable: Unique Property Reference Number where source-native, officially matched, or matched from OS Open UPRN coordinates.
      - `uprnMatchMethod` 'source_native' | 'official_address_match' | 'os_open_coordinate' | 'manual', nullable
      - `uprnMatchConfidence` number, nullable
      - `uprnMatchedAt` string, date-time, nullable
    - `propertyContext` object: Optional property enrichment for single-application reads. Returned where PlanWire has a safe UPRN/property join or precomputed constraint match. Treat each nested dataset as optional.
      - `joinKey` object: Whether this planning record has a UPRN available for joins to property datasets.
        - `uprn` string, nullable
        - `available` boolean
        - `note` string
      - `epc` object, nullable: Latest EPC facts joined by UPRN where available from the England/Wales EPC dataset.
        - `currentEnergyRating` string, nullable
        - `potentialEnergyRating` string, nullable
        - `floorArea` number, nullable
        - `builtForm` string, nullable
        - `propertyType` string, nullable
        - `inspectionDate` string, date, nullable
        - `lodgementDate` string, date, nullable
        - `source` string
        - `sourceUpdatedAt` string, date-time, nullable
      - `soldPrices` object, nullable: Safe derived HMLR price-paid summary joined by UPRN where available.
        - `latestSalePrice` integer, nullable
        - `latestSaleDate` string, date, nullable
        - `saleCount` integer
        - `firstSaleDate` string, date, nullable
        - `source` string
        - `sourceAttribution` string
        - `refreshedAt` string, date-time, nullable
      - `constraints` object[]: Precomputed planning/property constraints intersecting or near the application or its UPRN, where available.
        - `type` 'conservation_area' | 'listed_building' | 'flood_zone' | 'green_belt' | 'article_4' | 'tree_preservation_order' | 'brownfield_land'
        - `name` string, nullable
        - `source` string
        - `sourceReference` string, nullable
        - `relation` 'intersects' | 'within' | 'nearby'
        - `distanceM` number, nullable
        - `matchedAt` string, date-time, nullable
    - `freshness` object: Individual record checks, council-wide source checks and application dates are separate signals. recordCheckedAt is the last successful individual detail-page check. sourceCheckStatus and lastScrapedAt are council-wide; they do not prove this application's status is current. dataStatus describes the age of the application's date, not capture completeness.
      - `sourceCheckStatus` 'fresh' | 'stale' | 'unknown': fresh when the source was checked within 72 hours.
      - `sourceAgeHours` number, nullable
      - `dataStatus` 'fresh' | 'stale' | 'unknown': fresh when the application itself is 30 days old or less.
      - `applicationAgeDays` integer, nullable
      - `applicationDate` string, date, nullable
      - `applicationDateSource` 'receivedDate' | 'validatedDate' | 'null', nullable: Which council field applicationDate was taken from.
      - `firstSeenAt` string, date-time
      - `lastSeenAt` string, date-time: Last database write to this record. Not a council-page check; use recordCheckedAt.
      - `recordCheckedAt` string, date-time, nullable: Last successful check of this application's own council detail page. Advances even if its decision is unchanged. Null means this mechanism has not recorded a successful individual check. Initial refresh checks status/decision fields, not documents or full stage history.
      - `recordCheckFailedAt` string, date-time, nullable: Last failed individual check. Retained after later success; compare with recordCheckedAt to determine which happened most recently.
      - `recordCheckError` string, nullable: Machine-readable individual-check failure code, cleared on success. Examples: source_timeout, source_blocked, source_rate_limited, detail_reference_mismatch, detail_authority_mismatch. Not an exhaustive list.
      - `lastScrapedAt` string, date-time, nullable: Council-wide source check timestamp, not an individual application check.
      - `decisionDate` string, date, nullable
      - `decisionFirstSeenAt` string, date-time, nullable: When PlanWire first observed a decision date or usable decision outcome for this record.
      - `note` string
    - `dates` object: Every date held for the application, with its provenance.
      - `applicationDate` string, date, nullable
      - `applicationDateSource` string, nullable
      - `receivedDate` string, date, nullable
      - `validatedDate` string, date, nullable
      - `decisionDate` string, date, nullable
      - `decisionFirstSeenAt` string, date-time, nullable
      - `firstSeenAt` string, date-time
      - `lastSeenAt` string, date-time
    - `floodRisk` object, nullable: EA Flood Map for Planning zone. Populated on first fetch, cached 30 days. Only present on single-application endpoints (GET /applications/:id and /applications/ref/:council/:reference).
      - `zone` 'low' | '1' | '2' | '3a' | '3b': Flood zone per EA planning policy. low = <0.1% annual probability, 2 = 0.1–1%, 3a = >1%, 3b = functional floodplain.
      - `description` string
    - `nearbyPrices` object, nullable: Land Registry price paid data for the same postcode, last 2 years. Populated on first fetch, cached 30 days. Only present on single-application endpoints.
      - `avgPrice` integer: Average sold price in pence
      - `count` integer: Number of sales used to calculate the average
      - `postcode` string
      - `periodYears` integer
    - `supplierInsights` SupplierInsights: Opt-in supplier evaluation metadata. Computed from records already permitted by the underlying endpoint. References are not duplicate-project assertions; classification is inferred and quantities are source mentions only.
      - `version` 'pilot-1', required
      - `classification` object, required
        - `status` 'rule_matches' | 'unclassified'
        - `applicationRole` 'follow_up' | 'proposal_or_unspecified': Follow-up descriptions are flagged so work types referring to an earlier proposal are not counted as new developments.
        - `roleEvidence` SupplierEvidence
          - `field` string, required
          - `text` string, required: Exact substring of the source field.
          - `start` integer, required: Zero-based UTF-16 offset, inclusive.
          - `end` integer, required: Zero-based UTF-16 offset, exclusive.
          - `sourceUrl` string, uri, nullable, required
        - `categories` object[]
          - `category` 'new_housing' | 'extension' | 'industrial' | 'demolition' | 'refurbishment'
          - `rule` string
          - `basis` 'description_rule'
          - `evidence` SupplierEvidence
            - `field` string, required
            - `text` string, required: Exact substring of the source field.
            - `start` integer, required: Zero-based UTF-16 offset, inclusive.
            - `end` integer, required: Zero-based UTF-16 offset, exclusive.
            - `sourceUrl` string, uri, nullable, required
        - `note` string
      - `quantities` object, required
        - `dwellingMentions` SupplierQuantityMention[]
          - `value` number, nullable: Literal numeric mention, null for a range. Not a project total.
          - `range` object, nullable
            - `min` number
            - `max` number
          - `qualifier` 'stated' | 'range' | 'up_to' | 'approximate'
          - `unit` 'dwellings' | 'sq_m' | 'sq_ft'
          - `context` 'proposed_mention' | 'existing_or_historical_or_mixed' | 'negated_mention' | 'unspecified'
          - `evidence` SupplierEvidence
            - `field` string, required
            - `text` string, required: Exact substring of the source field.
            - `start` integer, required: Zero-based UTF-16 offset, inclusive.
            - `end` integer, required: Zero-based UTF-16 offset, exclusive.
            - `sourceUrl` string, uri, nullable, required
        - `floorAreaMentions` SupplierQuantityMention[]
          - `value` number, nullable: Literal numeric mention, null for a range. Not a project total.
          - `range` object, nullable
            - `min` number
            - `max` number
          - `qualifier` 'stated' | 'range' | 'up_to' | 'approximate'
          - `unit` 'dwellings' | 'sq_m' | 'sq_ft'
          - `context` 'proposed_mention' | 'existing_or_historical_or_mixed' | 'negated_mention' | 'unspecified'
          - `evidence` SupplierEvidence
            - `field` string, required
            - `text` string, required: Exact substring of the source field.
            - `start` integer, required: Zero-based UTF-16 offset, inclusive.
            - `end` integer, required: Zero-based UTF-16 offset, exclusive.
            - `sourceUrl` string, uri, nullable, required
        - `note` string
      - `history` object, required
        - `recordKey` string: Council ID and reference; identifies a record, not a development.
        - `scope` 'current_record_and_explicit_references'
        - `references` object[]
          - `key` string
          - `councilId` string
          - `reference` string
          - `relationship` 'explicit_reference'
          - `resolution` 'in_response' | 'not_resolved'
          - `applicationId` string, nullable
          - `apiPath` string, nullable
          - `evidence` SupplierEvidence
            - `field` string, required
            - `text` string, required: Exact substring of the source field.
            - `start` integer, required: Zero-based UTF-16 offset, inclusive.
            - `end` integer, required: Zero-based UTF-16 offset, exclusive.
            - `sourceUrl` string, uri, nullable, required
        - `timeline` object[]
          - `field` string
          - `date` string, date-time
          - `sourceUrl` string, nullable
          - `basis` 'council_record' | 'planwire_observation'
        - `siteContext` object, nullable
          - `uprn` string
          - `matchMethod` string, nullable
          - `note` string
        - `note` string
      - `territory` object, required
        - `status` 'matched' | 'not_established'
        - `reasons` object[]
        - `note` string
      - `caveat` string, required

## Other responses

- `401`: API key required or invalid
- `402`: Record is outside the key's data access
- `404`: Application not found
- `429`: Request limit reached

---

[API](https://skmtc.dev/planwire/apis/planwire-uk-planning-data-infrastructure-api.md) · [All operations](https://skmtc.dev/planwire/apis/planwire-uk-planning-data-infrastructure-api/llms.txt) · [OpenAPI document](https://skmtc.dev/planwire/apis/planwire-uk-planning-data-infrastructure-api/revisions/4ccb7f811da9?raw)
