Migration Guide¶
Purpose: This guide is designed to help API partners migrate from older deprecated API versions (v2
, v3
, v4
) to the latest version (v5
) of the Sellside API.
Key changes and benefits of migrating¶
○ Autobidding allows the use of an automated (smart) bidding strategy. [See more here (in Dutch)](https://help.marktplaats.nl/s/article/marktplaats-pro-automatische-cost-per-click-instellingen)
○ Introducing micros as the monetary unit enables more precise cost management, allowing finer granularity in ad spending and budget allocation. 1 cent is equal to 10000 micros.
○ Improved pagination with the more efficient industry-standard
pageToken
, as a replacement for the oldoffset/limit
pagination mechanism.○ Optional campaign (and campaign budget) management allows for better control over spending, by setting a campaign-level budget as well as pausing an entire campaign, effectively taking all the ads in the campaign offline.
○ Budgets and price fields are streamlined into a clear format, improving accuracy and consistency across the API. The Step By Step guide explains how to convert the values to the new format.
○ Removal of
pageNumber
&suggestedCpcForPageOne
from ad and category endpoints.Context: In the desktop era, most traffic came from leaf category browse actions, leading to the introduction of the “suggested CPC for page one.” However, as traffic sources have diversified to include search actions and personalized recommendations, the relevance of these fields has decreased.
The removal reflects the shift towards a more dynamic and diverse traffic landscape where different ranking methods are more effective. This simplifies ad management by removing outdated metrics.
Step by step guide¶
This section provides a detailed view of the changes for each affected API endpoint, mapping fields from the old and deprecated versions to the new v5. Follow this guide to understand the modifications and learn how to update your implementation for a smooth migration.
Each API endpoint is presented in a expandable/collapsible section, with the deprecated and new versions side by side for easy comparison.
GET /ad/{id}
Response payload: deprecated version
{
// ...
"statusReasons": ["DOMAIN_PENDING"],
"priceType": "FIXED_PRICE",
"currency": "EUR",
"price": 5600,
"originalPrice": 6500,
"cpc": 15,
"totalBudget": 1000,
"dailyBudget": 500,
"spentBudget": 120,
"dailySpent": 50,
"pageNumber": 2,
"suggestedCpcForPageOne": 15,
"allowPayPal": true,
"shippingOptions": [
{
"cost": 500,
"time": "2d-5d"
}
]
}
Response payload: new version
{
// ...
"price": {
"amountCents": 5600,
"originalAmountCents": 6500,
"priceType": "FIXED_PRICE"
},
"campaignId": 54212,
"bidMicros": "10000",
"budgets": {
"daily": {
"limitMicros": "UNLIMITED",
"spentMicros": "500000"
},
"total": {
"limitMicros": "10000000",
"spentMicros": "1200000"
}
},
"shippingOptions": [
{
"costCents": 500,
"time": "2d-5d"
}
]
}
Mapping details
Deprecated media type(s):
application/sellside.ad-v2+json
application/sellside.ad-v3+json
New media type:
application/sellside.ad-v5+json
Price:
price
andoriginalPrice
map toprice.amountCents
andprice.originalAmountCents
respectively. The value was already in cents so there is no need for conversion.CPC:
cpc
is replaced bybidMicros
, and is represented as a string type, instead of integer. This requires a conversion of the values from a micros unit, when interpreting them as cents.Budget Fields:
dailyBudget
andtotalBudget
map tobudgets.daily.limitMicros
andbudgets.total.limitMicros
respectively.dailySpent
andspentBudget
map tobudgets.daily.spentMicros
andbudgets.total.spentMicros
. Values are represented in string type, instead of integer, and at micro precision, instead of cents. The limits can also be"UNLIMITED"
.Shipping Cost:
cost
is renamed tocostCents
in V5. The value was already in cents so there is no need for conversion.Removed field(s):
statusReasons
,pageNumber
,suggestedCpcForPageOne
,currency
,allowPayPal
. The fieldvendorId
should be used instead ofexternalId
, which is deprecated and planned for removal.New field(s):
campaignId
: this is an identifier for the campaign which this ad is part of. Campaign management is optional. By default, every seller has one campaign associated with them, with every ad attached to that campaign. See Campaigns for more.If necessary, position (page number and suggested cost per click) funnel information can be obtained from the replacement GET /ad/{id}/position endpoint (see the FAQ).
GET /ad/byVendor/{vendorId}
Response payload: deprecated version
{
// ...
"statusReasons": ["DOMAIN_PENDING"],
"priceType": "FIXED_PRICE",
"currency": "EUR",
"price": 5600,
"originalPrice": 6500,
"cpc": 15,
"totalBudget": 1000,
"dailyBudget": 500,
"spentBudget": 120,
"dailySpent": 50,
"pageNumber": 2,
"suggestedCpcForPageOne": 15,
"allowPayPal": true,
"shippingOptions": [
{
"cost": 500,
"time": "2d-5d"
}
]
}
New version
{
// ...
"price": {
"amountCents": 5600,
"originalAmountCents": 6500,
"priceType": "FIXED_PRICE"
},
"campaignId": 54212,
"bidMicros": "10000",
"budgets": {
"daily": {
"limitMicros": "UNLIMITED",
"spentMicros": "500000"
},
"total": {
"limitMicros": "10000000",
"spentMicros": "1200000"
}
},
"shippingOptions": [
{
"costCents": 500,
"time": "2d-5d"
}
]
}
Mapping details
Deprecated media type(s):
application/sellside.ad-v2+json
application/sellside.ad-v3+json
New media type:
application/sellside.ad-v5+json
Price:
price
andoriginalPrice
map toprice.amountCents
andprice.originalAmountCents
respectively. The value was already in cents so there is no need for conversion.CPC:
cpc
is replaced bybidMicros
, and is represented as a string type, instead of integer. This requires a conversion of the values from a micros unit, when interpreting them as cents.Budget Fields:
dailyBudget
andtotalBudget
map tobudgets.daily.limitMicros
andbudgets.total.limitMicros
respectively.dailySpent
andspentBudget
map tobudgets.daily.spentMicros
andbudgets.total.spentMicros
. Values are represented in string type, instead of integer, and at micro precision, instead of cents. The limits can also be"UNLIMITED"
.Shipping Cost:
cost
is renamed tocostCents
in V5. The value was already in cents so there is no need for conversion.Removed field(s):
statusReasons
,pageNumber
,suggestedCpcForPageOne
,currency
,allowPayPal
. The fieldvendorId
should be used instead ofexternalId
, which is deprecated and planned for removal.New field(s):
campaignId
: this is an identifier for the campaign which this ad is part of. Campaign management is optional. By default, every seller has one campaign associated with them, with every ad attached to that campaign. See Campaigns for more.If necessary, position (page number and suggested cost per click) funnel information can be obtained from the replacement GET /ad/{id}/position endpoint (see the FAQ).
POST /ad
Request payload: deprecated version
{
// ...
"priceType": "FIXED_PRICE",
"currency": "EUR",
"price": 5600,
"originalPrice": 6500,
"cpc": 15,
"totalBudget": 1000,
"externalId": "OUR-SHOP-123",
"allowPayPal": true,
"shippingOptions": [
{
"cost": 500,
"time": "2d-5d"
}
]
}
Request payload: new version
{
// ...
"price": {
"amountCents": 5600,
"originalAmountCents": 6500,
"priceType": "FIXED_PRICE"
},
"vendorId": "OUR-SHOP-123",
"bidMicros": "10000",
"budgets": {
"daily": {
"limitMicros": "UNLIMITED",
},
"total": {
"limitMicros": "10000000",
}
},
"shippingOptions": [
{
"costCents": 500,
"time": "2d-5d"
}
]
}
Mapping details
Deprecated media type(s):
application/sellside.ad-v2+json
application/sellside.ad-v3+json
New media type:
application/sellside.ad-v5+json
Price:
price
andoriginalPrice
map toprice.amountCents
andprice.originalAmountCents
respectively. The value was already in cents so there is no need for conversion.CPC:
cpc
is replaced bybidMicros
. This requires a conversion of the values to a micros unit, and supplying it as string type, instead of integer.Budget Fields:
daiyBudget
andtotalBudget
map tobudgets.daily.limitMicros
andbudgets.total.limitMicros
respectively.dailySpent
andspentBudget
map tobudgets.daily.spentMicros
andbudgets.total.spentMicros
. Beware that they are now mandatory to supply. Values should be supplied in string type, instead of integer, and at micro precision, instead of cents. The budget limits can also be"UNLIMITED"
.Shipping Cost:
cost
is renamed tocostCents
. The value was already in cents so there is no need for conversion.Removed field(s):
currency,
allowPayPal
.externalId
is marked as deprecated and planned for removal, please usevendorId
instead.
PUT /ad/{id}
Request payload: deprecated version
{
// ...
"priceType": "FIXED_PRICE",
"currency": "EUR",
"price": 5600,
"originalPrice": 6500,
"cpc": 15,
"totalBudget": 1000,
"externalId": "OUR-SHOP-123",
"allowPayPal": true,
"shippingOptions": [
{
"cost": 500,
"time": "2d-5d"
}
]
}
Request payload: new version
{
// ...
"price": {
"amountCents": 5600,
"originalAmountCents": 6500,
"priceType": "FIXED_PRICE"
},
"vendorId": "OUR-SHOP-123",
"bidMicros": "10000",
"budgets": {
"daily": {
"limitMicros": "UNLIMITED",
},
"total": {
"limitMicros": "10000000",
}
},
"shippingOptions": [
{
"costCents": 500,
"time": "2d-5d"
}
]
}
Mapping details
Deprecated media type(s):
application/sellside.ad-v2+json
application/sellside.ad-v3+json
New media type:
application/sellside.ad-v5+json
Price:
price
andoriginalPrice
map toprice.amountCents
andprice.originalAmountCents
respectively. The value was already in cents so there is no need for conversion.CPC:
cpc
is replaced bybidMicros
. This requires a conversion of the values to a micros unit, and supplying it as string type, instead of integer.Budget Fields:
daiyBudget
andtotalBudget
map tobudgets.daily.limitMicros
andbudgets.total.limitMicros
respectively.dailySpent
andspentBudget
map tobudgets.daily.spentMicros
andbudgets.total.spentMicros
. Beware that they are now mandatory to supply. Values should be supplied in string type, instead of integer, and at micro precision, instead of cents. The budget limits can also be"UNLIMITED"
.Shipping Cost:
cost
is renamed tocostCents
. The value was already in cents so there is no need for conversion.Removed field(s):
currency,
allowPayPal
.externalId
is marked as deprecated and planned for removal, please usevendorId
instead.
GET /ad/ (list)
Request payload: deprecated version
{
"ads": [
{
// ...
"statusReasons": ["DOMAIN_PENDING"],
"priceType": "FIXED_PRICE",
"currency": "EUR",
"price": 5600,
"originalPrice": 6500,
"cpc": 15,
"totalBudget": 1000,
"dailyBudget": 500,
"spentBudget": 120,
"dailySpent": 50,
"pageNumber": 2,
"suggestedCpcForPageOne": 15,
"allowPayPal": true,
"shippingOptions": [
{
"cost": 500,
"time": "2d-5d"
}
]
}
],
"count": 1,
"nextPageToken": "eyJ0eXAiOiJK"
}
Request payload: new version
{
"ads": [
{
// ...
"price": {
"amountCents": 5600,
"originalAmountCents": 6500,
"priceType": "FIXED_PRICE"
},
"campaignId": 54212,
"bidMicros": "10000",
"budgets": {
"daily": {
"limitMicros": "UNLIMITED",
"spentMicros": "500000"
},
"total": {
"limitMicros": "10000000",
"spentMicros": "1200000"
}
},
"shippingOptions": [
{
"costCents": 500,
"time": "2d-5d"
}
]
}
],
"count": 1
}
Mapping details
Deprecated media type(s):
application/sellside.ad.list-v4+json
New media type:
application/sellside.ad.list-v5+json
Ads: the list of ads under
ads
is now of the v5 format.Removed field(s):
offset
,paremainingBudget
New field(s):
nextPageToken
: this replaces the usage ofoffset
for pagination. The value is a string that should be used as a query parameter in the next request to get the next page of results.
PUT /ad/{id}/status/{status}
Only change the media type to a versioned one application/sellside.ad-v5+json
, it should be completely backwards compatible. See the FAQ section for details.
GET /categories
Response payload: deprecated version
{
// ...
"config": {
// ...
"cpc": "[1,250]",
"totalBudget": "[100,200000000]",
"dailyBudget": "[1000,200000000]",
"currency": "EUR",
"paypalEnabled": true,
"suggestedCpcForPageOne": 30,
}
}
Response payload: new version
{
// ...
"config": {
// ...
"bidMicros": "[10000,2500000]",
"totalBudgetMicros": "[1000000,2000000000000]",
"dailyBudgetMicros": "[10000000,2000000000000]"
}
}
Mapping details
Deprecated media type(s):
application/sellside.category.list-v1+json
New media type:
application/sellside.category.list-v5+json
CPC: cpc is replaced by
bidMicros
. The interval values require conversion from a micros unit when interpreting them as cents.Budget Fields:
dailyBudget
andtotalBudget
map todailyBudgetMicros
andtotalBudgetMicros
respectively. The interval values require conversion from a micros unit, when interpreting them as cents.Removed field(s):
suggestedCpcForPageOne
,currency
,paypalEnabled
.
GET /category/{id}
Response payload: deprecated version
{
// ...
"config": {
// ...
"cpc": "[1,250]",
"totalBudget": "[100,200000000]",
"dailyBudget": "[1000,200000000]",
"currency": "EUR",
"paypalEnabled": true,
"suggestedCpcForPageOne": 30,
}
}
Response payload: new version
{
// ...
"config": {
// ...
"bidMicros": "[10000,2500000]",
"totalBudgetMicros": "[1000000,2000000000000]",
"dailyBudgetMicros": "[10000000,2000000000000]"
}
}
Mapping details
Deprecated media type(s):
application/sellside.category-v2+json
New media type:
application/sellside.category-v5+json
CPC: cpc is replaced by
bidMicros
. The interval values require conversion from a micros unit when interpreting them as cents.Budget Fields:
dailyBudget
andtotalBudget
map todailyBudgetMicros
andtotalBudgetMicros
respectively. The interval values require conversion from a micros unit, when interpreting them as cents.Removed field(s):
suggestedCpcForPageOne
,currency
,paypalEnabled
.
Summary of API version changes
API Endpoint |
Deprecated Versions |
New Version |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unversioned |
|
|
|
|
|
|
|
Campaigns¶
The Campaigns API helps you manage your campaign(s) efficiently. Think of a campaign as a container for ads, with key details like the campaign ID, name, creation date, and daily and total budget limits. Each campaign also has a status field that shows whether it is active or inactive.
By default, campaign management is largely automated behind the scenes. All seller ads are automatically grouped into a single default campaign that is created and managed under the hood. However, as an API partner, you have the flexibility to create, update, and manage campaigns yourself, allowing for more granular control over your advertising strategy.
An ad can only be inside one campaign at a given moment. If you want to move an ad to a different campaign, you need to update the ad with the new campaignId.
When using the campaigns API for the first time, it’s handy to remember to:
○ Get a list of campaigns to check if the user already has an automatic “default” campaign created by the system. It will provide you with a campaign identifier can then use for the rest of the endpoints.
○ Update a campaign budgets to set or change a daily and total budget for the campaign. This is a prerequisite for using the autobidding feature. Beware that the budget limits apply to all ads within the campaign, which means that when the budget limit is reached, all ads in the campaign will be taken offline.
○ You can also work with a vendorId in case you manage multiple campaigns and want to keep track of them in your own system too.
Note
The ability to manage multiple campaigns is currently only available for Kleinanzeigen sellers. Please contact our Pro team for access to the functionality of managing multiple campaigns per seller.
FAQ¶
○ What should I do with the externalId
? I need it for keeping track of ads.
Please move to using
vendorId
, keep in mind that it needs to be unique per seller.
○ What happened to the ad funnel information, it is no longer in the payload?
The ad funnel information is now available in the new GET /ad/{id}/position endpoint.
○ How do I handle the new bidMicros
field?
The
bidMicros
field is a replacement for the oldcpc
field. It is a value in micros, which is 1/10000 of a cent. When interpreting the value, you should convert it to cents by dividing by 10000.
○ What is the new campaignId
field in the ad payload?
The
campaignId
field is an identifier for the campaign which this ad is part of. Campaign management is optional. By default, every seller has one campaign associated with them, with every ad attached to that campaign. See Campaigns for more.
○ What does the status value DOMAIN_PENDING
in ads mean?
This status is related to a phishing protection measure we implemented for sellers using the Admarkt Console UI. This protection helps prevent scammers from adding phishing URLs to ads when taking over a seller account, by requiring sellers to confirm that the domain associated with the ad is valid, via email. It’s important to note that this protection is currently only active for sellers who manage their ads through the Console UI. As a result, API partners should not typically encounter the
DOMAIN_PENDING
status.
○ Do I have to use the campaign related endpoints?
No, campaign management is optional. By default, every seller has one campaign associated with them, with every ad attached to that campaign. However, if you plan to leverage our autobidding features, you’ll need to use the campaign-related endpoints, specifically to set a daily budget limit at the campaign level. This is a prerequisite for using the autobidding. Setting a daily limit also helps you optimize your cost per click and maximize conversions while controlling your budget from being depleted too quickly.
○ What happens when I pause a campaign?
When you set the status of a campaign to
PAUSED
, all ads within that campaign will no longer be visible online on our marketplace, and your budget will immediately stop spending. However, this does not change the individual status of each ad; it only affects their effective visibility for the buyers on our marketplace. When you reactivate the campaign by setting its status toACTIVE
or by adding a budget, only the ads with an individual status ofACTIVE
will become visible on our marketplace again.