CPD API
Direct-to-Consumer mail-order pharmacy pricing. Returns cash and insurance pricing, dispensing fees, shipping costs, and inventory availability for drugs fulfilled by Cost Plus Drugs' mail-order pharmacy.
Overview
CPD (Cost Plus Drugs) is the mail-order direct-to-consumer channel. Patients order online and receive medications shipped to their door. Pricing includes both cash and insurance tracks.
CPD channel data is returned in the cpd_channel field on each PriceListEntry. This field is null for items not available on the CPD channel.
GET /pricelist/cpd
Returns the full CPD price list. Only cpd_channel is populated on each entry; tcc_channel and cpdapn_channel are omitted.
Supports the exclude_fields and treatment_category parameters. See Exclude Fields and Treatment Category Filter.
curl -s https://api.costplusdrugs.com/pricelist/cpd
curl -s "https://api.costplusdrugs.com/pricelist/cpd?exclude_fields=cpd_channel.insurance_dispensing_fee,cpd_channel.insurance_shipping_cost,cpd_channel.insurance_expedited_shipping_cost"
GET /pricelist/cpd/search
Search the CPD price list by NDC or term. Returns only entries available on the CPD channel.
ndc or term.
Query Parameters
| ndc string · optional* |
National Drug Code (with or without dashes). By default matches entries where equivalent_ndcs contains the NDC (generic substitution). Pair with no_substitutions=true for exact matching.
|
| no_substitutions boolean · optional |
When true, enforces exact-NDC matching. Requires ndc; returns 400 otherwise.
|
| gpi string · optional |
GPI (with or without dashes). Ignored if ndc is provided.
|
| term string · optional* |
Partial match against medication_name and brand_name. Ignored if ndc or gpi is provided.
|
| strength string · optional |
Filter by dosage strength (e.g., 10mg). Requires term. Ignored if ndc or gpi is provided.
|
| treatment_category string · optional |
Filter to entries whose treatment_categories array contains a match. Comma-separated for multiple (OR logic). See Treatment Category Filter.
|
| exclude_fields string · optional | Comma-separated list of fields to exclude from the response. |
Examples
curl -s "https://api.costplusdrugs.com/pricelist/cpd/search?ndc=67877-0511-10"
curl -s "https://api.costplusdrugs.com/pricelist/cpd/search?ndc=67877-0511-10&no_substitutions=true"
curl -s "https://api.costplusdrugs.com/pricelist/cpd/search?term=atorvastatin&strength=20mg"
Schema: CPD Channel
The cpd_channel object returned on each PriceListEntry. All monetary values are in USD.
| Field | Type | Description |
|---|---|---|
| cash_dispensing_fee | number | Dispensing fee for cash-pay orders (USD). |
| insurance_dispensing_fee | number | Dispensing fee for insurance orders (USD). |
| cash_shipping_cost | number | Standard shipping cost for 1 medication, cash-pay (USD). |
| cash_expedited_shipping_cost | number | Expedited shipping cost for 1 medication, cash-pay (USD). |
| insurance_shipping_cost | number | Standard shipping cost for 1 medication, insurance (USD). |
| insurance_expedited_shipping_cost | number | Expedited shipping cost for 1 medication, insurance (USD). |
| insurance_eligible | boolean | true if the drug is eligible for insurance billing. |
| currency | "USD" | Always "USD". |
| in_stock | boolean | Current inventory availability. |
| price_per_unit | number | USD per unit, inclusive of CPD markup. |
| sample_pack_price | string | sample_pack_size × price_per_unit, formatted to 2 decimal places (e.g., "2.10"). |
| sample_pack_price_total_to_patient_without_shipping | string | sample_pack_price + dispensing_fee, formatted to 2 decimal places. |
| sample_pack_price_w_shipping_dispensing | string | sample_pack_price + shipping_cost + dispensing_fee, formatted to 2 decimal places. Top-level only — not repeated inside each sample_pricing entry. |
| sample_pricing | SamplePricing[] | Pricing for 3 dispense quantities: 1×, 2×, and 3× the default sample size (typically 30/60/90 for pills; 1/2/3 for non-pills). |
Schema: SamplePricing
Three entries nested under cpd_channel.sample_pricing, representing 1×, 2×, and 3× the default sample pack size. All price fields are decimal strings, not raw numbers.
| Field | Type | Description |
|---|---|---|
| sample_pack_size | string | e.g., "30 count", "60 count", "1 Tablet" |
| sample_pack_price | string | sample_pack_size × price_per_unit, formatted to 2 decimal places. |
| sample_pack_price_total_to_patient_without_shipping | string | sample_pack_price + dispensing_fee, formatted to 2 decimal places. |
sample_pack_price_w_shipping_dispensing (including shipping) is on the top-level cpd_channel object for the default pack size only — it does not appear inside each sample_pricing entry.
Example: Full CPD Response
Sample PriceListEntry as returned from /pricelist/cpd/search?ndc=67877-0511-10 (Atorvastatin 10mg). equivalent_ndcs is shortened here; the full entry lists every equivalent NDC.
{
"external_sku": "d0b9ba0ae3ab9143200cfbce6ecb7a6a",
"medication_name": "Atorvastatin",
"brand_generic": "Generic",
"form": "Tablet",
"strength": "10mg",
"treatment_categories": ["Heart Health", "High Cholesterol"],
"brand_name": "Lipitor",
"pack_size": 1000,
"quantity": 1,
"splittable": true,
"unit": "ea",
"equivalent_ndcs": ["67877-0511-10", "00904-6290-61", "68084-0097-01"],
"rxnorm_id": "617312",
"special_handling": null,
"sample_pack_size": 30,
"sample_volume": "30 count",
"url": "https://www.costplusdrugs.com/medications/atorvastatin-10mg-tablet/?utm_source=api&utm_content=pricing-api",
"cpd_channel": {
"cash_dispensing_fee": 5,
"cash_shipping_cost": 5.25,
"cash_expedited_shipping_cost": 15,
"insurance_eligible": true,
"currency": "USD",
"in_stock": true,
"price_per_unit": 0.00834,
"sample_pricing": [
{
"sample_pack_size": "30 count",
"sample_pack_price": "0.25",
"sample_pack_price_total_to_patient_without_shipping": "5.25"
},
{
"sample_pack_size": "60 count",
"sample_pack_price": "0.50",
"sample_pack_price_total_to_patient_without_shipping": "5.50"
},
{
"sample_pack_size": "90 count",
"sample_pack_price": "0.75",
"sample_pack_price_total_to_patient_without_shipping": "5.75"
}
],
"sample_pack_price": "0.25",
"sample_pack_price_total_to_patient_without_shipping": "5.25",
"sample_pack_price_w_shipping_dispensing": "10.50"
}
}
Pricing Formulas: Cash
For cash-pay patients, the total cost to the patient for a standard fill is:
patient_total = (sample_pack_size × price_per_unit)
+ cash_dispensing_fee // $5 standard · $15 cold-chain
+ cash_shipping_cost // $5.25 standard · $55 cold-chain
This is pre-computed in cpd_channel.sample_pack_price_w_shipping_dispensing for the default sample_pack_size only. Per-quantity totals without shipping are in sample_pricing[].sample_pack_price_total_to_patient_without_shipping.
Pricing Formulas: Insurance
For insurance-eligible drugs, use the insurance track fields:
patient_total = (sample_pack_size × price_per_unit)
+ insurance_dispensing_fee // $5 standard · $10 cold-chain
+ insurance_shipping_cost // $4 standard · $55 cold-chain
cpd_channel.insurance_eligible before presenting insurance pricing. If false, the drug can only be dispensed on the cash track.