Why Every Major UK Airport Went Barrierless
Between early 2025 and the start of 2026, every major UK airport removed its kerbside barriers. Manchester completed a phased barrierless rollout across all three terminal forecourts and its ground transport interchange between 26 March and 2 April 2025. Luton removed its original barriers on 22 January 2025, just months after the Express Drop Off Zone first opened in July 2024. London City Airport introduced its inaugural drop-off charge on 6 January 2026 as a fully barrierless system from day one, becoming the last major London airport to end free forecourt access. Stansted switched its Express Set Down area to barrierless ANPR in January 2025, and Heathrow and Gatwick had already been running camera-only enforcement for several years before that. The result is consistent across every significant UK airport forecourt: cameras read plates on entry and exit, dwell time is calculated in software, and payment is collected online after the visit.
For developers, this is a significant opportunity. The enforcement system handling millions of vehicle events daily is, at its core, a REST API wrapper around a camera feed, a key-value store for timestamps, and a billing engine. There is no proprietary hardware contract to negotiate, no barrier maintenance cycle, and no queue of vehicles waiting for a mechanical arm to lift. If you are building or integrating a kerbside management product in 2026, the architecture is simpler than you might expect, and the edge cases are where the real engineering work lives.
How the Billing Loop Works
The fundamental loop is straightforward. An ANPR camera captures an image of the vehicle entering the drop-off zone. Your backend calls the number plate recognition API with that image, receives the plate string and a confidence score in the JSON response, and writes an entry record keyed by registration. When the same vehicle exits, the camera fires again, you call the API a second time, retrieve the stored entry timestamp, and compute the dwell time in seconds. That dwell time is passed through your pricing tier logic to produce a charge. If the plate matches a registered autopay account, the charge is billed immediately and the driver receives a receipt. If it does not, an invoice is sent to the driver with a payment deadline, typically midnight the following day across the major UK operators.
Barriers do nothing in this loop that software cannot do better. A barrier guarantees physical containment, but on a high-volume kerbside it also creates a bottleneck: every vehicle must stop, interact with a machine, and wait. Remove the barrier and throughput increases immediately. The enforcement guarantee shifts from hardware to data, which is exactly where it belongs in a REST-driven architecture.
Calling the NPR API: Entry and Exit Reads
Each camera event is a single POST request to the recognition endpoint. Send the captured frame as a multipart form upload and include your API key in the X-API-Key header. For a standard entry or exit read, the minimal call looks like this:
curl -X POST https://nprapi.com/api/v1/recognise \
-H "X-API-Key: your-api-key-here" \
-F "image=@entry_frame.jpg" \
-F "vehicle=true"
The vehicle=true flag enriches the response with DVSA data including make, model, and colour. For drop-off zone enforcement this matters immediately: if the plate read returns as AB12CDE but the DVSA data shows a white Ford Transit where the camera captured what appears to be a dark saloon, you have grounds to flag the read for manual review before writing the entry record. The JSON response contains a registration string, a confidence integer from 0 to 100, and a credits_used field. At production scale, set a confidence threshold, typically 85 or above, below which you queue the frame for secondary review rather than writing a record that could result in a charge or Parking Charge Notice being sent to the wrong keeper.
If a camera gantry covers a wide entry lane with multiple channels side by side, add multiple=true to the call. The response then returns a plates array where each element includes registration, confidence, and a country field using ISO 3166-1 alpha-2 notation. This is particularly useful at airport entries where coaches, private hire vehicles, and private cars may appear in the same frame.
Dwell-Time Engine: Storing Timestamps and Detecting Re-Entries
Your entry record should store at minimum the plate string, the entry timestamp in UTC, the camera zone identifier, and the confidence score. A Redis hash keyed on registration works well for the hot path; write through to your primary database for the audit trail. On exit, compute dwell in seconds:
dwell_seconds = exit_timestamp - entry_timestamp
dwell_minutes = dwell_seconds / 60
The no-return window is one of the most common edge cases operators encounter. At Stansted, for example, a re-entry charge of £20 applies if a vehicle returns to the Express Set Down area within 30 minutes. Your engine must check, on every new entry event, whether the plate has a recent exit record within that window and, if so, treat it as a new billable event rather than a continuation of the previous visit. Store the exit timestamp alongside the entry record and run this check before writing a new entry:
last_exit = db.get_last_exit(registration)
no_return_window_minutes = 30 # set per operator config
if last_exit and (now - last_exit) < timedelta(minutes=no_return_window_minutes):
# treat as re-entry, apply re-entry surcharge or separate charge
create_billing_event(registration, event_type="re_entry", ...)
Fire a webhook to your alerting system at the point of exit for any vehicle whose dwell time exceeds the overstay threshold. Webhooks are far more efficient than polling here: your operations dashboard can surface a real-time alert, and the PCN issuance pipeline can begin its countdown timer from the moment the exit read is confirmed.
Pricing Tier Logic, Grace Periods, and Autopay Account Matching
Map dwell buckets to charge amounts in a configuration object rather than hardcoding values, since operators adjust tariffs regularly. A representative structure for a single zone might look like this:
PRICING_TIERS = [
{"max_minutes": 10, "charge_pence": 700},
{"max_minutes": 15, "charge_pence": 1000},
{"max_minutes": 30, "charge_pence": 2800},
{"max_minutes": None, "charge_pence": None, "pcn": True}
]
GRACE_PERIOD_SECONDS = 120 # two-minute grace on entry
Apply the grace period before computing the billable dwell. If the vehicle exits within the grace window from entry, write the exit record but generate no charge. Grace periods exist to protect against vehicles that enter the zone in error, turn around immediately, or are momentarily captured by the entry camera while routing to a different zone. Note that some operators apply no grace period at all on kerbside zones; Gatwick, for instance, triggers a charge the moment a vehicle enters regardless of dwell time. Make the grace period a configurable value per zone rather than a global constant.
Before generating any invoice, look up the plate against your autopay account table. A match means the stored payment method is billed immediately and the driver receives a receipt, not an invoice. Fleet accounts often hold multiple plates under a single account; your lookup must return the account even when the plate belongs to a sub-record on a company profile. Log the account ID on the billing event so that disputes can be traced back to the account holder rather than the registered keeper.
DVSA Vehicle Data and PCN Dispatch
When no autopay account is matched and the payment deadline passes without payment, you need the registered keeper's name and address to issue a Parking Charge Notice. The vehicle=true parameter on the recognition call gives you DVSA vehicle attributes such as make, model, and colour, but keeper identity data comes from the DVLA's official keeper enquiry channel, accessed under a formal trade subscriber agreement with the DVLA. This is a separate process from your ANPR API call and requires a data-sharing arrangement to be in place before you go live. Once you hold the keeper's details, the PCN must be assembled correctly to satisfy the conditions of Schedule 4 of the Protection of Freedoms Act 2012, which governs keeper liability for private parking charges on relevant land in England and Wales. The Act makes the registered keeper liable when the driver cannot be identified and the operator has followed the prescribed notice sequence, provided all strict procedural requirements are met. Keeper liability under POFA does not apply in Scotland, where equivalent provisions exist under the Transport (Scotland) Act 2019, nor does it apply in Northern Ireland.
Build the PCN issuance pipeline as a state machine with clearly defined states: awaiting_payment, payment_deadline_passed, keeper_data_requested, notice_to_keeper_sent, appealed, debt_recovery. The appeals evidence bundle should be generated automatically and include the entry camera image with timestamp, the exit camera image with timestamp, the confidence score for each read, the computed dwell time, and the pricing tier that was applied. Store these artefacts in immutable object storage with a reference on the PCN record.
Edge Cases Every Airport Operator Encounters
Circling Vehicles
A driver who cannot locate the passenger may loop around the terminal road and re-enter the drop-off zone two or three times. Each pass through the entry camera creates a new event. Without re-entry detection, you could bill the driver for multiple separate visits when the intent was a single drop-off. The standard mitigation is the no-return window described above, combined with a maximum charge cap per hour. Expose this cap in your configuration layer so operators can adjust it without a code change.
Fleet Plates on Shared Accounts
Private hire vehicles and coach operators typically hold all their plates under a single commercial account. When a plate read matches a fleet account, apply the fleet rate table for that vehicle category rather than the standard tariff. PHVs and licensed taxis often carry a negotiated rate or an exemption entirely. Maintain a vehicle category field on each plate record within the fleet account and branch your pricing logic accordingly. If a fleet plate does not match an account, do not immediately trigger the PCN pipeline; instead, flag it for a manual review step, since the plate may have been recently added to a fleet and not yet registered.
Blue Badge Exemptions
Blue Badge holders are exempt from drop-off charges at all major UK airports, but the exemption is never automatic based on a camera read alone. The ANPR system cannot detect a Blue Badge displayed in a windscreen; the exemption must be pre-registered by the badge holder via a portal or app, and the registered plate is then added to an exemption list that your billing engine checks before applying any charge. London City Airport requires badge holders to register via the airport's portal before the visit; other airports follow comparable pre-registration processes. The important software detail is that the exemption is tied to the travelling passenger, not the driver. Your data model should store the badge holder's reference separately from the vehicle registration so that the same Blue Badge cannot be reused across different vehicles on the same day without a new registration event.
For digital Blue Badge verification, validate the badge expiry date at the point of registration and reject exemption applications for badges that have already expired. Store the badge reference, the expiry date, and the registration date of the exemption, and surface an expiry warning to the badge holder ahead of renewal.
PCN Issuance Pipeline and the Appeals Bundle
Set the PCN trigger as a scheduled job that runs after the payment deadline has passed, checking for billing events that remain in awaiting_payment status. The notice sent to the keeper must, under Schedule 4 of POFA, include the amount of the charge, the vehicle registration, the date of the event, the land on which the charge was incurred, and a statement that the keeper may be liable if the driver is not identified within the required timeframe. Operators typically allow the charge to be reduced if paid within 14 days: Manchester issues a £100 PCN reduced to £60 within 14 days, Luton's PCN stands at £95, and Gatwick's is £100. Confirm the current figure for each operator before hardcoding any values, as tariffs are revised periodically.
The appeals evidence bundle should be generated and attached to the PCN record at issuance rather than compiled on demand when an appeal arrives. Include the entry and exit camera stills, both plate read confidence scores, the full dwell-time calculation, the tier that was applied, and any autopay lookup result. A complete bundle at the point of issuance means your appeals team responds in minutes rather than having to reconstruct the event days later.
GDPR and Data Retention
The NPR API call itself is stateless: you send an image, receive a plate string and confidence score, and no image data is retained by the API. That zero-retention model matters for kerbside enforcement because raw camera frames contain incidental data about passengers and bystanders as well as the vehicle. Your own system, however, must retain entry and exit images, timestamps, and plate strings for long enough to support PCN appeals, which can run for several months. A proportionate retention period for resolved, paid visits is typically 90 days; for disputed or unpaid events, retain until resolution plus a further period aligned with your legal team's guidance. Do not retain images beyond what is necessary for the stated enforcement purpose, document your retention schedule in your privacy notice, and ensure that keeper data obtained from the DVLA under a trade enquiry is used solely for the purpose for which it was requested.
Testing Before Go-Live
Before pointing live camera feeds at your production environment, validate each component in isolation. Sign up for the NPR API free tier and run a series of plate read calls using test images that cover your expected range of conditions: clean plates in good light, dirty or partially obscured plates, night frames, and wide-angle shots with multiple vehicles. Assert that every response above your confidence threshold returns a correctly formatted plate string, and that responses below the threshold are routed to your secondary review queue rather than written to the entry store.
Load-test the dwell-time engine against a simulated burst of simultaneous entry events, which mirrors the real pattern at an airport drop-off zone when a large coach drops passengers and multiple cars enter in quick succession. Verify that concurrent writes to the entry store do not produce duplicate billing events for the same plate, and that the re-entry detection query executes within acceptable latency under load. For the batch endpoint at https://nprapi.com/api/v1/batch, confirm that your status polling loop against https://nprapi.com/api/v1/batch/{uuid} handles both completed and still-processing states gracefully, since batch jobs may be used for overnight bulk reprocessing of low-confidence reads.
Pre-Launch Checklist
Before going live, confirm each of the following: the confidence threshold is set and low-confidence reads are queued for review; entry and exit records are written atomically with no duplicate-event risk; the no-return window is configured per zone; the grace period is a configurable value per zone, not a global constant; the autopay lookup runs before any invoice is generated; fleet plate handling branches correctly by vehicle category; Blue Badge exemptions are checked against a pre-registered list with expiry validation; the PCN state machine progresses correctly and triggers only after the payment deadline; the appeals evidence bundle is generated at issuance; DVLA keeper data requests are made only through your formal trade subscriber agreement; and your data retention schedule is documented and enforced programmatically.
The full API reference, including request and response schemas for the recognition and batch endpoints, is available at https://nprapi.com/docs. Sign up for the free tier and run your first plate read in under five minutes. The billing loop is straightforward; the edge cases in the checklist above are where production systems earn their reliability.