πŸ§ͺ LIMS Integration Guide

Poveon API Documentation

A complete reference for integrating with the Poveon laboratory request platform. All endpoints follow REST conventions and return JSON (unless noted).

Base URL:https://poveon.com
Protocol:HTTPS only
Format:JSON / FormData
Auth:Cookie / API Key

Overview

The Poveon API enables healthcare systems and LIMS to automate lab request management. You can create requests programmatically, track their lifecycle, deliver results, and manage laboratory accounts β€” all through a clean REST interface.

πŸ“

Request Creation

Doctors or integrated systems submit patient test requests without a login.

πŸ“‘

Real-time Status

Poll or webhook-trigger status checks as patients progress through the lab.

πŸ“„

Result Delivery

Attach PDF results or share secure links directly to doctors and patients.

πŸ₯

Lab Management

Admin APIs let you provision and manage multiple lab accounts.

Authentication

The API supports three access levels. Lab endpoints accept either a session cookie (for human users logging in via the portal) or an X-Poveon-Api-Key header (for LIMS and server integrations). Public endpoints require no credentials.

πŸ”‘LIMS / Server Authentication (API Key)

For machine-to-machine integrations, generate an API key from the Admin Dashboard β†’ Labs β†’ Dev panel. Pass it in every request as a header. Keys are hashed server-side β€” the raw value is only shown once at generation time.

# All lab endpoints accept this header instead of a session cookie:
X-Poveon-Api-Key: pvn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Node.js example
const res = await fetch("https://poveon.com/api/requests/retrieve", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Poveon-Api-Key": process.env.POVEON_API_KEY,
  },
  body: JSON.stringify({ code: "CDL-A3X9B1" }),
});
🌐Public

No authentication required. Any client can call these endpoints.

/api/labs/api/requests/create
πŸ”¬Lab Auth

Pass either a session cookie (portal login) or an X-Poveon-Api-Key header. Both grant the same access scoped to your lab.

/api/lab/requests/api/requests/retrieve/api/requests/update-status/api/requests/send-results
πŸ”Admin Auth

Requires a Supabase session for a verified AdminUser record. Only Poveon staff accounts qualify.

