1. Home
Healthier Business Group
  • Healthier Business Group
  • Integrations
  • Virtual BLS APIs
    • Authentication
      • Exchange credentials for a token pair
      • Refresh an access token
      • Inspect the current token
      • Revoke the current token
    • Client
      • Get your unique booking URL
      • Get credit and money balances
      • List wallet transactions
    • Timeslots
      • List available timeslots
      • Hold a timeslot
      • Release a slot hold
    • Bookings
      • List bookings
      • Create a booking
      • Get a single booking
      • Download a certificate
    • Webhook Endpoints
      • List webhook endpoints
      • Create a webhook endpoint
      • Get a webhook endpoint
      • Update a webhook endpoint
      • Delete a webhook endpoint
      • Rotate the signing secret
      • Send a test event
    • Webhook Events
      • Booking created
      • Booking confirmed — candidate paid
      • Booking rescheduled
      • Booking cancelled
      • Attendance marked
      • Equipment return overdue
      • Certificate available
      • Test event
    • Courses
      • List active courses
  • Practical Training APIs
    • Authentication
      • Exchange credentials for a token pair
      • Refresh an access token
      • Inspect the current token
      • Revoke the current token
    • Client
      • Get your unique booking URL
      • Get account profile
      • Get credit and money balances
      • List wallet transactions
    • Courses
      • List active courses
    • Locations
      • List training locations
    • Training Events
      • List upcoming training events
      • Get a training event
      • Hold a seat (30 minutes)
      • Release a seat hold
    • Bookings
      • List bookings
      • Create a booking
      • List no-show bookings
      • Get a booking
      • Cancel a booking
      • Download completion certificate (PDF)
    • Booking Invites
      • List booking invites
      • Create and send a booking invite
      • Get a booking invite
    • Webhook Endpoints
      • List webhook endpoints
      • Register a webhook endpoint
      • Get a webhook endpoint
      • Update a webhook endpoint
      • Delete a webhook endpoint
      • Rotate the signing secret
      • Send a test delivery
    • Webhook Events
      • Booking Created
      • Booking Confirmed (Stripe Payment)
      • Booking Rescheduled
      • Booking Cancelled
      • Attendance Marked
      • Candidate No-Show
      • Certificate Available
      • Booking Invite Sent
      • Booking Invite Opened
      • Booking Invite Used
      • Credit Balance Low
      • Credit Balance Depleted
      • Money Balance Low
      • Money Balance Depleted
      • Training Event Seats Running Low
      • Seat Hold Expired
      • Test Event
  • Registration Assurance Monitoring APIs
    • Authentication
      • Obtain access token
      • Refresh access token
      • Get token info
      • Revoke current token
    • Workers
      • List workers
      • Create worker
      • Get worker
      • Update worker
      • Partially update worker
      • Delete worker
    • Verification
      • Verify single worker
      • Get worker verification history
      • Batch verify all workers
      • Get verification job status
    • Alerts
      • List alerts
      • Get alert
      • Acknowledge single alert
      • Acknowledge alerts in bulk
    • Monitoring
      • Update worker monitoring settings
      • Bulk update monitoring settings
    • Evidence
      • List worker evidence files
      • Get evidence metadata
      • Download evidence file
    • Billing
      • Get billing and usage summary
    • Imports
      • List worker imports
      • Upload worker CSV import
      • Get worker import status
    • Team
      • List available team roles
      • List team users
      • Create team user
      • Get team user
      • Update team user
      • Delete team user
    • Webhooks
      • List webhook endpoints
      • Create webhook endpoint
      • Get webhook endpoint
      • Update webhook endpoint
      • Delete webhook endpoint
      • Rotate webhook secret
      • Queue test webhook delivery
  • HB Portal APIs V2
    • Authentication
      • Get access token
      • Refresh access token
      • Get token info
      • Revoke current token
    • Reference Requests
      • References
        • Get reference detail
        • Download reference PDF
      • List reference requests
      • Create reference request
      • Get reference request
      • Cancel reference request
      • Add referee to request
      • Send reminders
    • Candidate Requests
    • Training Requests
    • OH Requests
    • Practical Training Requests
    • BLS Requests
    • Appraisal Requests
    • Certificate Requests
    • Training Verification Requests
    • Webhooks
      • List webhook endpoints
      • Create webhook endpoint
      • Update webhook endpoint
      • Delete webhook endpoint
      • View webhook call logs
      • Send test webhook
    • Templates
      • List form templates
  • HB Portal APIs V1 - Deprecated
    • Candidate Requests
      • Get All Candidates
      • Get Candidate Data
      • Create New Candidate
      • Update Candidate Details
    • Training Requests
      • Get Available Trainings
      • Get Candidate Course Result
      • Get Candidate Training Report
      • Get Candidate Training Report - Unassigned
    • OH Requests
      • Get Available Forms
      • Get Form Fields
      • Creating a new submission
      • Modifying the details of an existing submission (Upload Documents)
      • Make final form submission (after uploading documents)
      • Get submission list
      • Retrieve submission result details
      • Retrieve the submission result documents for the employer
    • Certificates Requests
      • Get Training Certificate
      • Get Training Certificate - including expired
      • Get Training Certificate - including non-assigned courses, but excluding expired
      • Get Training Certificate - All available courses
      • Get Training Certificate - Specific Course
    • Webhooks
      • Training Completion
      • Course Completion
  • HB Services APIs
    • List Interview Bookings
  • Practical Training Legacy APIs - Deprecated
    • Bookings
      • Get Past Bookings
      • Get Upcoming Bookings
      • Search Bookings by Date
    • Booking Links
      • Search Booking Links
  • Schemas
    • InterviewBooking
    • TokenRequest
    • CourseItem
    • Pagination
    • TokenResponse
    • ReferenceRequest
    • RefreshRequest
    • BookingsResponse
    • Reference
    • TokenInfo
    • MessageResponse
    • BookingLinksResponse
    • ReferenceDetail
    • ClientProfile
    • CreateReferenceRequest
    • Worker
    • CreditsResponse
    • RefereeInput
    • WorkerResponse
    • SlotItem
    • Transaction
    • Template
    • WorkerPaginatedResponse
    • TimeslotsResponse
    • TransactionListResponse
    • StoreWorkerRequest
    • HoldRequest
    • Course
    • CreateWebhookEndpoint
    • UpdateWorkerRequest
    • HoldResponse
    • Location
    • UpdateWebhookEndpoint
    • VerificationCheck
    • LocationListResponse
    • WebhookCall
    • VerificationCheckPaginatedResponse
    • BookingResource
    • CourseRef
    • WebhookPayload
    • VerifyQueuedResponse
    • PaginatedBookings
    • LocationRef
    • VerifyBatchResponse
    • PaginatedTransactions
    • TrainerRef
    • VerificationJobStatus
    • CreateWebhookRequest
    • TrainingEvent
    • Error
    • Alert
    • UpdateWebhookRequest
    • TrainingEventDetail
    • RateLimitError
    • AlertPaginatedResponse
    • WebhookEndpointResource
    • TrainingEventListResponse
    • ValidationError
    • BulkAcknowledgeAlertsRequest
    • WebhookCreatedResponse
    • SlotHoldResponse
    • AcknowledgeCountResponse
    • ConflictHold
    • UpdateMonitoringSettingsRequest
    • CandidateInfo
    • Booking
    • BulkUpdateMonitoringSettingsRequest
    • EvidenceFile
    • BookingDetail
    • EvidenceFilePaginatedResponse
    • BookingListResponse
    • BillingUsageResponse
    • CreateBookingRequest
    • StoreWorkerImportRequest
    • BookingInviteRef
    • BookingInvite
    • WorkerImport
    • WorkerImportPaginatedResponse
    • BookingInviteListResponse
    • TeamUser
    • CreateBookingInviteRequest
    • WebhookEndpoint
    • TeamUserPaginatedResponse
    • StoreTeamUserRequest
    • WebhookEndpointWithSecret
    • UpdateTeamUserRequest
    • WebhookEndpointListResponse
    • CreateWebhookEndpointRequest
    • WebhookEndpointPaginatedResponse
    • UpdateWebhookEndpointRequest
    • StoreWebhookEndpointRequest
    • WebhookEnvelope
    • PaginationMeta
    • PaginationLinks
    • CreateWebhookEndpointResponse
    • RotateWebhookSecretResponse
    • ErrorResponse
    • ValidationErrorResponse
    • WebhookTestRequest
    • WebhookTestQueuedResponse
    • WebhookEventStatusChanged
    • WebhookEventInitialVerification
