Skip to main content

Najeeb PBM Lightweight as a Service

Najeeb PBM Lightweight as a Service (Pharmacy Benefit Management) is a comprehensive pharmacy claims processing solution designed to streamline and automate the adjudication of prescription drug claims for insurance companies in the Kingdom of Saudi Arabia.

Service Model

This Service enables the utilization of the AI Engine capabilities without having to store any sensitive data outside the Insurance Company Network, as all the data submitted is processed ephemerally.

PBM MODES

The "PBM Lightweight" flow differs from the "PBM Full-Mode" flow primarily in its validation logic. Unlike Full-Mode, the Lightweight flow does not validate member policies, consumption limits, or existing entitlements. Furthermore, it omits pre-creation checks for members, policies, and policy holders, as well as membership join validations. Consequently, if a member or policy does not already exist in Lightweight mode, the system automatically creates it on the fly.

Service Description

Najeeb PBM Lightweight as a Service provides a seamless API integration that enables insurance companies to submit pharmacy claims from their core systems (or directly from network pharmacies) and receive adjudicated results in real time. The service handles the entire prescription claim lifecycle, from formulary and drug utilization checks to final approval or rejection, with all processing happening ephemerally within your dedicated, isolated Najeeb instance.

Key Features

  • Adjudication: Receive instant responses to pharmacy claim submissions
  • Ephemeral Data Processing: All data is processed temporarily and securely within your isolated Najeeb instance
  • Formulary Management: Automated checks against the insurance plan's drug formulary
  • Drug Utilization Review (DUR): Built-in checks for drug interactions, duplicate therapy, and quantity limits
  • Automated Validation: Built-in validation for drug codes and prescriber information
  • KSA Compliance: Fully compliant with Saudi healthcare and pharmaceutical regulations
  • Scalable Architecture: Handles high volumes of requests with reliable performance
This is a lightweight version of the AI Engine capabilities

Due to this, some capabilities of the full version of the AI Engine will be dropped under this request like:

  • Policy and benefits validation
  • Contractual rejections due to the lack of price list information

How It Works

  1. Request Submission: Your core system or dispensing pharmacy sends a pharmacy claim to the Najeeb API
  2. Processing: The request is processed within your isolated Najeeb instance with ephemeral data handling
  3. Validation: Automated validation of drug codes, formulary status, and prescriber credentials
  4. Response: Adjudicated result is returned to your system with approval, rejection, or additional requirements

Requirements Prior to Integration

Before integrating with Najeeb PBM Lightweight as a Service, ensure you have the following:

Technical Requirements

  1. API Access Credentials
  • Valid API key (access-key) provided by Najeeb
  • Access to your dedicated Najeeb instance endpoint
  • Network connectivity to the Najeeb API infrastructure
  1. Data Requirements
  • Transaction data (authorization number, unique transaction ID, transaction type, treatment date)
  • Policy data (policy number, policy holder ERP ID)
  • Medical provider data (CCHI number). For reporting purposes, we recommend sending a list of medical providers (including names and CCHI codes) to the Najeeb technical team in advance.
  • Member data (member ID, date of birth, gender, marital status)
  • Prescriber information (doctor ID, speciality, name)
  • Item/service details (service code, description, NPHIES code and type, quantity)
  • Diagnosis codes (ICD-10 format)

Data Preparation

Ensure your system can provide:

  • Transaction Data: authorization number, a unique transaction ID, transaction type (PREAUTH or CLAIM)
  • Policy Data: policy number, policy holder ERP ID
  • Member Data: member ID, date of birth, gender, marital status
  • Provider Data: medical provider CCHI number, doctor ID/specialty/name
  • Item Data: service code, service description, NPHIES code and type, quantity, price, benefit/sub-benefit codes
  • Diagnosis Data: ICD-10 diagnosis codes (primary/secondary)
ph_erp_id

For the ph_erp_id field, provide your internal policyholder identifier. If this identifier is not available, send the value "default" for all requests.:::

member_id

If the member_id was not defined earlier in Najeeb, then Najeeb will create a new member record with the demographics defined in the request member_dob & member_gender. Important note: If a member already exists in the system, the existing record will be retained—no duplicate will be created and no overwrite will occur. However, if you send subsequent requests with the same member_id but differing demographic information, the PBM will flag a member information inconsistency warning.