/api/admin/*

Custom Lab Email Branding

By default, all system emails β€” order confirmations, patient tracking codes, and result deliveries β€” are sent from Poveon's address (notifications@poveon.com). Labs can optionally have these emails sent from their own address instead.

βœ‰οΈHow It Works

When a lab has a notification_email configured (e.g. no-reply@apexdiagnostics.com), every email in the flow β€” including LIMS-triggered results β€” goes out from that address under the lab's name. Recipients see the lab's brand, not Poveon's.

πŸ“

Order confirmation

Sent to doctor when a request is created

πŸ”‘

Patient tracking code

Sent to patient if email was provided at creation

πŸ‘

Patient arrived notice

Sent to doctor when lab retrieves the order

πŸ“„

Results delivery

Sent to doctor and patient when lab sends results

⚠️Activation Required

Custom lab email addresses must be verified in Resend before they can be used. This is a one-time setup done by the Poveon team β€” labs cannot self-serve this step. Contact support@poveon.com with your desired sending address to get onboarded.

  • β€’Unverified addresses will cause email delivery to silently fail.
  • β€’Each lab can have one notification_email configured.
  • β€’The domain (e.g. apexdiagnostics.com) must be verified β€” not just the address.

From Address β€” Before vs. After

Default (no custom email set)

From: Poveon <notifications@poveon.com>

With custom email configured

From: Apex Diagnostics <no-reply@apexdiagnostics.com>

Request Status Workflow

Every lab request moves through three stages. Transitions are strictly enforced server-side.

πŸ“₯IncomingCreated by doctor
β–Ά
πŸ‘SeenPatient arrived
β–Ά
βœ…DoneResults sent
TransitionTrigger
incoming β†’ seenLab retrieves request by code
seen β†’ doneLab updates status or sends results

Data Model

These are the entities your LIMS reads and updates over the API. The Request object is the core record.

Lab β€” returned by GET /api/labs

FieldTypeDescription
idstring (uuid)Lab identifier (use as lab_id when creating requests).
namestringLaboratory display name.
slugstring | nullURL slug for the lab's branded page.
addressstring | nullPrimary address.
phones{number,label}[]Contact numbers.
whatsappstring | nullWhatsApp number (E.164).
service_categoriesstring[]Test categories the lab offers.
branchesLabBranch[]Physical branches (name, address, phones).

Price list entry β€” the lab's test catalog

FieldTypeDescription
idstring (uuid)Catalog entry id.
raw_namestringTest name as the lab provides it.
category_labelstring | nullCategory grouping.
synonymsstring[]Alternate names used to match free-text requests.
lab_pricedecimal (₦)Patient-facing price for the test.

Request β€” the central record

FieldTypeDescription
idstring (uuid)Internal request identifier.
codestringUnique, shareable code (e.g. LABA-8X4K29Q). Patient presents this at the lab.
lab_idstringThe lab this request belongs to.
statusenumincoming | seen | done.
doctor_emailstring | nullNULL = self-service patient; set = doctor-referred.
doctor_namestring | nullReferring doctor's name.
patient_namestring | nullPatient's full name.
patient_phonestring | nullE.164 phone, e.g. +2348001234567.
patient_emailstring | nullUsed for result delivery and portal auto-fill.
testsstringRequested tests (comma-separated / free text).
conditionstring | nullSymptoms or clinical note.
schedulestring | nullRequested appointment time.
test_image_urlstring | nullUploaded request slip / image.
result_linkstring | nullExternal results URL (set when done).
result_notestring | nullFree-text result summary.
result_file_urlsstring[]Attached result PDFs / images.
poveon_amountdecimal | nullPoveon commission for this request (computed at 'seen').
lab_revenue_amountdecimal | nullLab's revenue after commission.
created_atdatetimeWhen the request was created.
seen_atdatetime | nullSet when status β†’ seen.
completed_atdatetime | nullSet when status β†’ done.

incoming

Created; patient not yet at the lab.

seen

Patient arrived / acknowledged. Commission computed.

done

Tests complete; results attached & delivered.

🌐

Public Endpoints

3
πŸ”¬

Lab Authenticated

4
βš™οΈ

Admin Endpoints

7

HTTP Status Codes

All error responses include a JSON body with success: false and an error message string. Always check success before using the response data.

200

OK

Request succeeded

400

Bad Request

Validation failed or invalid input

401

Unauthorized

No valid session cookie or X-Poveon-Api-Key header present, or key is expired/revoked

403

Forbidden

Authenticated but insufficient permissions (e.g. member role lacks the required permission)

404

Not Found

Resource does not exist

429

Too Many Requests

Rate limit exceeded (e.g. 20 requests per doctor email per hour on /api/requests/create)

500

Server Error

Unexpected internal error

Error Response Format

{
  "success": false,
  "error": "Validation failed: patient_name is required"
}

Rate Limiting

Some endpoints enforce hard rate limits. The limits below are actively enforced β€” requests that exceed them receive a 429 response.

πŸ“Request Creation

20 requests per doctor email per hour

Enforced server-side. Returns 429 when exceeded. Resets on a rolling 1-hour window.

πŸ“‘Status Polling

Poll at most once every 30 seconds

Not enforced but please follow this guideline. Continuous polling may be throttled.

πŸ“„File Uploads

Max 5 files Β· 10 MB each (results) / 5 MB (logos)

Enforced server-side. Returns 400 for oversized or too many files.

If your integration requires higher throughput, contact us at support@poveon.com.

πŸš€

Ready to integrate?

Contact the Poveon team to get API credentials and onboard your LIMS or healthcare system.

Get in touch