External competing offers now available in GET /offers
- Home
- External competing offers now available in GET /offers
Introduction
The GET /offers endpoint now returns the best competing offer found on external marketplaces for each of your offers.
This gives sellers direct access to competitive pricing data without leaving the API.
What changed?
A new externalCompetingOffer object has been added to the offer response. When available, it exposes the best competing offer detected on an external marketplace, including pricing details and a price index relative to your own offer.
Retrieves offers that match the query from the offer repository.
Please note:
-
The limit of offers per request has increased. You can now paginate your results up to 1 000 offers.
-
If parameters
fieldsandexpandare both sent, theexpandparameter will be ignored.
Functional rules:
There are some differences in the attributes you can retrieve from Cdiscount (CDISFR) compared with other channels
-
Attributes only available on Cdiscount:
-
comments -
offerCompetition -
Best offer information into
salesChannelFeedback.bestOfferDetails -
expandparameter withsalesChannelFeedbackvalue -
Qualiscore: more details on offerQuality.scoreReasons into the FAQ
-
-
Attributes only available on other sales channels:
-
salesChannelAcceptanceStatus -
deliveryOffers.storageCountry -
Best offer information into
isBestOffer&BestOffer
-
New features:
-
Fields parameter:
The
fieldsparameter lets you fetch only the data you need.The payload will always contain basis information as:
-
offerId -
sellerExternalReference -
offerState -
createdAt -
updatedAt
To retrieve only the useful information, specify the field (e.g.,
condition) or the node name (e.g.,salesChannelFeedback) or the node name with the field name separated by a dot (e.g.,facialPrice.price). -
-
Expand parameter :
To include sales-channel feedback information, set the
expandparameter to:salesChannelFeedback
This node contains information returned by the sales channels' APIs. Because this data may take time to update, several
updatedAtfields are provided.If the sales channel does not return the information, the fields will be
null.
Examples:
-
Retrieve the first 1 000 offers on Cdiscount:
/offers?salesChannelId=CDISFR&limit=1000 -
Retrieve an offer based on it external reference on saleschannel Seller Sandbox:
/offers?salesChannelId=SELLZZ&sellerExternalReferences=ABC1234 -
Retrieve the first 1 000 offers with only specific attributes (offerId & integrationPrice):
/offers?salesChannelId=SELLZZ&fields=integrationPrice.price -
Retrieve the first 1 000 offers with saleschannel feedbacks:
/offers?salesChannelId=CDISFR&expand=salesChannelFeedback
Endpoint full URL: https://api.octopia-io.net/seller/v2/offers
Parameters - Headers
| Name | In | Type | Description |
|---|---|---|---|
| SellerId* | header |
string
|
Octopia Seller Identifier. Example : 98979 |
Parameters - Query
| Name | In | Type | Description |
|---|---|---|---|
| salesChannelId* | query |
string
|
Sales channel identifier you want to retrieve,. Example : SELLZZ |
| limit | query |
number
|
Limits the number of offers per page, maximum 1000, default 100 Default : 100 Example : 500 |
| fields | query |
string
|
The fields parameter lets you fetch only the data you need. By default, the payload will always contains basis information as offerId, sellerExternalReference and offerState Example : condition, product, salesChannelFeedback.competingOffers |
| expand | query |
string|enum
|
In order to display the sales channel feedback information in addition of the standard payload you must fill the expand parameter with salesChannelFeedback Example : salesChannelFeedback Available values : ["salesChannelFeedback"] |
| offerIds | query |
string
|
Offers identifiers you want to retrieve, separated by a comma. Example : 1234_HAM0028178207328_6_SELLZZ,1234_AUC4894626011153_6_SELLZZ |
| offerStates | query |
string
|
Offers state you want to retrieve, separated by a comma. Example : inactive,active |
| gtins | query |
string
|
Products gtin you want to retrieve, separated by a comma. Example : 1234567890123, 2345678901234 |
| sellerExternalReferences | query |
string
|
Seller external references you want to retrieve, separated by a comma. Example : REF001,REF002 |
| updatedAtMin | query |
string
|
Format - date-time (as date-time in RFC3339). Return offers only if "updatedAt" property is bigger or equal to parameter value. Example : 2023-04-20T10:10:00.0000000+00:00 |
Response codes
200 - Successapplication/json
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
400 - Bad Requestapplication/problem+json |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
401 - Unauthorizedapplication/problem+json |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
403 - Forbiddenapplication/problem+json |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
500 - Internal Server Errorapplication/problem+json |
The object includes the following fields:
marketplaceName— the external marketplace where the competing offer was found (e.g.AMAZON)price— the competitor’s base pricedeliveryCost— the competitor’s delivery costtotalPrice— the competitor’s total price (base price + delivery)priceIndex— your offer’s total price expressed as a percentage of the competitor’s total price. A value above100means your offer is more expensive; below100means you are cheaperupdatedAt— the timestamp of the last competitive data refresh
The field is absent when no external competing offer has been detected for a given product.
Example
"externalCompetingOffer": {
"marketplaceName": "AMAZON",
"price": 42.49,
"deliveryCost": 0,
"totalPrice": 42.49,
"priceIndex": 101.98,
"updatedAt": "2026-07-13T16:11:30Z"
}
In this example, the seller’s total price is approximately 2% higher than the best Amazon offer at the time of the last data refresh.
Why it matters
Sellers can now integrate competitive pricing signals directly into their repricing workflows, ERP, or OMS — without relying on separate market monitoring tools. By exposing the priceIndex, the API makes it straightforward to identify offers that are losing ground on price and act accordingly.