Request Unique Identifier
  • transaction_id is the primary idempotency key and must be unique per request; a duplicate value returns an error.
  • authorization_number is not required to be unique; it can be reused across follow-up requests related to the same authorization.
Service Identifiers

service_code, service_description, nphies_code, nphies_type, and service_type are all required on every item.

Integration Guide

The Najeeb PBM integration is accomplished through a single API endpoint that receives a PBM (pharmacy benefit management) prior authorization from your insurance company core system. All data processing is ephemeral and handled entirely within your isolated Najeeb instance.

Historical Data Synch

Najeeb offers additional endpoints for synchronizing historical claims and requests made by the member. While integration with these APIs is optional, it allows Najeeb to make more accurate decisions by leveraging the member's past data.

Base URL

https://api.{client_namespace}.najeeb.ai/v4.0/health

Authentication

All API requests are authenticated using an API key passed in a dedicated header:

access-key: YOUR_API_KEY

For access key provisioning, please contact Najeeb support.

API Endpoint

Create PBM Request

POST /approval-request/create-pbm-request

This endpoint receives a PBM prior authorization from your core system and processes it ephemerally within your isolated Najeeb instance. The request is validated and acknowledged synchronously.

Request Headers
HeaderTypeRequiredDescription
access-keystringYesAPI key for authentication
Content-TypestringYesMust be application/json
Request Body Parameters

The request body is a JSON object with the following structure:

