Skip to main content

Migrating from the Costed BOM API to Luminovo's new endpoints

Update data in your ERP – create parts, update prices, pre-fill purchase orders with a set of new endpoints

Written by Luminovo Support

ℹ️ Use this guide if your integration with the Luminovo API (for example from your ERP) calls the Costed BOM endpoint and you need to move to the new endpoints. For supplier API integrations (live prices and stock), see Activate direct API integrations to your suppliers.

What's changing

The Get Costed BOM endpoint is now deprecated:

  • GET /rfqs/{id}/costed-bom

  • GET /projects/{id}/costed-bom

(Both return the same data – in Luminovo, a project and an RfQ are the same thing.)

The Costed BOM endpoint was originally built to mirror Luminovo's Excel costed-BOM export one-to-one in a single API call. That made the response very large and slow to generate for bigger BOMs, and harder to integrate against reliably.

We've replaced it with a set of smaller, focused endpoints. Each one returns a single, well-defined piece of the picture – projects, sourcing scenarios, purchase options, offers, and component data – so your integration is faster, more predictable, and easier to maintain.

Timeline: The Costed BOM endpoint still works today, but it will not receive further improvements. Please plan to migrate by January 1, 2027.
​

Some BOM-line data is not yet available from the new endpoints (see Not yet available below). If your integration depends on it, please contact your Customer Success Manager before you start migrating.


The new endpoints

The endpoints below cover projects, part data, offers, purchase options and costs. Some data from the Costed BOM, mainly part numbers and notes per BOM line, is not available yet – see Not yet available.

Available today

Endpoint

Method & path

Accept header

GET /projects

application/api.luminovo.project-overview-v1+json

GET /projects/{id}

application/api.luminovo.project-v1+json

GET /projects/{id}/tree

application/api.luminovo.assembly-ids-v1+json

GET /sourcing-scenarios/{id}

application/api.luminovo.sourcing-scenario-v2+json

GET /sourcing-scenarios/{id}/purchase-options

application/api.luminovo.sourcing-scenario-v1+json

GET /sourcing-scenarios/{id}/cost-breakdown

application/api.luminovo.sourcing-scenario-v1+json

POST /offers/find

application/api.luminovo.offer-v1+json

GET /offers/{id}

application/api.luminovo.offer-v1+json

POST /offers/bulk

application/api.luminovo.offer-v1+json

GET /off-the-shelf-parts/{id}

application/api.luminovo.off-the-shelf-part-v1+json

GET /components/ipn/{ipn}

application/api.luminovo.component-v1+json

GET /components

application/api.luminovo.component-v1+json

GET /calculations/assembly-costs

application/api.luminovo.assembly-cost-v1+json

*Get part returns the full master data of one off-the-shelf part: manufacturer, MPN, description, technical properties, package, compliance, and lifecycle. To fetch many parts in one call, use POST /off-the-shelf-parts/bulk.

**Get BOM tree returns the assembly IDs of a project only. Designators and per-assembly quantities for each BOM item come from Get cost breakdown.

💡 Assembly-level cost totals (material, manufacturing, and additional costs, plus whether the cost is frozen) come from Get calculated assembly cost. For the sourcing costs of a sourcing scenario broken down per assembly and per BOM item, use Get cost breakdown. It lists each assembly's own costs and the costs rolled up from its sub-assemblies, and for each BOM item its designators, per-assembly quantity, sourcing status and selected offers.


How the old data maps to the new endpoints

The Costed BOM combined four kinds of information. Here's where each now lives:

In the Costed BOM

Now available from

BOM structure – projects, assemblies, designators, quantities

Get all projects · Get a project · Get BOM tree (assembly IDs) · Get cost breakdown (designators and quantities per BOM item)

Part & component data* – MPN, manufacturer, description, compliance, lifecycle of the selected part; IPNs in your component library

Get component by IPN · List components · Get part

Sourcing & pricing – offers, selected purchase options, supplier, unit price, MOQ/MPQ, availability

Get purchase options · Find offers · Get an offer · Get offers

Cost summaries – per-assembly unit/total cost

Get calculated assembly cost · Get cost breakdown

*Part numbers per BOM line (IPN, CPN) are not available yet.

Not yet available

The following Costed BOM data has no replacement in the public API yet. We’re working on closing these gaps. If you rely on any of them, please contact your Customer Success Manager.

Costed BOM data

Status in the new endpoints

Part numbers as written on the BOM line: IPN, CPN, MPN, and the IPN description