Home
HB PortalRequest API access
Home
HB PortalRequest API access
X
Instagram
LinkedIn
  1. Home

Healthier Business - Virtual BLS

📌
⚠️ This API is in beta. Endpoint shapes, event payloads, and behaviour may change before general availability. Breaking changes will be communicated to registered integrators in advance.

BLS Portal Client API - Overview#

The BLS Portal Client API lets agency integrators programmatically manage Basic Life Support training bookings, discover available timeslots, and receive real-time webhook notifications for booking lifecycle events.
Base URL: https://bls.hbcompliance.co.uk/api/v1

How BLS Bookings Work#

BLS training is delivered remotely — candidates receive a training kit (mannequin, AED trainer, etc.), complete the course, and return the equipment. This affects two important API behaviours:
Timeslots are dynamic. There are no fixed training events — instead, available date/time slots are generated based on trainer capacity. Query them via GET /timeslots, hold one via POST /timeslots/hold, then confirm with POST /bookings.
Certificates require equipment return. GET /bookings/{id}/certificate is only available once training_status = completed and equipment_status = in (equipment received back by TDTA). The booking.certificate_available webhook fires at this point.

Authentication#

All protected endpoints require a Bearer token in the Authorization header:
Authorization: Bearer <access_token>
Obtain a token pair via POST /auth/token using your hb_client_id and an active API key. Access tokens expire after 1 hour; use POST /auth/refresh (valid 7 days) to rotate without re-entering credentials.