{
"authorization_number": "string",
"transaction_id": "string",
"transaction_type": "string",
"erp_id": "string",
"policy_no": "string",
"ph_erp_id": "string",
"related_authorization_number": "string",
"medical_provider_cchi_no": "string",
"member_id": "string",
"member_dob": "string",
"member_gender": "string",
"marital_status": "string",
"treatment_date": "date",
"request_date": "date",
"claim_type": "string",
"claim_sub_type": "string",
"is_emergency": "boolean",
"is_maternity": "boolean",
"is_new_born": "boolean",
"benefit_code": "number",
"benefit_description": "string",
"diagnoses": [
{
"type": "primary",
"code": "string",
"name": "string"
},
{
"type": "secondary",
"code": "string",
"name": "string"
}
],
"items": [
{
"claimed_quantity": "number",
"price": "number",
"duration": "string",
"admission_date": "date",
"frequency": "string",
"discharge_date": "date",
"justification": "string",
"erp_item_id": "string",
"service_code": "string",
"service_description": "string",
"nphies_code": "string",
"nphies_type": "string",
"service_type": "string",
"benefit_code": "number",
"benefit_description": "string",
"sub_benefit_code": "number",
"sub_benefit_description": "string",
"serial_number": "string"
}
], "doctor_id": "string",
"doctor_speciality": "string",
"doctor_name": "string",
"approval_remarks": "string",
"additional_remarks": "string",
"currency": "string",
"currency_rate": "number",
"nphies_bundle_id": "string",
"provider_system_id": "string",
"provider_comment": "string",
"erp_user_id": "string",
"price_list_level": "string"
}
Parameter Details
Root Level Parameters
ParameterTypeRequiredDescriptionAccepted Values
authorization_number *stringYesThe authorization number of the prior authorization can be repeated.Alphanumeric string, 1-255 characters
transaction_id *stringYesUnique transaction ID for this request; a duplicate value returns an errorAlphanumeric string, max 255 characters
transaction_typestringNoIndicates whether this request is a pre-authorization or a claimEnum: PREAUTH, CLAIM
erp_idstringNoERP identifier for this request (may not be unique)Alphanumeric string, max 255 characters
policy_no *stringYesThe policy number of the prior authorizationAlphanumeric string, 1-255 characters
ph_erp_id *stringYesThe ERP ID of the policy holder.String, 1-255 characters
related_authorization_numberstringNoThe related authorization number of the prior authorizationAlphanumeric string, max 255 characters
medical_provider_cchi_no *stringYesThe CCHI number of the medical providerAlphanumeric string, 1-255 characters
member_id *stringYesThe member ID of the prior authorizationAlphanumeric string, 1-255 characters
member_dob *stringYesMember date of birthISO 8601 format: YYYY-MM-DDTHH:mm:ss.sssZ
member_gender *stringYesThe gender of the memberEnum: MALE, FEMALE
marital_status *stringYesThe marital status of the memberEnum: SINGLE, MARRIED, ENGAGED, UNKNOWN, WIDOWED, DIVORCED, SEPARATED
treatment_date *dateYesThe treatment date of the prior authorizationISO 8601 format: YYYY-MM-DDTHH:mm:ss.sssZ
request_date *dateYesThe request date of the prior authorizationISO 8601 format: YYYY-MM-DDTHH:mm:ss.sssZ
claim_type *stringYesThe claim type of the prior authorizationEnum: INSTITUTIONAL, PROFESSIONAL, PHARMACY, DENTAL, OPTICAL
claim_sub_type *stringYesThe claim sub type of the prior authorizationEnum: IN_PATIENT, OUT_PATIENT, EMERGENCY
is_emergencybooleanNoFlag indicating an emergency casetrue, false
is_maternitybooleanNoFlag indicating a maternity casetrue, false
is_new_bornbooleanNoFlag indicating a newborn casetrue, false
benefit_codenumberNoThe benefit code of the prior authorizationInteger, 0-9999999
benefit_descriptionstringNoBenefit description. Used to auto-create the benefit if the code does not exist in the systemString, max 255 characters
diagnoses *arrayYesArray of diagnosis objectsMinimum 1 diagnosis required
items *arrayYesArray of item objectsMinimum one item is required
doctor_idstringNoThe doctor ID of the prior authorizationAlphanumeric string, max 255 characters
doctor_specialitystringNoThe doctor's medical specialtyString, max 255 characters
doctor_namestringNoThe doctor's nameString, max 255 characters
approval_remarksstringNoRemarks for approvalFree text, max 255 characters
additional_remarksstringNoAdditional remarks or notesFree text, max 255 characters
currencystringNoCurrency codeString, max 255 characters
currency_ratenumberNoCurrency exchange rateDecimal, minimum 0
nphies_bundle_idstringNoThe NPHIES bundle ID of the prior authorizationAlphanumeric string, max 255 characters
provider_system_idstringNoProvider system identifierAlphanumeric string, max 255 characters
provider_commentstringNoProvider commentsFree text, max 255 characters
erp_user_idstringNoThe ERP user ID of the prior authorizationAlphanumeric string, max 255 characters
price_list_levelstringNoThe price list level of the prior authorizationAlphanumeric string, max 255 characters
Diagnosis Object
ParameterTypeRequiredDescriptionAccepted Values
type *EnumYesType of diagnosisEnum: primary, secondary
code *stringYesICD-10 diagnosis codeValid ICD-10 code format, max 255 characters
namestringNoDiagnosis name/descriptionString, max 255 characters
Item Object
ParameterTypeRequiredDescriptionAccepted Values
service_code *stringYesService code of the itemAlphanumeric string, 1-255 characters
service_description *stringYesService description of the itemString, 1-255 characters
nphies_code *stringYesNPHIES code of the itemAlphanumeric string, 1-255 characters
nphies_type *stringYesNPHIES type of the itemEnum: PHARMACEUTICAL, DEVICE
service_type *stringYesService type of the itemEnum: PHARMACEUTICAL, DEVICE
claimed_quantitynumberNoQuantity of the item (defaults to 1 if not sent)Integer, 1-1000000000
pricenumberNoPrice of the item (set by the PBM service)Decimal, default 0
durationstringNoDuration of the itemFree text
admission_datedateNoAdmission date of the itemISO 8601 format: YYYY-MM-DDTHH:mm:ss.sssZ
frequencystringNoFrequency of the itemEnum:[OD, BID, Q12H, TID, Q8H, QID, Q6H, QD, Q24H, QOD, QM, Q4H]
discharge_datedateNoDischarge date of the itemISO 8601 format: YYYY-MM-DDTHH:mm:ss.sssZ
justificationstringNoMedical justification for the itemFree text, max 255 characters
erp_item_idstringNoERP item ID of the itemAlphanumeric string, max 255 characters
benefit_codenumberNoBenefit code of the itemInteger, 0-9999999
benefit_descriptionstringNoBenefit description. Used to auto-create the benefit if the code does not exist in the systemString, max 255 characters
sub_benefit_codenumberNoSub benefit code of the itemInteger, 0-9999999
sub_benefit_descriptionstringNoSub-benefit description. Used to auto-create the sub-benefit if the code does not exist in the systemString, max 255 characters
serial_numberstringNoSerial number of the itemAlphanumeric string, max 255 characters
Enums

