LetsGetChecked · AsyncAPI Specification
Letsgetchecked Notifications Webhooks
Version
View Spec
View on GitHub
CompanyHealthHealthcareDiagnosticsLaboratoryTelehealthMedical TestingPharmacyOrdersResultsWebhooksHL7LOINCAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-04'
method: searched
source: https://docs.letsgetchecked.com/documentation/API%20Reference/API%20Notifications/webhooks/
spec_type: none
spec_type_note: 'LetsGetChecked publishes NO AsyncAPI document. The GitHub org
(github.com/LetsGetChecked) carries three repositories, none of them a specification,
and no /asyncapi.yaml or event-catalog endpoint exists on any host. This artifact
captures the documented WEBHOOK CATALOG verbatim from the API Notifications reference —
it is a Webhooks surface, not an AsyncAPI one. Nothing here is generated.'
surface: webhooks
docs: https://docs.letsgetchecked.com/documentation/API%20Reference/API%20Notifications/webhooks/
transport:
protocol: HTTPS
method: POST
direction: LetsGetChecked -> client endpoint
content_type: application/json
endpoint_registration: 'Manual. The client supplies its endpoint URL (and HMAC signing
key) to LetsGetChecked, who configure the webhook on the staging environment during
onboarding. There is no self-service webhook management API.'
endpoint_granularity: 'A single destination endpoint, or a different endpoint per
webhook type.'
payload:
shape: '{ "type": <resource type>, "body": { ... } }'
common_fields:
- name: type
description: The resource type that changed — order, Result, or outreach.
note: 'Case is inconsistent across the published examples: "order", "Result",
"outreach".'
- name: body.callbackURL
description: A URL back into the LetsGetChecked REST API to query the changed resource.
absent_on: [outreach]
- name: body.timestamp
description: Creation time of the message, UTC. Use it to order events against your
own state.
event_types:
- type: order
description: An updated order.
versions:
- version: v1
example:
body:
clientOrderId: '123456789'
callbackURL: '{LGC-API}/1001/api/v1/orders/123456789/status'
timestamp: '2022-03-04T11:35:17.43+00:00'
type: order
- version: v2
example:
type: order
body:
clientOrderId: '246975'
callbackURL: '{LGC-API}/1111/api/v2/orders/246975'
orderItemStatus:
id: 2fa58516-fc54-4e5d-9349-4865d38f785e
status:
code: KitRegistered
timestamp: '2023-05-15T16:22:11.3513804Z'
statuses:
- code: Submitted
description: The client has submitted an order to LetsGetChecked.
- code: Created
description: LetsGetChecked has created the order.
- code: KitDispatched
description: The order is dispatched from LetsGetChecked to the participant.
- code: KitRegistered
description: 'The participant has activated the test kit; the LGC kit identifier is
populated.'
- code: KitArrivedAtLab
description: The test kit is received at the LetsGetChecked lab.
- code: ResultsAvailable
description: Results are available for a test kit.
- code: Cancelled
description: 'Set when a client triggers cancellation via the v2 PATCH order endpoint.
Only available up to KitArrivedAtLab, and only on Orders API v2.'
- code: ValidationFailed
description: 'Set when the system cannot process a submitted order; the status moves
from Submitted to ValidationFailed.'
- type: Result
description: An updated result.
example:
body:
barcode: LGC-XXX-XXX-XXX
alphaCode: QWERTY
callbackURL: '{LGC-API}/1001/api/v1/results/{Barcode}?alphaCode={AlphaCode}&fields=status'
timestamp: '2022-03-04T10:33:37.6713587Z'
type: Result
note: 'Order and result each carry their own status. The same status value (for example
ResultsAvailable) can arrive on both the order and the result event and must be
interpreted separately.'
- type: outreach
description: An updated outreach notification.
example:
body:
barcode: LGC-XXX-XXX-XXX
type: PcpResultsLetter
status: DeliverySent
failureReason: null
timestamp: '2022-08-10T11:37:37.6715487Z'
type: outreach
body_types:
- PcpResultsLetter
- PatientResultsLetter
body_statuses:
- DeliverySent
fields:
- name: failureReason
description: Not currently in use; the value is always null.
no_callback_url: true
delivery:
guarantee: at-least-once
ordering: not guaranteed
ordering_note: 'Events may not arrive in generation order. LetsGetChecked''s own example
is that KitDispatched and KitRegistered can be delivered out of sequence, and advises
clients to reconcile by querying the API for the current status.'
duplicate_handling: 'Endpoints may receive the same event more than once; clients are
instructed to make event processing idempotent.'
acknowledgement:
success_status: 200
retry:
retryable_statuses: [5xx, 401, 403]
schedule: '3 immediate retries, then a 15-minute wait followed by 3 more immediate
retries, looping 4 times — a 1-hour retry window in total.'
total_attempts: 15
exhaustion: 'The webhook mechanism fails; the client must contact LetsGetChecked.'
dead_letter_queue: none published
replay_api: none published
docs: https://docs.letsgetchecked.com/documentation/API%20Reference/API%20Notifications/event_handling/
security:
default: unauthenticated
default_note: 'LetsGetChecked states authentication is not required for submitted
payloads "due to their lightweight content", and instructs clients to inspect the
received callback URL so access tokens are not leaked when following links.'
optional_signing:
enabled_on_request: true
header: Authorization
scheme: LGC2-HMAC-SHA256
algorithm: HMAC-SHA256
encoding: base64
signed_payload: the stringified JSON request body
key_supply: 'Client generates a strong signing key in base64 and provides it to
LetsGetChecked.'
verification: 'Recompute HMAC-SHA256(signing key, stringified body), base64-encode,
and compare with the header value.'
reference: https://www.rfc-editor.org/rfc/rfc2104
replay_protection: none published
timestamp_tolerance: not published
docs: https://docs.letsgetchecked.com/documentation/API%20Reference/API%20Notifications/security/
gaps:
- No AsyncAPI (or any machine-readable event schema) is published.
- No self-service webhook subscription, rotation, or test-delivery endpoint.
- Signing is opt-in rather than default, on a surface that notifies about PHI-bearing
resources.
- No timestamp tolerance or nonce, so a signed payload can be replayed.
- No dead-letter queue or event-replay API once the 1-hour retry window is exhausted.
- The type discriminator is inconsistently cased across the published examples.