Council licensing registers, through the API
Licensing applications with their last day for representations, the licences in force at a place, what each permits, its history, and a feed of every change Plota sees, from the councils whose registers it reads.
Endpoints
| Endpoint | Purpose |
|---|---|
GET /v1/licensing-applications | Applications to councils’ licensing registers, open ones by default, with the last day for representations |
GET /v1/licensing-applications/{id} | One application |
GET /v1/licensed-premises | Licences: premises, clubs, gambling, animals and the rest, in force by default |
GET /v1/licensed-premises/{id} | One licence, with planning applications at the same premises where matched |
GET /v1/licensed-premises/{id}/history | Every event on a licence or application |
GET /v1/licensing/coverage | Every council: read or not, when, and what it holds |
GET /v1/licensing/changes | The change feed, one event per row with a stable id and a cursor |
Every search names a place: a council, a postcode, a uprn, a point with a radius (lat, lng, radius) or a bbox. Pages hold at most 50 records (the change feed 100); add format=csv for the same page as CSV. Each licence or application new to your account in a month counts as 2 records of your monthly records allowance; reading it again in the same month is free. The coverage table is counted as a request, not as records.
Licensing applications
| Parameter | What it reads |
|---|---|
council | Council slug, or several comma separated (westminster, leeds). GET /v1/licensing/coverage lists every council and whether its register is read. |
jurisdiction | Nation, comma separated: england, wales, scotland (licensing boards under the Licensing (Scotland) Act 2005) or northern-ireland. Narrows a place; it is not a place on its own. |
postcode | A full postcode (N1 8NX) matches that unit; its district (N1) the whole district, never N19 or NW1. |
uprn | The property's Unique Property Reference Number. |
lat | Latitude of a point in the UK. With lng, records within radius metres of the point, each carrying distance_m. More than 5,000 records inside it is refused: narrow the radius or add filters. |
lng | Longitude of the point; see lat. |
radius | Metres around lat and lng, 1 to 5000, default 1000. |
bbox | minLng,minLat,maxLng,maxLat, at most 0.5 degree each way. A point or a box, not both. |
type | Licence type, comma separated: premises, club, tens, gambling, taxi_operator, street_trading, scrap_metal, animal, sex_establishment, pavement, other. premises is a premises licence, club a club premises certificate, tens a temporary event notice. Personal licences, taxi drivers and vehicles are not served. |
regime | The law the licence is under, comma separated: LA2003, LSA2005, GA2005, taxi, street_trading, animal, sex_est, scrap_metal, pavement, other. |
subtype | The finer type the register gives, comma separated (for gambling: betting, adult_gaming_centre, bingo; for animals: boarding, breeding). |
activity | What the licence or application covers, comma separated: alcohol, alcohol_on, alcohol_off, late_night_refreshment, regulated_entertainment, live_music, recorded_music, films, plays, dance, indoor_sport, boxing_wrestling, gaming_machines, betting, bingo, animal_boarding, dog_breeding, selling_animals, horse_riding, exhibiting_animals. Read from the activities the register lists, in its own words. |
status | open (the default: applied for, or in consultation), decided, all, or statuses comma separated: applied, in_consultation, granted, current, suspended, surrendered, revoked, lapsed, expired, refused, withdrawn, provisional, unknown. |
proposed_hours_change | 1: variation applications (not a change of supervisor), and records whose history holds an hours change. The register rarely states the hours proposed: read the application on the council's register. |
consultation_end_from | YYYY-MM-DD: the last day for representations on or after the date. |
consultation_end_to | YYYY-MM-DD: the last day for representations on or before the date. |
decided_from | YYYY-MM-DD: decided (granted, refused, withdrawn and the like) on or after the date. |
decided_to | YYYY-MM-DD: decided on or before the date. |
received_from | YYYY-MM-DD: received by the council on or after the date. |
received_to | YYYY-MM-DD: received on or before the date. |
first_seen_since | YYYY-MM-DD: first seen on the council's register, as Plota read it, on or after the date. |
changed_since | YYYY-MM-DD or a UTC time: records with a change Plota observed on or after it (the change feed reads the same bound on each event). |
sort | received (newest received first; the default without a point), consultation_end (the soonest last day for representations first), added (newest to the register first), id, or nearest (needs lat and lng; the default with them). |
limit | Page size, at most 50 (Demo 10); a larger value is capped. |
cursor | Opaque cursor from meta.next_cursor. It continues only the query it came from: send it with the same filters. Cursors are keyset positions, so a page never repeats or skips a record when records are added. |
total | total=1 adds meta.total, the records matching the whole query. |
format | json (the default) or csv: the same page as one row per record. |
include_contact | With the contact add-on, company holders and agents are included; include_contact=false leaves them out and off the contact allowance. |
# Open applications in Hackney whose representations close in the next fortnight, soonest first
curl "https://api.plota.co.uk/v1/licensing-applications?council=hackney&consultation_end_from=2026-10-12&consultation_end_to=2026-10-26&sort=consultation_end" \
-H "Authorization: Bearer plota_live_your_key"Licensed premises
| Parameter | What it reads |
|---|---|
council | Council slug, or several comma separated (westminster, leeds). GET /v1/licensing/coverage lists every council and whether its register is read. |
jurisdiction | Nation, comma separated: england, wales, scotland (licensing boards under the Licensing (Scotland) Act 2005) or northern-ireland. Narrows a place; it is not a place on its own. |
postcode | A full postcode (N1 8NX) matches that unit; its district (N1) the whole district, never N19 or NW1. |
uprn | The property's Unique Property Reference Number. |
lat | Latitude of a point in the UK. With lng, records within radius metres of the point, each carrying distance_m. More than 5,000 records inside it is refused: narrow the radius or add filters. |
lng | Longitude of the point; see lat. |
radius | Metres around lat and lng, 1 to 5000, default 1000. |
bbox | minLng,minLat,maxLng,maxLat, at most 0.5 degree each way. A point or a box, not both. |
type | Licence type, comma separated: premises, club, tens, gambling, taxi_operator, street_trading, scrap_metal, animal, sex_establishment, pavement, other. premises is a premises licence, club a club premises certificate, tens a temporary event notice. Personal licences, taxi drivers and vehicles are not served. |
regime | The law the licence is under, comma separated: LA2003, LSA2005, GA2005, taxi, street_trading, animal, sex_est, scrap_metal, pavement, other. |
subtype | The finer type the register gives, comma separated (for gambling: betting, adult_gaming_centre, bingo; for animals: boarding, breeding). |
activity | What the licence or application covers, comma separated: alcohol, alcohol_on, alcohol_off, late_night_refreshment, regulated_entertainment, live_music, recorded_music, films, plays, dance, indoor_sport, boxing_wrestling, gaming_machines, betting, bingo, animal_boarding, dog_breeding, selling_animals, horse_riding, exhibiting_animals. Read from the activities the register lists, in its own words. |
status | in_force (the default: granted or current, on the register as read, and not from a published file over 12 months old), ended (expired, surrendered, revoked, lapsed, or gone from the register), all, or statuses comma separated: applied, in_consultation, granted, current, suspended, surrendered, revoked, lapsed, expired, refused, withdrawn, provisional, unknown. |
decided_from | YYYY-MM-DD: decided (granted, refused, withdrawn and the like) on or after the date. |
decided_to | YYYY-MM-DD: decided on or before the date. |
received_from | YYYY-MM-DD: received by the council on or after the date. |
received_to | YYYY-MM-DD: received on or before the date. |
first_seen_since | YYYY-MM-DD: first seen on the council's register, as Plota read it, on or after the date. |
changed_since | YYYY-MM-DD or a UTC time: records with a change Plota observed on or after it (the change feed reads the same bound on each event). |
sort | id (the default without a point), newest (latest granted first), expiry (soonest expiry first), added (newest to the register first), or nearest (needs lat and lng; the default with them). |
limit | Page size, at most 50 (Demo 10); a larger value is capped. |
cursor | Opaque cursor from meta.next_cursor. It continues only the query it came from: send it with the same filters. Cursors are keyset positions, so a page never repeats or skips a record when records are added. |
total | total=1 adds meta.total, the records matching the whole query. |
format | json (the default) or csv: the same page as one row per record. |
include_contact | With the contact add-on, company holders and agents are included; include_contact=false leaves them out and off the contact allowance. |
# Licences in force for alcohol within 500 metres of a point
curl "https://api.plota.co.uk/v1/licensed-premises?lat=51.5145&lng=-0.0754&radius=500&activity=alcohol" \
-H "Authorization: Bearer plota_live_your_key"Reading a record. status is one word for every council and status_raw the council’s own. in_force is a licence granted or current on the register as last read, and not from a published file more than 12 months old. activities are what the licence permits, with the licensed days and times where the register gives them: licensed hours are the hours a licence permits, not the hours a business opens. confidence says how far to trust each part: where the point is (building, council_point, postcode_centre), whether the status is the council’s word, whether the record is from a live register or a published file, and how exact each date is. related_planning lists the planning applications at the same premises once that match is built (meta.related_planning). Full conditions and plan links are on paid plans. A record leaving a register is not proof of a closure, and a council Plota does not read returns no records: that is missing coverage, never zero licences (meta.coverage).
Company holders and agents. With the contact data add-on (included on Pro and above), records carry parties: the companies that hold the licence or act as agent, with their Companies House numbers, metered on the same monthly contact allowance as planning contacts. include_contact=false leaves them out. A person is never served on any plan: not a holder who is a person, not a designated premises supervisor, not an applicant or agent who is a person, and no phone, email or address of one.
History
GET /v1/licensed-premises/{id}/history returns the record and every event on it, newest first: the council’s own history where its register shows one, and the changes Plota has seen between reads. Each event carries three dates: event_date (the date the council gives), observed_at (when Plota saw it) and effective_date (when it takes effect, where the register says). A transfer is not proof of a new operator, and a change of supervisor names the role only.
The change feed
| Parameter | What it reads |
|---|---|
council | Council slug, or several comma separated (westminster, leeds). GET /v1/licensing/coverage lists every council and whether its register is read. |
jurisdiction | Nation, comma separated: england, wales, scotland (licensing boards under the Licensing (Scotland) Act 2005) or northern-ireland. Narrows a place; it is not a place on its own. |
postcode | A full postcode (N1 8NX) matches that unit; its district (N1) the whole district, never N19 or NW1. |
uprn | The property's Unique Property Reference Number. |
lat | Latitude of a point in the UK. With lng, records within radius metres of the point, each carrying distance_m. More than 5,000 records inside it is refused: narrow the radius or add filters. |
lng | Longitude of the point; see lat. |
radius | Metres around lat and lng, 1 to 5000, default 1000. |
bbox | minLng,minLat,maxLng,maxLat, at most 0.5 degree each way. A point or a box, not both. |
type | Licence type, comma separated: premises, club, tens, gambling, taxi_operator, street_trading, scrap_metal, animal, sex_establishment, pavement, other. premises is a premises licence, club a club premises certificate, tens a temporary event notice. Personal licences, taxi drivers and vehicles are not served. |
regime | The law the licence is under, comma separated: LA2003, LSA2005, GA2005, taxi, street_trading, animal, sex_est, scrap_metal, pavement, other. |
activity | What the licence or application covers, comma separated: alcohol, alcohol_on, alcohol_off, late_night_refreshment, regulated_entertainment, live_music, recorded_music, films, plays, dance, indoor_sport, boxing_wrestling, gaming_machines, betting, bingo, animal_boarding, dog_breeding, selling_animals, horse_riding, exhibiting_animals. Read from the activities the register lists, in its own words. |
source | events (derived events: a new application, later hours sought, a review, a decision, a hearing, a transfer), changes (one row per field that moved), or all (the default). |
event_type | Derived events by type, comma separated: application_new, application_variation, review_applied, transfer, dps_variation, granted, refused, withdrawn, hearing_scheduled, hearing_moved. Reads events only. |
change_type | Kinds, comma separated: a derived event's (new_application, alcohol_hours_extension, late_night_refreshment_new, entertainment_added, off_sales_added, review, granted, granted_shorter_hours, refused, withdrawn, hearing_scheduled, hearing_moved, transfer, dps_change) or a field change's (added, changed, party, not_seen, absent, reappeared; not_seen and absent are a record missing from the register, never a closure). |
significance | consumer (what a neighbour would want to know) or professional (register admin: transfers and changes of supervisor). Reads events only. |
alertable | 1: only events Plota would alert on (not backfill, not suppressed, not low confidence). Reads events only. |
include_corrections | 1 adds the changes Plota does not count as changes, as type correction: a value read differently (extraction_correction) or the register changing how it prints (format_change). Off by default. |
record_type | licence or application: events on licences only, or on applications only. |
backfill | include (the default; each row says backfill), exclude or only. Backfill is the first read of a council or of a new source for it: every record arrives at once, none of it news. Webhooks never send it. |
changed_since | YYYY-MM-DD: rows Plota observed on or after the day (observed_date). |
limit | Page size, at most 100 (Demo 10). |
cursor | Opaque cursor from meta.next_cursor: the position after the last event read. Keep it and ask again later for the events since. |
format | json (the default) or csv: the same page as one row per record. |
Events come oldest first, each with a stable id (lev_...) that is the same on every read and in every webhook delivery. Keep meta.next_cursor, which is returned on the last page too, and ask again for the events since. backfill marks history read in bulk: everything a register held when Plota first read it, and changes the register dates more than 30 days before Plota saw them; backfill=exclude leaves it out. Name a place on any plan; the feed for every council at once is Business and above.
# New applications and variations in Leeds since your last read
curl "https://api.plota.co.uk/v1/licensing/changes?council=leeds&change_type=new_application,variation&backfill=exclude&cursor=YOUR_LAST_CURSOR" \
-H "Authorization: Bearer plota_live_your_key"Webhooks
Register with POST /v1/webhooks, event set to licensing.event.created and a licensing filter (the change feed’s parameters). Each event is POSTed signed, exactly as planning webhooks are (Plota-Signature, Plota-Timestamp), with the event’s stable id as Plota-Event-Id: de-duplicate on it. Events from the moment you register are sent, in order; backfill never is. Starter and above.
curl -X POST "https://api.plota.co.uk/v1/webhooks" \
-H "Authorization: Bearer plota_live_your_key" -H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/plota","event":"licensing.event.created","licensing":{"council":"camden","change_type":"new_application"}}'Coverage
GET /v1/licensing/coverage lists every council: whether Plota reads its licensing register, when it was last read, its licences in force by type and its open applications. A council not read has null counts, never zero. The slugs it lists are the ones the council filter takes.
Machine-readable schema: /openapi.json. The rest of the API: API reference. Questions? hello@plota.co.uk.