Transaction Type Enum:

  • PREAUTH - Pre-authorization request
  • CLAIM - Claim request

Member Gender Enum:

  • MALE - Male
  • FEMALE - Female

Marital Status Enum:

  • SINGLE - Single
  • MARRIED - Married
  • ENGAGED - Engaged
  • UNKNOWN - Unknown
  • WIDOWED - Widowed
  • DIVORCED - Divorced
  • SEPARATED - Separated

Claim Type Enum:

  • INSTITUTIONAL - Institutional services for inpatients
  • PROFESSIONAL - Professional services for outpatients
  • PHARMACY - Pharmacy services
  • DENTAL - Dental services
  • OPTICAL - Optical services

Claim Sub Type Enum:

  • IN_PATIENT - Inpatient services
  • OUT_PATIENT - Outpatient services
  • EMERGENCY - Emergency services

Diagnosis Type Enum:

  • primary - Primary diagnosis
  • secondary - Secondary diagnosis
Example Request
curl -X POST "https://api.{client_namespace}.najeeb.ai/v4.0/health/approval-request/create-pbm-request" \
-H "access-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"authorization_number": "AU-12345",
"transaction_id": "550e8400-e29b-41d4-a716-446655440001",
"transaction_type": "CLAIM",
"erp_id": "123",
"policy_no": "no-01",
"ph_erp_id": "default",
"medical_provider_cchi_no": "10566",
"member_id": "mem-01",
"member_dob": "1990-01-15T00:00:00.000Z",
"member_gender": "MALE",
"marital_status": "SINGLE",
"treatment_date": "2024-02-15T10:00:00.000Z",
"request_date": "2024-02-15T10:04:20.346Z",
"claim_type": "PHARMACY",
"claim_sub_type": "OUT_PATIENT",
"diagnoses": [
{
"type": "primary",
"code": "E11.9",
"name": "Type 2 diabetes mellitus without complications"
}
],
"items": [
{
"service_code": "SFDA-778812",
"service_description": "Glucophage 500mg",
"nphies_code": "SFDA-778812",
"nphies_type": "Metformin",
"service_type": "PHARMACY",
"claimed_quantity": 60,
"justification": ""
}
],
"approval_remarks": "This is a test prior authorization",
"additional_remarks": "Routine refill",
"currency": "SAR",
"currency_rate": 1,
"provider_system_id": "Provider System ID",
"provider_comment": "Provider Comment"
}'

Note: claim_type accepts PHARMACY for prescription/pharmacy claims — adjust to the value that matches the claim being submitted.

Response

Success Response (201 Created)

{
"pre_auth_internal_id": "number",
"status": "string",
"authorization_number": "string",
"transaction_id": "string",
"note": "string",
"items_results": [
{
"service_code": "string",
"approved": "boolean",
"approved_quantity": "number",
"approved_duration": "string",
"najeeb_ai_alert": "string",
"rejection_reason": []
},
{
"service_code": "string",
"approved": "boolean",
"approved_quantity": "string",
"approved_duration": "string",
"najeeb_ai_alert": "string",
"rejection_reason": [
{
"code": "string",
"nphies_code": "string",
"message": "string"
}
]
}
]
}
Response Fields
FieldTypeDescription
approval_request_internal_idnumberInternal identifier assigned to the request
statusstring"COMPLETED": means the request processing has been completed
authorization_numberstringEchoes the submitted authorization number
transaction_idstringEchoes the submitted transaction ID
request_alertsarray of stringAI-generated alerts on request level
items_decisionsarrayPer-item adjudication decisions (see Item Decision Object below)
Item Decision Object
FieldTypeDescription
service_codestringService/item code being processed
approvedbooleanFinal approval decision by Najeeb (true/false)
approved_quantitynumberQuantity approved by Najeeb for the service/item
approved_durationnumberDuration approved by Najeeb (in days)
najeeb_ai_alertnumberAI-generated alert or note on the level of the item
rejection_reasonnumberList of rejection reason objects (see below)
Rejection Reason Object
FieldTypeDescription
codestringRejection reason code from Najeeb
nphies_codestringCorresponding NPHIES code
messagestringRejection message
Example Success Response
{
"pre_auth_internal_id": 12345,
"status": "COMPLETED",
"authorization_number": "AU-12345",
"transaction_id": "550e8400-e29b-41d4-a716-446655440000",
"request_alerts": ["This Pre-auth request is similar to previously rejected requests."],
"items_results": [
{
"service_code": "0810246017",
"approved": true,
"approved_quantity": 30,
"approved_duration": "30",
"najeeb_ai_alert": "",
"rejection_reason": []
},
{
"service_code": "1012258766",
"approved": false,
"approved_quantity": 10,
"approved_duration": "7",
"najeeb_ai_alert": "Drug interaction detected",
"rejection_reason": [
{
"code": "PBM-1",
"nphies_code": "MN-1-1",
"message": "Diagnosis does not support the requested service"
}
]
}
]
}