Not yet available. Offers return the IPN only for inventory and ERP offers; distributor offers return the selected part’s MPN.

BOM line notes and the “manufacturer free” flag

Not yet available

Part options per BOM line (approved and pending parts)

Not yet available

Assembly type and assembly notes

Not yet available

Consignment

Partial: shown as sourcing_status = "Consigned" in Get cost breakdown

Sourcing scenario settings (lead-time preference, preferred and approved suppliers, excess preference, offer age limits, packaging, inventory sites)

Not yet available. Get a sourcing scenario returns currency settings only.

Alternative solutions (valid, warning and error solutions), solution and part warnings, sourcing notes

Not yet available. Only the selected offer is returned.

Offer origin (for example distributor API, quote request, import, manual)

Not yet available

Shipping time in days; scrap and excess quantities

Not yet available. Scrap and excess are returned as costs, not quantities.


Migrating by use case

1. Create internal part numbers (IPNs) for parts that don't have one yet

Goal: For parts that don't yet have an internal part number in your ERP, create the IPN using Luminovo's part data.

  1. Pull your component library from Luminovo:

    1. List components (GET /components) returns a paginated list of every component in your tenant – page through until you've read them all.

    2. Get the list of all MPNs connected to your IPNs.

  2. Pull the purchase options for the sourcing scenario (GET /sourcing-scenarios/{id}/purchase-options) and pull the corresponding offers with their offer_id values (GET /offers/{id} for one offer, or POST /offers/bulk for many in one call).

    1. Extract the MPN and the manufacturer from the offer data.

  3. Compare the data from 2(a) to the data from 1(b). If the MPN is not part of any IPN, use the MPN data to create a new part in your ERP system.
    :::callout backgroundColor="#feedaf80" borderColor="#fbc91633"
    ⚠️ The MPN comes from the selected offer, not from the BOM line, so it may differ from the MPN written on the BOM. One MPN can also be linked to several IPNs in your component library. Review those cases manually instead of writing them to your ERP automatically.
    :::


2. Update prices for parts using Luminovo data

Goal: Refresh the prices in your ERP with Luminovo's current offer data.

  1. Gather the part IDs you want priced. You'll find these on your components (from List components or Get component by IPN – the linked_parts carry their part IDs).

  2. Call Find offers (POST /offers/find) with the part IDs in filters.part_ids, up to 1,000 per request. Each ID needs its kind as a prefix, for example OffTheShelf:a1b2c3d4-5678-90ab-cdef-123456789012. The id of an off-the-shelf part in linked_parts is the bare UUID, so add the OffTheShelf: prefix yourself.

  3. The response is a flat list of offers. Each offer carries its linked_part (use it to match the offer to your part), the supplier, availability, and one or more price_breaks – each break has a unit_price such as { "amount": "0.0520", "currency": "EUR" }, plus minimum_order_quantity and minimum_packaging_quantity.

  4. The response is paginated: by default it returns up to 100 offers (set limit to get up to 1,000). While pagination.has_more is true, call again with the same filters and cursor set to pagination.next_cursor.

  5. Pick the relevant price and write it back to your ERP.

💡 Want only the prices Luminovo actually selected for a sourcing scenario (rather than all available market offers)? Use Get purchase options (next section) – each selected offer comes with its price.


3. Pre-fill purchase orders using purchase options

Goal: Create purchase orders in your ERP, pre-filled from the purchase options Luminovo selected.

  1. Get all projects (GET /projects) → find the project.

  2. Get a project (GET /projects/{id}) → the response lists the project's sourcing scenarios; take the sourcing scenario ID you want. (Optional: call Get a sourcing scenario (GET /sourcing-scenarios/{id}) for its demands, currency, and settings.)

  3. Get purchase options (GET /sourcing-scenarios/{id}/purchase-options) → the list of selected offers, ready for PO creation. Each entry includes:

    • quantity – the number of offer units to order

    • unit_of_measurement – what one offer unit represents (e.g. 1 piece, or 5 m of cable)

    • purchase_quantity – the total in base units (quantity × unit_of_measurement.value)

    • unit_price – the price of one offer unit

    • minimum_order_quantity and minimum_packaging_quantity

    • offer_id

  4. (Optional) Use the offer_id with Get an offer (GET /offers/{id}), or collect them for Get offers (POST /offers/bulk), to pull the full offer – supplier, all price breaks, and availability.

  5. Map each purchase option to a PO line in your ERP.

This endpoint's response is designed specifically for ERP systems to create purchase orders.

Did this answer your question?