Meet & Greet B2B API
Quote airport parking, create bookings, amend, and cancel — all over a simple JSON REST API. Credentials go in the request body on every call. No Bearer token required.
Authentication
Send on every request:
user_emailpasswordagent_code
Header: Content-Type: application/json only.
This host is DEV
Only agents with status = Test in the database can call this API. Live agents must use api.magrgroup.com.
Get access
Need credentials? Email alismartin@meetandgreetreservations.co.uk
Typical flow (agent website)
-
1
QuotePOST /products — show parking
price(no fees in this response) -
2
Product selectedPOST /payments/create-intent — amount = parking + any fees your UI collected
-
3
Customer detailsOn your site: name, email, phone, vehicle, flights (keep in your form state)
-
4
Card paymentStripe.js on your site — money goes to M&G Stripe (test card 4242…)
-
5
BookPOST /bookings — send optional fees; response echoes
booking_amount+ thosefees -
6
Amend / CancelPOST /amend or /cancel when allowed
POST Get parking quotes
# Get parking quotes
curl -X POST https://api.magrgroup.com/api/products \
-H 'Content-Type: application/json' \
-d '{
"user_email": "registered@emailaddress.com",
"agent_code": "your-agent-code",
"password": "your-password",
"quote": {
"airport_code": "LHR",
"dropoff_date": "2026-09-01",
"dropoff_time": "10:00",
"pickup_date": "2026-09-10",
"pickup_time": "20:00"
}
}'
Return parking products for an airport and date range. Authenticate with body credentials on every call.
Fees
/products returns parking prices only (no fees).
Optional booking_fee, cancellation_fee, and sms_notification_fee
are sent by your app on /bookings (top-level or nested under fees);
the booking response echoes whatever you submitted.
Result example :
"request": {
"status": "success",
"airport": "LHR",
"arrival_date": "2025-04-29",
"arrival_time": "09:00",
"depart_date": "2025-04-23",
"depart_time": "12:00"
},
"products": [
{
"companyID": 675,
"product_code": "HAPS-001",
"opening_time": "00:00",
"closing_time": "00:00",
"name": "Heathrow Airport Parking Service - Meet & Greet",
"processtime": "1",
"special_features": "CCTV,DISABILITY FRIENDLY,FENCING,PATROLLED,SECURITY LIGHTING",
"bookingemail": "apibookings@api.magrgroup.com",
"terms": null,
"extra_charges": "0",
"parking_type": "Meet and Greet",
"logo": "https://dashboard.magrgroup.com/storage/app/companies/S3XatB3IRZgjP9Xi3VgoVNY9zmooGOU0stjIXoyl.png",
"cancelable": "Yes",
"editable": "Yes",
"price": "55.99",
"new_price": "55.99",
"agent_amount": "8.40",
"mg_amount": "12.00",
"agent_month_end_return": "8.40",
"mg_retained": "12.00",
"park_api": "b2b",
"overview": "Essentials\n\nEstimated journey time to the airport: Drop at the terminal\nYour
keys will stay in the car park whilst you are away.\nDisability Friendly\n\n
Overview:\nOpt for Heathrow Airport Parking Service Meet and Greet Super Saver for an efficient and discover the seamless parking experience with our Meet and Greet service – the hassle-free solution for business travellers and families. No more waiting at the airport, no terminal transfer worries, and no more shuttle buses, making it the perfect choice to save up to 35 minutes on your journey time. ",
"return_proc": "Terminal 1\nPostcode: (TW6 1AP)\nClosed for renovation.\nTerminal 2\nPostcode: (TW6 1EW)\nDeparture:\nFrom the M4 exit follow the signs for Terminals 1, 2 & 3 all the way round following onto the Western Perimeter Road. Go through the main tunnel to the Central Terminal Area for Terminals 1, 2 & 3. Exiting the tunnel keep right passing the Central Bus Station joining the final approaches to Terminal 2 on Cosmopolitan Way. .\nArrival:\nOnce you have collected your luggage and are about to clear customs, call the number given when your car was collected. Make your way to the same place where you dropped the vehicle off Level 4 short stay car park, row R or S.",
"arrival": "Note: Please ensure you contact this number, 0208 050 3364, at least 30 minutes prior to arrival.\nTerminal 1\nPostcode: (TW6 1AP)\nClosed for renovation.\nTerminal 2\nPostcode: (TW6 1EW)\nDeparture:\nFrom the M4 exit follow the signs for Terminals 1, 2 & 3 all the way round following onto the Western Perimeter Road. Go through the main tunnel to the Central Terminal Area for Terminals 1, 2 & 3. Exiting the tunnel keep right passing the Central Bus Station joining the final approaches to Terminal 2 on Cosmopolitan Way. Again keep right as the road to Terminal 2 will move away from building, before turning back as the road ramps up to Terminal 2 Departures & the Short Stay 2 car park on Constellation Way. On the rising ramp continue to keep right as the ramp will lead directly into the Short stay car park entry barriers. Take the barrier ticket and enter the car park. "
"id": 1150,
"admin_id": 101,
"facilities": "Pick up at the Airport, Fully Insured Mature Driver's, 6 Miles from airport, Hassle free & convenient, Serving all terminals of Heathrow",
"park_api": "b2b"
},
QUERY PARAMETERS
| Field | Type | Description |
|---|---|---|
| user_email | String | Registered email address. |
| password | String | Your login password. |
| agent_code | String | Your Secret Agent Code key. |
| airport | String | IATA Airport codes. e.g LGW, LHR: |
| depdate | String | Departure Date in YYYY-MM-DD format 1999-01-21. |
| deptime | String | Departure Time in H:i format 10:00. |
| returndate | String | Return Date in YYYY-MM-DD format 1999-01-27. |
| returntime | String | Return Time in H:i format 20:00. |
RESPONSE PARAMETERS
| Field | Type | Description |
|---|---|---|
| status | String | Indicates the status of the API response. In this case, 'success' denotes a successful response. |
| airport | String | IATA Airport codes. e.g LGW, LHR |
| products | String | This is an array where each object represents a different parking product. The objects within this array contain the following field. |
| companyID | String | The Stock Keeping Unit or ID for the parking product. This is a unique identifier for each product. |
| product_code | String | The Stock Keeping Unit or Product code for the parking product. This is a unique identifier for each product. |
| name | String | Name of the parking product. |
| bookingemail | String | email for confirmation. (apibookings@api.magrgroup.com) |
| price | String | The quoted parking price for the product (e.g. "75.00"). |
| agent_amount / agent_month_end_return | String | Your parking share. M&G collects the full customer total; this amount is returned to you at month end. Fees are not included. |
| mg_amount / mg_retained | String |
M&G parking share (fees are not included on /products).
|
Fees (booking_fee, cancellation_fee, sms_notification_fee) are not returned on products.
Your app sends them on /bookings when the customer opts in; the booking response echoes what you sent.
|
||
| facilities | String | parking product facilities given by company. |
| park_api | String | its define its B2B product. |
| logo | String | HTML string containing an image tag for the product's logo. |
| parking_type | String | Indicates the type of service offered. Meet & Greet Or Park & Ride |
| cancelable | String | Yes Indicates if the booking is flexible, No is non-flexiable |
| editable | String | Yes Indicates if the booking is editable, No is non-editable |
| overview | String | A detailed overview of the product, including benefits and features |
| arival | String | A detailed departure procedures including HTML for formatting. |
| return_proc | String | Detailed arrival procedures including HTML for formatting. |
| special_features | String | unique services from airport. |
| processtime | String | Minimum number of hours required for booking. |
| opening_time | String | time of company opening time. |
| closing_time | String | time of company closing time. |
POST Create booking
Card payment (M&G Stripe) — agent website order
After the customer picks a product from /products:
(1) create PaymentIntent for
parking price + any fees your UI collected,
(2) collect booking details on your form,
(3) take card payment with Stripe.js,
(4) call POST /bookings with those details + payment_token = pi_...
and the same fee amounts (top-level or under fees).
Money always settles on M&G Stripe. Backend re-quotes and checks the paid amount (discount only from your share).
On /bookings the PaymentIntent must match this booking:
same agent, product, dates/times, airport, unused pi_, status succeeded, and amount covering the protected share.
A wrong or old PaymentIntent is rejected.
# Step 2 — customer clicked a product → create PaymentIntent
# Example: parking 55.99 + your UI fees (e.g. 1.99 + 1.99 + 1.25) = 61.22
curl -X POST https://api.magrgroup.com/api/payments/create-intent \
-H 'Content-Type: application/json' \
-d '{
"user_email": "registered@emailaddress.com",
"password": "your-password",
"agent_code": "your-agent-code",
"amount": 61.22,
"currency": "gbp",
"company_code": "HAPS-001",
"park_api": "b2b",
"airport_code": "LHR",
"dropoff_date": "2026-09-10",
"dropoff_time": "10:00",
"pickup_date": "2026-09-15",
"pickup_time": "10:00",
"bookreference": "YOUR-CLIENT-REF-OPTIONAL"
}'
# Save: payment_intent_id, client_secret, publishable_key
# M&G booking reference (MG-A-{id}) is created later on /bookings — not here.
Step 3 — on your website: show a form for name, email, phone, vehicle, flights.
Keep values in page state (do not send /bookings yet).
Step 4 — card pay (Stripe.js) — use publishable_key + client_secret.
Test card: 4242 4242 4242 4242, any future expiry, any CVC.
<!-- Include Stripe.js -->
<script src="https://js.stripe.com/v3/"></script>
<!-- Step 3: your booking details form (example fields) -->
<form id="details-form">
<input name="first_name" placeholder="First name" required>
<input name="last_name" placeholder="Last name" required>
<input name="customer_email" type="email" placeholder="Email" required>
<input name="phone_number" placeholder="Phone" required>
<input name="car_registration_number" placeholder="Vehicle reg" required>
<!-- …make, model, color, flights, terminals… -->
</form>
<!-- Step 4: card -->
<form id="payment-form">
<div id="card-element"></div>
<button id="submit">Pay & book</button>
<div id="error"></div>
</form>
<script>
// From create-intent (step 2):
const publishableKey = 'pk_test_...';
const clientSecret = 'pi_..._secret_...';
const stripe = Stripe(publishableKey);
const elements = stripe.elements();
const card = elements.create('card');
card.mount('#card-element');
document.getElementById('payment-form').addEventListener('submit', async (e) => {
e.preventDefault();
document.getElementById('submit').disabled = true;
// Read step-3 form values first
const details = Object.fromEntries(new FormData(document.getElementById('details-form')));
const { paymentIntent, error } = await stripe.confirmCardPayment(clientSecret, {
payment_method: {
card: card,
billing_details: {
name: (details.first_name + ' ' + details.last_name).trim(),
email: details.customer_email,
phone: details.phone_number,
},
},
});
if (error) {
document.getElementById('error').textContent = error.message;
document.getElementById('submit').disabled = false;
return;
}
if (paymentIntent.status === 'succeeded') {
// Step 5 — POST /bookings with details + payment_token
await fetch('https://api.magrgroup.com/api/bookings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
user_email: 'registered@emailaddress.com',
password: 'your-password',
agent_code: 'your-agent-code',
company_code: 'HAPS-001',
dropoff_date: '2026-09-10',
dropoff_time: '10:00',
pickup_date: '2026-09-15',
pickup_time: '10:00',
title: 'Mr',
first_name: details.first_name,
last_name: details.last_name,
customer_email: details.customer_email,
phone_number: details.phone_number,
car_registration_number: details.car_registration_number,
car_make: 'Ford',
car_model: 'Focus',
car_color: 'Blue',
departure_flight_number: 'BA123',
arrival_flight_number: 'BA456',
departure_terminal: 'Terminal 2',
arrival_terminal: 'Terminal 3',
passenger: 1,
park_api: 'b2b',
paymentgateway: 'stripe',
payment_token: paymentIntent.id,
// optional: bookreference: 'YOUR-CLIENT-REF'
}),
}).then(r => r.json()).then(data => {
// data.reference => "MG-A-12345"
console.log('Booking reference', data.reference);
});
}
});
</script>
# Step 5 — same as the fetch above (after PI succeeded)
curl -X POST https://api.magrgroup.com/api/bookings \
-H 'Content-Type: application/json' \
-d '{
"user_email": "registered@emailaddress.com",
"password": "your-password",
"agent_code": "your-agent-code",
"company_code": "HAPS-001",
"dropoff_time": "10:00",
"dropoff_date": "2026-09-10",
"pickup_time": "10:00",
"pickup_date": "2026-09-15",
"title": "Mr",
"first_name": "John",
"last_name": "Smith",
"customer_email": "customer@example.com",
"phone_number": "07123456789",
"departure_flight_number": "BA123",
"arrival_flight_number": "BA456",
"departure_terminal": "Terminal 2",
"arrival_terminal": "Terminal 3",
"car_registration_number": "AB12 CDE",
"car_make": "Ford",
"car_model": "Focus",
"car_color": "Blue",
"passenger": 1,
"park_api": "b2b",
"paymentgateway": "stripe",
"payment_token": "pi_XXXXXXXX",
"fees": {
"booking_fee": "1.99",
"cancellation_fee": "1.25",
"sms_notification_fee": "1.99"
}
}'
# Response example:
# {
# "success": true,
# "message": "Booking created",
# "reference": "MG-A-12345",
# "booking_amount": 61.22,
# "fees": {
# "booking_fee": "1.99",
# "cancellation_fee": "1.25",
# "sms_notification_fee": "1.99"
# }
# }
Create a booking after quoting. Use product_code / company_code and park_api from the products response.
booking_amount in the response is the total collected on M&G Stripe.
fees in the response echoes the fee amounts you sent on the booking request (not catalog defaults).
JSON BOOKING POST DATA PARAMETERS
| Field | Type | Description |
|---|---|---|
| agent_code | String | Your secret agent code used for authentication. |
| user_email | String | User Email of the booking partner or agent. |
| password | String | Password of the booking partner or agent. |
| company_code | String | Unique code assigned to the parking company. |
| bookreference | String |
Optional. Your own client/order reference (stored as extra ref).
M&G booking reference is generated automatically as MG-A-{id} and returned in the response.
|
| dropoff_time | String | Scheduled time for vehicle drop-off (format: H:i). |
| dropoff_date | String | Scheduled date for vehicle drop-off (format: YYYY-MM-DD). |
| pickup_time | String | Scheduled time for vehicle pickup (format: H:i). |
| pickup_date | String | Scheduled date for vehicle pickup (format: YYYY-MM-DD). |
| title | String | Title of the customer (e.g., Mr, Mrs, Miss). |
| first_name | String | First name of the customer. |
| last_name | String | Last name of the customer. |
| customer_email | String | Email address this is agent email for conformation email. |
| phone_number | String | Contact phone number of the customer. |
| departure_flight_number | String | Flight number of the departure flight. |
| arrival_flight_number | String | Flight number of the return/arrival flight. |
| departure_terminal | String | Terminal of departure at the airport. |
| arrival_terminal | String | Terminal of arrival at the airport. |
| car_registration_number | String | Vehicle registration number. |
| car_make | String | Make/brand of the car (e.g., Ford, BMW). |
| car_model | String | Model of the car (e.g., Fiesta, X5). |
| car_color | String | Color of the car. |
| park_api | String | Booking source identifier (e.g., b2b, direct). |
| passenger | String | Number of passengers for the booking. |
| paymentgateway | String |
Use stripe. Payment is collected on your website via M&G Stripe PaymentIntent.
|
| payment_token | String |
Stripe PaymentIntent id (pi_...) after status is succeeded.
|
| booking_amount | String | Total amount charged for the booking (parking + fees collected on the PaymentIntent). |
| fees | Object |
Optional. Fees your UI collected, e.g.
{"booking_fee":"1.99","cancellation_fee":"1.25","sms_notification_fee":"1.99"}.
Top-level keys also accepted. Echoed back in the response.
|
Sample success response :
{
"success": true,
"message": "Booking created",
"reference": "MG-A-12345",
"booking_amount": 61.22,
"fees": {
"booking_fee": "1.99",
"cancellation_fee": "1.25",
"sms_notification_fee": "1.99"
}
}
RESPONSE PARAMETERS
| Field | Type | Description |
|---|---|---|
| success | Boolean | true when the booking was created. |
| message | String | Booking created |
| reference | String | A unique parking reference code for the booking for customer, in this case, "MG-A-12345". |
| booking_amount | Number | Total amount collected (parking + fees) on M&G Stripe for this booking. |
| fees | Object |
Echo of fees you sent on the booking request:
booking_fee, cancellation_fee, sms_notification_fee
(empty object if none were sent).
|
POST Amend booking
Non-Flexible Booking: This type of booking cannot be modified once confirmed. Flexible Booking: Modifications to this booking type are permitted, provided they are made at least 24 hours prior to the scheduled departure date. Using Stripe Payment Intent Method, API doesn't support Extend Booking Request.For date change cancel the booking and book again.But if you want to change only the airport details or customer details follow the bellow request
curl \
-X POST https://api.magrgroup.com/api/amend/ \
-H 'Content-Type: application/json' \
-H 'Cache-Control: no-cache' \
-d '{
"company_code": "HAPS-001",
"bookreference": "CDC-012504222077",
"amend_booking": "amend_booking",
"dropoff_time": "09:00",
"dropoff_date": "2025-04-24",
"pickup_time": "09:00",
"pickup_date": "2025-04-29",
"title": "Mr",
"first_name": "test",
"last_name": "test",
"customer_email": "b2b@meetandgreetparkingdeals.com",
"phone_number": "23433323",
"departure_flight_number": "TBA",
"arrival_flight_number": "test",
"departure_terminal": "Terminal 2",
"arrival_terminal": "Terminal 3",
"car_registration_number": "test",
"car_make": "test",
"car_model": "test",
"car_color": "test",
"park_api": "b2b",
"passenger": 1,
"paymentgateway": "Invoice",
"payment_token": "pi_3RGghGL3PGdUbgCn0UtqdIj3",
"booking_amount": 50.99,
"agent_code": "Ic5w0rP2kWu4M5DVDUztZH6tYqPb",
"user_email": "b2b@meetandgreetparkingdeals.com",
"password": "1234"
}'
| Field | Type | Description |
|---|---|---|
| agent_code | String | Your secret agent code used for authentication. |
| user_email | String | User Email of the booking partner or agent. |
| password | String | Password of the booking partner or agent. |
| company_code | String | Unique code assigned to the parking company. |
| bookreference | String | M&G booking reference from the create-booking response (e.g. MG-A-12345). |
| amend_booking | String | Flag to indicate if this is an amendment to an existing booking. |
| dropoff_time | String | Scheduled time for vehicle its change able in amend drop-off (format: H:i). |
| dropoff_date | String | Scheduled date for vehicle that will be at booking time its not change drop-off (format: YYYY-MM-DD). |
| pickup_time | String | Scheduled time for vehicle its change able in amend pickup (format: H:i). |
| pickup_date | String | Scheduled date for vehicle that will be at booking time its not change pickup (format: YYYY-MM-DD). |
| title | String | Title of the customer (e.g., Mr, Mrs, Miss). |
| first_name | String | First name of the customer. |
| last_name | String | Last name of the customer. |
| customer_email | String | Email address this is agent email for conformation email. |
| phone_number | String | Contact phone number of the customer. |
| departure_flight_number | String | Flight number of the departure flight. |
| arrival_flight_number | String | Flight number of the return/arrival flight. |
| departure_terminal | String | Terminal of departure at the airport. |
| arrival_terminal | String | Terminal of arrival at the airport. |
| car_registration_number | String | Vehicle registration number. |
| car_make | String | Make/brand of the car (e.g., Ford, BMW). |
| car_model | String | Model of the car (e.g., Fiesta, X5). |
| car_color | String | Color of the car. |
| park_api | String | Booking source identifier (e.g., b2b, direct). |
| passenger | String | Number of passengers for the booking. |
| paymentgateway | String | Payment method used (e.g., Card, Invoice) at booking time. |
| payment_token | String | Token received from the payment gateway at booking time . |
| booking_amount | String | Total amount charged for the booking. |
RESPONSE PARAMETERS
Amend Sample Success response :
{
"status": "success",
"message": "Booking updated successfully",
"reference": "MG-A-12345",
}
Amend Sample user email,key or password Error response :
{
"status": "Error",
"message": "Invalid API Credentials (User not found)",
}
Amend Sample 48 Hours Error response :
{
"status": "Error",
"message": "Booking cannot be amended within 48 hours of departure",
}
Amend Sample NonFlex Error response :
{
"status": "Error",
"message": "the product must be flex",
}
| Field | Type | Description |
|---|---|---|
| Status | String | Indicates the status of the API response. 'success' denotes a successful completion of the booking amendment. 'error' denotes failure of booking amendment.. |
| message | String | if 'success' a confirmation message to show that booking has been amended successfully. if 'error' a response message to show the reason why booking cannot be amended. |
| reference | String | A unique parking reference code that send in request for update, in this case, "MG-A-12345". |
POST Cancel booking
Submits a cancellation request only. The product must be cancelable=Yes and drop-off at least 24 hours away.
M&G cancels with the parking company afterwards; Stripe refund is issued only after company confirmation.
Non-cancelable products return an error and do not create a request. Same behaviour on /cancel_booking and /partner/parking/cancel.
curl \
-X POST https://api.magrgroup.com/api/cancel/ \
-H 'Content-Type: application/json' \
-H 'Cache-Control: no-cache' \
-d '{
"booking_ref": "CDC-012504222077",
"refund": 50.99,
"agent_code": "Ic5w0rP2kWu4M5DVDUztZH6tYqPb",
"user_email": "b2b@meetandgreetparkingdeals.com",
"password": "1234"
}'
| Field | Type | Description |
|---|---|---|
| agent_code | String | Your secret agent code used for authentication. |
| user_email | String | User Email of the booking partner or agent. |
| password | String | Password of the booking partner or agent. |
| booking_ref | String | the Unique booking reference that will get in response of booking conformation. |
| refund | String | Total amount refund for the booking.whcih is not more then the acutal booking amount |
RESPONSE PARAMETERS
Cancellation Sample response :
{
"status": "success",
"message": "Cancellation request received. You will be notified after the company confirms.",
"booking_ref": "MG-A-12345",
"cancel_stage": "Pending",
"cancelable": "Yes",
"requested_refund": "50.99"
}
Cancel Sample user email,key or password Error response :
{
"status": "Error",
"message": "Invalid API Credentials (User not found)",
}
Cancel Sample 48 Hours Error response :
{
"status": "Error",
"message": "Booking cannot be Cancel within 48 hours of departure",
}
Cancel Sample NonFlex Error response :
{
"status": "Error",
"message": "the product must be flex",
}
| Field | Type | Description |
|---|---|---|
| Status | String | Indicates the status of the API response. 'success' denotes a successful completion of the booking Cancellatoin. 'error' denotes failure of booking Cancellatoin.. |
| message | String | if 'success' a confirmation message to show that booking has been Cancellatoin successfully. if 'error' a response message to show the reason why booking cannot be Cancellatoin. |
| reference | String | A unique parking reference code that send in request for update, in this case, "MG-A-12345". |
Errors
The meet and greet API sent following error response:
EMPTY OR INVALID LOGIN EMAIL & HASH KEY PARAMETERS
Error Sample response :
{
"status": "Error",
"message": "User Email is required or Invalid API Credentials ",
}
Error Sample response :
{
"status": "Error",
"message": "Your request is for live API but your account is in test mode. Use https://dev-api.magrgroup.com for test accounts.",
}
Error Sample response :
{
"status": "Error",
"message": "e.g Booking Reference is Missing. Payment Transaction is Missing.",
}
| Field | Type | Description |
|---|---|---|
| Status | String | Indicates the status of the API response. In this case, 'error' denotes a failure to provide wrong / empty required parameters. |
| message | String | User Email is required or Invalid API Credentials |
TEST / LIVE API MODE
| Field | Type | Description |
|---|---|---|
| Status | String | Indicates the status of the API response. In this case, 'error' denotes a failure using Live / Test API over wrong end points. |
| message | String | Your request is for live API but your account is in test mode |
TEST / LIVE API MODE
| Field | Type | Description |
|---|---|---|
| Status | String | Indicates the status of the API response. In this case, 'error' denotes a failure when sending wrong , invalid or empty required parameters. |
| message | String | Contains detail of missing parameters. |