Error Responses

Error Response Structure

{
"ErrorCode": "string",
"message": "string",
"details": ["string"]
}

Error Codes

Error CodeHTTP StatusDescription
E_BAD_REQUEST_400400Request validation failed — see the details array for field-level errors
E_EPA_02404Diagnosis not found
E_EPA_069409Prior authorization already exists with this transaction_id:{{transaction_id}}
401 Unauthorized401Missing or invalid access-key
Example Error Responses

Bad Request:

{
"ErrorCode": "E_BAD_REQUEST_400",
"message": "Bad request",
"details": [
"member_gender must be one of the following values: MALE, FEMALE"
]
}

Diagnosis Not Found:

{
"ErrorCode": "E_EPA_02",
"message": "Diagnosis not found, The codes of the diagnosis are:[0]",
"details": []
}

Duplicate Prior Authorization:

{
"ErrorCode": "E_EPA_069",
"message": "Prior authorization already exists with this transaction_id:{{transaction_id}}",
"details": []
}

Error: Unauthorized:

{
"ErrorCode": "API key is required",
"message": "Unauthorized",
"details": []
}

Data Processing

All data processing is ephemeral, meaning:

  • Data is processed temporarily within your isolated Najeeb instance
  • No persistent storage of request data (except for audit logs)
  • Data is securely handled and encrypted in transit
  • Compliance with KSA data protection regulations

Best Practices

  1. Date Formats: Use ISO 8601 format with timezone for all date fields (e.g., 2024-01-15T10:04:20.346Z)
  2. Diagnoses: A single primary diagnosis is required to support the prescribed therapy. You may also send one or multiple additional diagnoses.
  3. Items: Ensure all required item fields are provided, especially service_code, service_description, nphies_code, nphies_type, and service_type
  4. Error Handling: Implement retry logic with exponential backoff for transient errors
  5. Validation: Validate data before sending requests to avoid unnecessary API calls
  6. Caching: Cache formulary results when appropriate to reduce API calls
  7. Monitoring: Monitor response times and error rates
  8. Logging: Log all requests and responses for audit and debugging purposes
  9. Timeout Configuration: Set your HTTP client timeout to 50 seconds to accommodate AI Engine processing time.

Code Examples

curl -X POST "https://api.{client_namespace}.najeeb.ai/v4.0/health/approval-request/create-pbm-request" \
-H "access-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"authorization_number": "AU-12sdfghj2",
"transaction_id": "transaction_id3",
"transaction_type": "PREAUTH",
"erp_id": "123",
"policy_no": "no-01",
"ph_erp_id": "default",
"medical_provider_cchi_no": "10566",
"member_id": "mem-01",
"member_dob": "2025-12-29T11:41:30.625Z",
"member_gender": "MALE",
"marital_status": "SINGLE",
"treatment_date": "2025-12-29T11:41:30.625Z",
"request_date": "2025-12-29T11:41:30.625Z",
"claim_type": "PROFESSIONAL",
"claim_sub_type": "OUT_PATIENT",
"diagnoses": [
{
"type": "primary",
"code": "E40"
},
{
"type": "secondary",
"code": "Z24",
"name": "Need for immunisation against certain single viral diseases"
}
],
"items": [
{
"service_code": "40903-00-00",
"service_description": "Neuroendoscopy",
"service_type": "AMBULATORY",
"nphies_code": "40903-00-00",
"nphies_type": "Neuroendoscopy"
}
]
}'