Endpoints#

Authentication#

MethodPathAuthDescription
POST/auth/token—Exchange hb_client_id + api_key for a token pair
POST/auth/refresh—Rotate access token using a refresh token
GET/auth/token-info✓Inspect the current token
POST/auth/revoke✓Revoke the current token

Client#

MethodPathAuthDescription
GET/booking-url✓Your account's unique public booking URL
GET/credits✓Per-course credit balances and GBP money balance
GET/transactions✓Paginated wallet transaction history

Courses#

MethodPathAuthDescription
GET/courses✓Active BLS courses — use IDs for timeslot and booking queries

Timeslots#

MethodPathAuthDescription
GET/timeslots✓Available date/time slots for a course
POST/timeslots/hold✓Reserve a timeslot for 30 minutes
DELETE/timeslots/hold/{holdHash}✓Release a timeslot hold early

Bookings#

MethodPathAuthDescription
GET/bookings✓List bookings (filterable, paginated)
POST/bookings✓Create a booking using a held timeslot
GET/bookings/{id}✓Single booking detail
GET/bookings/{id}/certificate✓Download completion certificate (PDF)

Webhook Endpoints#

MethodPathAuthDescription
GET/webhooks✓List registered webhook endpoints
POST/webhooks✓Register a new endpoint (secret shown once)
GET/webhooks/{id}✓Get an endpoint
PUT/webhooks/{id}✓Update name, URL, events, timeout, active state
DELETE/webhooks/{id}✓Delete an endpoint
POST/webhooks/{id}/rotate-secret✓Generate a new signing secret
POST/webhooks/{id}/test✓Send a test delivery

Timeslot & Booking Flow#

The standard booking flow is a three-step process:
1. GET  /timeslots?course_id=1&months_ahead=2   → pick a date/time
2. POST /timeslots/hold                          → hold_hash (valid 30 min)
3. POST /bookings                                → confirmed booking
Step 1 — Query available slots
GET /timeslots?course_id=1&months_ahead=2&date=2026-07-15
Returns a list of { date, time, course } objects. Optionally filter to a specific date.
Step 2 — Hold a slot
POST /timeslots/hold
{
  "course_id": 1,
  "date": "2026-07-15",
  "time": "10:00"
}
Response includes a hold_hash and expires_at (30 minutes). Only one active hold is permitted per account at a time — a 409 is returned if one already exists.
Step 3 — Create the booking
POST /bookings
{
  "hold_hash": "Xy7kRtQmNpLsWvBzJcFdEaHgUiOeYtAn",
  "first_name": "Jane",
  "last_name": "Smith",
  "email": "jane@example.com",
  "phone": "+441234567890",
  "address": "42 Acme Street",
  "city": "Manchester",
  "postcode": "M1 1AA",
  "job_role": "Registered Nurse",
  "pay_option": "credits",
  "agency_contact_name": "John Doe",
  "agency_contact_email": "john@acme.co.uk",
  "agency_email": "invoices@acme.co.uk"
}
The hold is released and a booking is created in one step.

