The PSL (Product/Service Line Item) segment represents a single billable product or service line within a product/service group. PSL was introduced in HL7 v2.6 alongside its companions PSS and PSG, and is the most detailed of the three — v2.8.1 publishes 48 fields covering identification, coding, quantities, monetary amounts, scaling factors, physician roles, and validation flags.
Purpose
PSL captures everything a payer needs to adjudicate one line of a bill: identifiers from both provider and payer, the product/service code and its modifiers, effective and expiration dates, quantity and unit cost, gross and billed amounts, physician roles, professional/technical part splits, VAT, and validation. A PSL is always anchored to a parent PSG, which in turn belongs to a PSS section.
Used in
PSL is used in product/service billing flows carried by financial and master-file messages such as DFT (Detailed Financial Transaction) variants and PMU events that exchange billable activity. See the DFT message page for the typical envelope.
Field-by-field reference
Source: HAPI HL7v2 v2.8.1 javadocs (https://hapifhir.github.io/hapi-hl7v2/v281/apidocs/ca/uhn/hl7v2/model/v281/segment/PSL.html) for sequence, name, data type, and repetition. Length is not published in the javadocs (—); Required and Table # are filled from the HL7 v2 standard where well-established.
| Seq | Name | Data Type | Length | Req | Repeat | Table # | Description |
|---|---|---|---|---|---|---|---|
| PSL-1 | Provider Product/Service Line Item Number | ei | — | R | — | — | Provider-assigned line identifier |
| PSL-2 | Payer Product/Service Line Item Number | ei | — | O | Y | — | Payer-assigned line identifier(s) |
| PSL-3 | Product/Service Line Item Sequence Number | si | — | R | — | — | Ordinal position within group |
| PSL-4 | Provider Tracking ID | ei | — | O | Y | — | Provider-side tracking reference |
| PSL-5 | Payer Tracking ID | ei | — | O | Y | — | Payer-side tracking reference |
| PSL-6 | Product/Service Line Item Status | cwe | — | O | — | [HL70776] | Status of the line item |
| PSL-7 | Product/Service Code | cwe | — | R | — | — | Primary product/service code (e.g. CPT) |
| PSL-8 | Product/Service Code Modifier | cwe | — | O | Y | — | Modifier(s) applied to the code |
| PSL-9 | Product/Service Code Description | st | — | O | Y | — | Free-text description of the code |
| PSL-10 | Product/Service Effective Date | dtm | — | O | Y | — | Date the service became effective |
| PSL-11 | Product/Service Expiration Date | dtm | — | O | Y | — | Date the service ceased to apply |
| PSL-12 | Product/Service Quantity | cq | — | O | Y | — | Quantity of units delivered |
| PSL-13 | Product/Service Unit Cost | cp | — | O | Y | — | Cost per unit |
| PSL-14 | Number of Items per Unit | nm | — | O | Y | — | Items packaged per billed unit |
| PSL-15 | Product/Service Gross Amount | cp | — | O | Y | — | Pre-adjustment gross amount |
| PSL-16 | Product/Service Billed Amount | cp | — | O | Y | — | Net billed amount for the line |
| PSL-17 | Product/Service Clarification Code Type | cwe | — | O | Y | — | Type of clarification code supplied |
| PSL-18 | Product/Service Clarification Code Value | st | — | O | Y | — | Value of the clarification code |
| PSL-19 | Health Document Reference Identifier | ei | — | O | Y | — | Link to supporting health document |
| PSL-20 | Processing Consideration Code | cwe | — | O | Y | — | Processing hint for the payer |
| PSL-21 | Restricted Disclosure Indicator | id | — | O | — | [HL70136] | Flag: limit disclosure of line |
| PSL-22 | Related Product/Service Code Indicator | cwe | — | O | Y | — | Relationship to other coded lines |
| PSL-23 | Product/Service Amount for Physician | cp | — | O | Y | — | Physician portion of the line amount |
| PSL-24 | Product/Service Cost Factor | nm | — | O | Y | — | Multiplier applied to base cost |
| PSL-25 | Cost Center | cx | — | O | Y | — | Cost center receiving the charge |
| PSL-26 | Billing Period | dr | — | O | Y | — | Date range covered by the line |
| PSL-27 | Days without Billing | nm | — | O | Y | — | Days within period that are excluded |
| PSL-28 | Session-No | nm | — | O | Y | — | Treatment session number |
| PSL-29 | Executing Physician ID | xcn | — | O | Y | — | Physician who performed the service |
| PSL-30 | Responsible Physician ID | xcn | — | O | Y | — | Physician accountable for the service |
| PSL-31 | Role Executing Physician | cwe | — | O | Y | — | Role code of executing physician |
| PSL-32 | Medical Role Executing Physician | cwe | — | O | Y | — | Medical-role code of executing physician |
| PSL-33 | Side of Body | cwe | — | O | Y | — | Laterality of the service |
| PSL-34 | Number of TP's PP | nm | — | O | Y | — | Count of tariff positions, professional part |
| PSL-35 | TP-Value PP | cp | — | O | Y | — | Tariff value, professional part |
| PSL-36 | Internal Scaling Factor PP | nm | — | O | Y | — | Internal scaling, professional part |
| PSL-37 | External Scaling Factor PP | nm | — | O | Y | — | External scaling, professional part |
| PSL-38 | Amount PP | cp | — | O | Y | — | Computed amount, professional part |
| PSL-39 | Number of TP's Technical Part | nm | — | O | Y | — | Count of tariff positions, technical part |
| PSL-40 | TP-Value Technical Part | cp | — | O | Y | — | Tariff value, technical part |
| PSL-41 | Internal Scaling Factor Technical Part | nm | — | O | Y | — | Internal scaling, technical part |
| PSL-42 | External Scaling Factor Technical Part | nm | — | O | Y | — | External scaling, technical part |
| PSL-43 | Amount Technical Part | cp | — | O | Y | — | Computed amount, technical part |
| PSL-44 | Total Amount Professional Part + Technical Part | cp | — | O | Y | — | Sum of professional + technical amounts |
| PSL-45 | VAT-Rate | nm | — | O | Y | — | VAT/tax rate applied to the line |
| PSL-46 | Main-Service | id | — | O | Y | [HL70136] | Flag: line is the main service |
| PSL-47 | Validation | id | — | O | Y | [HL70136] | Flag: line has been validated |
| PSL-48 | Comment | st | — | O | Y | — | Free-text comment for the line |
Most-used fields
- PSL-1 Provider Product/Service Line Item Number is the primary key emitted by every sender and the field receivers key on for reconciliation.
- PSL-3 Product/Service Line Item Sequence Number guarantees deterministic ordering inside the parent PSG, which matters when groups are summed line-by-line.
- PSL-7 Product/Service Code is the actual billing code (CPT, HCPCS, or local) and is non-negotiably required by virtually every receiver.
- PSL-12 Product/Service Quantity and PSL-13 Product/Service Unit Cost together drive the primary math: quantity × unit cost should normalise to PSL-15 gross before any adjustment.
- PSL-16 Product/Service Billed Amount is the figure that rolls up to PSG-5 and ultimately to PSS-4.
- PSL-29 Executing Physician ID and PSL-30 Responsible Physician ID are essential for payers that require attribution by NPI.
Version differences
- Introduced in HL7 v2.6 with 48 fields.
- v2.7 refined several supporting tables (line item status moved to a CWE binding for [HL70776]).
- v2.7.1, v2.8, and v2.8.1 carry the field list forward unchanged in structure; data type updates (e.g., TS → DTM) had already landed by v2.7.
- v2.8.2 publishes the same 48 fields with editorial clarifications only.
Common mistakes
- Sending PSL without a parent PSG — many engines silently discard the line because they cannot anchor it.
- Putting a CPT code in PSL-9 (description) instead of PSL-7 (code) — receivers then fail eligibility checks.
- Letting PSL-15 (gross) and PSL-16 (billed) drift: adjustments need to live in a separate adjustment segment, not be hidden inside PSL-15.
- Emitting PSL-12 (quantity) with implicit "1" — be explicit; some receivers default to zero and reject the line.
- Confusing PSL-29 (executing) with PSL-30 (responsible); they are intentionally separate to support supervising-physician workflows.
- Mixing currencies inside one PSL (e.g., PSL-13 in USD, PSL-15 in EUR) — the CP type carries currency per occurrence and must agree.
Examples
Minimal:
PSL|LINE-9001^^VORRO^EI||1|||A^Active^HL70776|99213^Office visit^CPT
Fully populated (abridged repeating fields shown once):
PSL|LINE-9001^^VORRO^EI|PAYLN-55001^^AETNA^EI|1|TRK-PRV-12^^VORRO^EI|TRK-PAY-99^^AETNA^EI|A^Active^HL70776|99213^Office visit, established pt^CPT|25^Significant E/M^HL70776|Established patient office visit|20260610|20260610|1^visit^UCUM|125.00^USD|1|125.00^USD|125.00^USD||||||N||80.00^USD|1.0|CC-1010^^^HOSP-A|20260610-20260610|0|1|1234567890^SMITH^A^^^^^^NPI|9876543210^JONES^B^^^^^^NPI|EXEC^Executing^HL70443|MED^Medical^HL70444|N^None^HL70894|1|80.00^USD|1.0|1.0|80.00^USD|1|45.00^USD|1.0|1.0|45.00^USD|125.00^USD|0|Y|Y|Reviewed by coding team
Annotated breakdown:
PSL | LINE-9001^^VORRO^EI # PSL-1 Provider line id
| PAYLN-55001^^AETNA^EI # PSL-2 Payer line id
| 1 # PSL-3 Sequence in group
| TRK-PRV-12^^VORRO^EI # PSL-4 Provider tracking id
| TRK-PAY-99^^AETNA^EI # PSL-5 Payer tracking id
| A^Active^HL70776 # PSL-6 Line status
| 99213^Office visit^CPT # PSL-7 Product/service code
| 25^Significant E/M^HL70776 # PSL-8 Modifier
| Established patient ... # PSL-9 Description
| 20260610 # PSL-10 Effective date
| 20260610 # PSL-11 Expiration date
| 1^visit^UCUM # PSL-12 Quantity
| 125.00^USD # PSL-13 Unit cost
| 1 # PSL-14 Items per unit
| 125.00^USD # PSL-15 Gross amount
| 125.00^USD # PSL-16 Billed amount
... # PSL-17..48 follow
In-context excerpt, DFT P03:
MSH|^~&|VORRO|HOSP-A|AETNA|PAYER|20260610101500||DFT^P03^DFT_P03|MSG00050|P|2.8.1
EVN|P03|20260610101500
PID|1||MRN-77110^^^VORRO^MR||CHEN^MEI^L||19850901|F
PV1|1|O|CLINIC-02^^^HOSP-A
PSS|SEC-501^^VORRO^EI||1|275.00^USD|Outpatient visit
PSG|GRP-9001^^VORRO^EI||1|Y|275.00^USD|E/M and ancillary
PSL|LINE-9001^^VORRO^EI||1|||A^Active^HL70776|99213^Office visit^CPT|||20260610||1^visit^UCUM|125.00^USD|1|125.00^USD|125.00^USD
PSL|LINE-9002^^VORRO^EI||2|||A^Active^HL70776|36415^Venipuncture^CPT|||20260610||1^procedure^UCUM|15.00^USD|1|15.00^USD|15.00^USD
PSL|LINE-9003^^VORRO^EI||3|||A^Active^HL70776|85025^CBC w/ diff^CPT|||20260610||1^test^UCUM|135.00^USD|1|135.00^USD|135.00^USD
In-context excerpt, DFT P11 with modifiers and physician attribution:
MSH|^~&|VORRO|SURG-CTR-C|UHG|PAYER|20260610141200||DFT^P11^DFT_P11|MSG00051|P|2.8.1
EVN|P11|20260610141200
PID|1||MRN-88420^^^VORRO^MR||PATEL^RAVI^K||19700418|M
PSS|SEC-610^^VORRO^EI||1|2450.00^USD|Surgical day
PSG|GRP-9210^^VORRO^EI||1|Y|2450.00^USD|Knee arthroscopy bundle
PSL|LINE-9201^^VORRO^EI||1|||A^Active^HL70776|29881^Arthroscopy knee^CPT|RT^Right side^HL70894|||20260610||1^procedure^UCUM|2200.00^USD|1|2200.00^USD|2200.00^USD||||||N|||||||1234567890^OSORIO^M^^^^^^NPI|2345678901^WONG^L^^^^^^NPI
PSL|LINE-9202^^VORRO^EI||2|||A^Active^HL70776|01400^Anesthesia knee^CPT|||20260610||1^session^UCUM|250.00^USD|1|250.00^USD|250.00^USD
FHIR mapping
PSL has no segment-level ConceptMap in the official v2-to-FHIR Implementation Guide. Conceptually, a PSL corresponds to a single Claim.item (or Invoice.lineItem) with most fields mapping straightforwardly:
- PSL-1 →
Claim.item.sequence+ identifier extension - PSL-7 →
Claim.item.productOrService - PSL-8 →
Claim.item.modifier - PSL-10/PSL-11 →
Claim.item.servicedPeriod - PSL-12 →
Claim.item.quantity - PSL-13 →
Claim.item.unitPrice - PSL-16 →
Claim.item.net - PSL-29 / PSL-30 →
Claim.careTeamreferences with role coding from PSL-31/PSL-32
Fields modelling tariff scaling and professional/technical splits (PSL-34..PSL-44) usually require local extensions because FHIR Claim does not model them natively.
Engine considerations
- HAPI v2.8.1 exposes the segment via
ca.uhn.hl7v2.model.v281.segment.PSLwith typed accessorsgetProductServiceCode(),getProductServiceBilledAmount(), and array accessors for every repeating field. - Mirth Connect surfaces PSL inside the
PSS_PSG_PSLnested group; repeating CWE and CP fields are accessed by index in the XML representation. - Rhapsody requires explicit iteration for PSL-2, PSL-8, PSL-12, and the tariff fields — default mappers stop at the first repetition.
- When transforming to X12 837, mind that PSL-15 (gross) and PSL-16 (billed) collapse to a single SV1/SV2 monetary amount; preserve the gross in a sidecar field if your downstream needs it.
How Vorro parses and produces PSL
Vorro represents PSL as a ProductServiceLineItem node beneath its parent PSG, with all repeating fields exposed as ordered collections rather than HL7-style tilde-separated strings. The parser validates that PSL-12 × PSL-13 reconciles to PSL-15 within rounding tolerance and tags lines that fail the check for review. On the producer side, Vorro emits PSL-29 / PSL-30 with normalised NPI components when an upstream system supplied unstructured names, and round-trips the tariff scaling fields (PSL-34..PSL-44) verbatim because their use is country-specific.
Related pages
- PSG Segment — Product/Service Group
- PSS Segment — Product/Service Section
- DFT Message — Detailed Financial Transaction
