This guide is for advertisers whose scripts and integrations call the old API at api.kadam.net (the app_id and secret_key parameters, request signing, methods such as ads.campaigns.get). It explains how to move an integration to the new API, what replaces each old method, and what the new API does not support.
New API description: API Advertisers and Swagger.
Important: on November 16, 2026 the old API will be switched off. After that date, requests to api.kadam.net will stop working.
Migration algorithm
The API has been completely redesigned and is not backward compatible. Every call has to be moved to the new API. The following sections contain a table of the basic differences; the specification of each method (parameters, request bodies, responses) is in the new API documentation.
List your calls. Find every request to
api.kadam.netin your code and write down the methods (ads.campaigns.get,ads.materials.put, and so on).Find each method in the tables below. Every method has one of three statuses:
• Direct replacement: the new API has an endpoint for the same task.
• Alternative: the same operation does not exist, but the goal can be reached another way through the API.
• Not supported in the new API: the goal cannot be reached through the new API.
Get a token. Open the advertiser dashboard, go to "Profile and settings" and copy the token. Treat it like a password. You can reset the token with
POST /api/users/token-reset.Replace authorization. Remove the
auth.tokencall, thesignaturecalculation, and theapp_idandclient_idparameters. Add theAuthorization: Bearer <token>header to every request.Replace addresses and method formats. Convert the calls using the tables.
Replace dictionary IDs. Take campaign types, statuses, countries, regions and browsers from the new API dictionaries (
GET /dictionaries/{type},GET /campaigns/options). Do not carry numeric constants over from the old code.Rework response parsing. Data now lives in
data; an error issuccess: falsewith the text inmsg.Check the result against the dashboard. Compare the data returned by the new API with the dashboard: campaign and material lists, statistics, balance.
Launch the integration. Remove any leftover old API calls from your code and turn back on the jobs you stopped.
Authorization example.
Before:
GET https://api.kadam.net/auth.token?app_id=12345&secret_key=SECRET
GET https://api.kadam.net/ads.campaigns.get?app_id=12345&client_id=12345&limit=50&offset=0&signature=<md5 of the signature string>
After:
POST https://partners.kadam.net/api/v1/campaigns
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{"page": 1, "perPage": 50, "sort": {"dateCreation": "desc"}}
Basic differences of the new API from the old one
| Old API | New API |
Address |
|
|
Keys |
| A single Bearer token |
Getting a token |
| The token is taken in the dashboard under "Profile and settings" and does not expire |
Request authorization |
|
|
Call format | Method in the resource name ( | REST: path and HTTP method ( |
Client |
| Not needed: the token is tied to your account |
Successful response |
|
|
Error |
|
|
Pagination |
|
|
Sorting | A string in the | An object |
Dates and time zone |
|
|
Method mapping
The "New API" column gives the path and HTTP method. For parameters and request body schemas, see Swagger.
Account and finances
Old method | Status | New API | Notes |
| Direct replacement |
|
|
| Direct replacement |
| The list depends on your account: currencies, fees and minimum amounts are already resolved for you. |
| Alternative |
| There are no separate dictionaries. The operation type is set in |
Campaigns
Old method | Status | New API | Notes |
| Direct replacement |
| Filters in |
| Direct replacement |
| The response has the same format that |
| Direct replacement |
| The body depends on the campaign type: Native, Banner, Push, Popunder, In-Page Push. To check a body in advance without creating anything, use |
| Direct replacement |
| There is no partial update: an omitted field is reset to its default. Fetch the campaign with |
| Direct replacement |
| The old method moved a campaign to the archive. In the new API, archiving is |
| Direct replacement |
| Each campaign's status comes in the list. For a single campaign, use |
| Alternative |
| This is pause and start, not a technical block with the old status. |
| Direct replacement |
| Black list: |
| Not supported in the new API | — | The postback URL is taken from the documentation or from the campaign editing interface. |
| Alternative |
| These methods are already disabled in the old API. Statistics by site: |
| Alternative |
| Bid for sites: a number, |
| Direct replacement |
|
|
| Direct replacement |
| Types: 10 Native, 20 Banner, 30 Push, 40 Popunder, 100 In-Page Push. |
| Direct replacement |
|
|
| Not supported in the new API | — | The new API has neither tags nor a price per tag. |
Campaign bids are changed by separate methods: PUT /campaigns/{id}/bid for one campaign and PUT /campaigns/bids for several.
Materials
Old method | Status | New API | Notes |
| Direct replacement |
| Filters: |
| Direct replacement |
|
|
| Direct replacement |
| The image file is sent right in the request ( |
| Direct replacement |
|
|
| Direct replacement |
| First move the material to the archive, then you can delete it. |
| Direct replacement |
|
|
| Alternative |
| There is no separate file upload: the file goes in the material creation request. For a batch of images there is a two-step bulk upload: |
| Not supported in the new API | — |
|
For bulk actions on materials there are POST /materials/activate, /materials/pause, /materials/archive, /materials/restore, /materials/copy, /materials/move. They take a list in the adsIds field.
Audiences
Old method | Status | New API | Notes |
| Direct replacement |
|
|
| Direct replacement |
| Audience types: |
| Direct replacement |
|
|
| Direct replacement |
|
|
Statistics
Old method | Status | New API | Notes |
| Direct replacement |
| Groupings and metrics are chosen in the request body. The list of available groupings and metrics comes from |
| Direct replacement |
| Same. |
| Direct replacement |
|
|
| Alternative |
|
|
| Alternative |
| These methods are already disabled in the old API. |
| Alternative |
| There are no raw clicks. Aggregated clicks are in the reports, and raw conversions come from |
Dictionaries
Old method | Status | New API | Notes |
| Direct replacement |
|
|
| Direct replacement |
|
|
| Direct replacement |
|
|
| Direct replacement |
|
|
| Direct replacement |
| The country is passed in the |
| Direct replacement |
|
|
| Direct replacement |
|
|
| Direct replacement |
|
|
| Alternative |
| The old method returned a list of CPA modes. In the new API the mode is not chosen separately: postback statuses are set with the |
All GET /dictionaries/{type} dictionaries accept the search, page and perPage (up to 500) parameters.
Not supported in the new API
The first method below has another way to get the same information. The rest belong to functionality that has not existed in Kadam for a long time — there is nothing to migrate for them.
ads.campaigns.cpa.mode.get: the postback URL is taken from the documentation or from the campaign editing interface. If you need anything else, contact your manager or support.ads.campaigns.tags.get,ads.tags.get— campaign and material tags with a price per tag, long gone from Kadam.ads.materials.partners.get— long gone from Kadam.ads.offers.*andads.offers.landings.*— offers and landing pages as separate entities, long gone from Kadam. The click-through link is set in the campaign or material itself.server.time.get,about.methods.get,about.version.get— service methods unrelated to business functionality.ads.clients.*— balance and client management for agency accounts, long gone from Kadam.
What to keep in mind when migrating
Campaigns are updated only as a whole.
PUT /campaigns/{id}/updatereplaces the campaign completely. An omitted field returns to its default, for example an omitteddayMoneyLimitremoves the daily limit. Always fetch the campaign withGET /campaigns/{id}first.Dictionaries instead of constants. Take status, type and country IDs from the new API dictionaries.
Time zone. The
timezoneparameter in the new API is an integer from -12 to 12, not a+00:00string.Field names. Bulk methods take lists in the
campaignIdsandadsIdsfields, not inids.Empty result. The old API answered with HTTP 204. In the new API, for lists expect
success: trueand an empty set of rows indata, not a separate response code.Material files are sent in the material creation or update request itself.
Errors
Old code | Meaning | Closest case in the new API |
0 | Unknown error |
|
1 | Method not found | Not applicable: use the paths from this guide. If an object (campaign, material) is not found, the API answers with HTTP 404 |
2, 7, 9 | Parameters not set, bad data, outdated macros | HTTP 422, the fields with errors are listed in |
3, 8 | Client or key not found, incorrect token | HTTP 401 |
4, 5 | Token expired, incorrect signature | Not applicable: the token does not expire and there is no signature |
6 | Access denied | HTTP 403 |
10 | Too many requests | HTTP 429 |
The mapping is approximate: rely on success and msg. On an error, the new API returns {"success": false, "code": 400, "msg": {"field": ["error description"]}}.
What the new API gives you
Autorules for managing bids in CPC campaigns (
/autorules,/campaigns/{campaignId}/autorules).Traffic forecast by bid before launching a campaign or raising a bid (
POST /campaigns/forecast).Checking a campaign or an audience without creating it (
POST /campaigns/validate,POST /audiences/validate).Bid optimization by statistics slices (
/stats/extended).Bulk bids and site blocking, per-country material bids (
PUT /stats/sites/bids,POST /stats/sites/block,PUT /materials/bids).Bulk material upload from images and ZIP archives (
/materials/bulk/upload,/materials/bulk).Copying campaigns and materials, campaign folders with bulk actions (
POST /campaigns/{id}/copy,/materials/copy,/campaigns/folders).Account daily spending limit, Easy Start, creative import from RSS, report builder (
/finances/day-money-limit,PUT /campaigns/{id}/easy-start,PUT /campaigns/{id}/rss,/custom-reports).