Payment Options#

pay_optionBehaviour
creditsDeducts 1 booking credit for the course. Confirmed immediately.
balanceDeducts the course cost from your GBP money balance. Confirmed immediately.
invoiceRaised as an invoice to your account. Confirmed immediately. Requires invoice_payments enabled and sufficient credit limit.
candidate_paysCandidate receives a Stripe payment link by email. Booking is pending until paid.
Note: BLS uses invoice (not inv) for invoice-based payments.

Credits & Balances#

GET /credits returns:
{
  "booking_credits": [
    { "course_id": 1, "course_name": "BLS Practical", "credits": 12 }
  ],
  "booking_money_balance": 480.00,
  "currency": "GBP"
}
Booking credits — 1 credit = 1 booking for the specified course.
Booking money balance — a pre-paid GBP balance deducted at the course rate when pay_option: balance.

Certificates#

GET /bookings/{id}/certificate
Returns a PDF binary stream. Available only when both conditions are met:
1.
training_status = completed — training was marked complete by TDTA staff.
2.
equipment_status = in — the training kit has been returned to TDTA.
Returns 422 otherwise. Subscribe to booking.certificate_available to know exactly when the certificate is ready.

Pagination#

All list endpoints return a consistent envelope:
{
  "data": [ ... ],
  "meta": {
    "current_page": 1,
    "per_page": 20,
    "last_page": 4,
    "total": 71
  },
  "links": {
    "next": "https://bls.hbcompliance.co.uk/api/v1/bookings?page=2",
    "prev": null
  }
}

Rate Limiting#

60 requests per minute per IP. Exceeding this returns 429 Too Many Requests.

Errors#

StatusMeaning
401Missing or invalid bearer token
404Resource not found or not owned by your account
409Conflict (e.g. active timeslot hold already exists)
422Validation failed or business rule violation
429Rate limit exceeded
500Server error — contact support

Webhook Events#

The following outbound events are available for subscription:
EventFires when
booking.createdA new booking is confirmed (immediately for credits/balance/invoice; or after Stripe payment for candidate_pays)
booking.confirmedA candidate_pays booking transitions from pending to booked after Stripe payment
booking.rescheduledA booking is moved to a different timeslot
booking.cancelledA booking is cancelled
booking.attendance_markedTraining attendance is recorded by TDTA staff
booking.equipment_lateEquipment has not been returned by the expected date
booking.certificate_availableTraining completed and equipment returned — certificate is ready
webhook.testManual test triggered via POST /webhooks/{id}/test
All events share the same envelope:
{
  "event_id": "018f4a2b-1234-7000-8abc-def012345678",
  "event_type": "booking.created",
  "occurred_at": "2026-06-05T10:00:00+00:00",
  "data": { ... }
}

Signature Verification#

Every webhook request includes these headers:
HeaderDescription
X-TDTA-EventEvent type, e.g. booking.created
X-TDTA-Event-IdUUID of the event — use for idempotency
X-TDTA-Delivery-IdNumeric delivery attempt ID
X-TDTA-TimestampUnix timestamp of dispatch (seconds)
X-TDTA-Signaturesha256=<hmac> — see below
Computing the expected signature:
signature = HMAC-SHA256(signing_secret, "{timestamp}.{raw_json_body}")
expected  = "sha256=" + signature
Compare using a constant-time comparison. Reject requests where |now() - X-TDTA-Timestamp| > 300 (5-minute replay window).
PHP:
Python:

Retries#

Deliveries are retried up to 5 times with a 15-minute backoff on any non-2xx response or timeout. Return any 2xx status to acknowledge receipt.

Contact & Support#

Support emailhttps://hbcompliance.co.uk/contact-us/
Bug reports / feedbackhttps://hbcompliance.co.uk/contact-us/
ProviderHealthier Business Group
For urgent issues affecting live bookings, email with the subject line [BLS API URGENT] and include your hb_client_id and any relevant booking_id.
Modified at 2026-06-05 10:40:41
Previous
Integrations
Next
Exchange credentials for a token pair
Built with