Developers

COD Drop catalogue and adoptions

Browse the Swift Dropshipping (COD Drop) catalogue, adopt products for the seller at their price, update or give them back, and sell them.

A creator publishes a product with a COD Drop price per country (what the reseller pays per delivered unit, in USD); a reseller adopts it with their own sale price, takes orders on it, and ColiSwift ships it. These endpoints are the seller’s own COD Drop screens, through the API: same filters, same visibility rules, same refusals and the same error codes.

  1. Browse: GET /cod-drop/catalog (scope catalogue:read, app enabled for the catalogue synchronisation — see access). Without it, pick products in ColiSwift’s own COD Drop screens.
  2. Adopt: POST /cod-drop/adoptions with the sale price per country (scope cod_drop:write).
  3. The adopted product now appears in GET /products with "adopted": true.
  4. Sell: create orders whose line reference is the adoption’s sellerSku (or the creator’s reference).
  5. Stay in sync: adoption.created / adoption.updated / adoption.removed tell you when the adoption moves, product.changed when the product moves, and cod_drop.catalog_changed when the catalogue itself moves (events).

Who may use these endpoints

Two switches sit on top of the scopes. They are checked after the scope (a token without the scope still gets 403 INSUFFICIENT_SCOPE) and before the body is read.

SwitchEndpointsWhen off
Seller’s COD Drop access — opened or closed by ColiSwift for each seller (open from sign-up on the sandbox)All five: GET /cod-drop/catalog, GET /cod-drop/catalog/{productId}, POST /cod-drop/adoptions, PUT and DELETE /cod-drop/adoptions/{productId}403 COD_DROP_ACCESS_CLOSED — the seller must ask their account manager to open it.
App’s COD Drop catalogue synchronisation — enabled by ColiSwift per app, off by default, never on a sandbox appGET /cod-drop/catalog, GET /cod-drop/catalog/{productId} (and the cod_drop.catalog_changed event)403 COD_DROP_CATALOG_NOT_ENABLED — contact ColiSwift. Adoptions are not affected.
403 Forbidden
{
  "error": {
    "message": "COD Drop access is closed for this seller's account. The seller must ask their account manager to open it.",
    "code": "COD_DROP_ACCESS_CLOSED"
  }
}
403 Forbidden
{
  "error": {
    "message": "COD Drop catalogue synchronisation is not enabled for this application. Contact ColiSwift to enable it.",
    "code": "COD_DROP_CATALOG_NOT_ENABLED"
  }
}

Closing a seller’s access does not undo anything: their existing adoptions stay, keep taking resale orders through POST /orders, and still appear in GET /products. The switch is read on every call, so it takes effect on the next one.

Browse the catalogue

GET/cod-drop/catalogscope catalogue:read

Needs the app’s catalogue synchronisation and the seller’s COD Drop access (access).

Query
searchstring

Free-text search.

categorystring

Product category.

badgestring

Catalogue badge filter.

countrystring (2)

One of the seller’s countries (else 403 COUNTRY_NOT_ALLOWED). Without it the catalogue is limited to all the seller’s countries.

sortstring

Default newest.

  • newest
  • cession_asc
  • cession_desc
cursor · limit

Opaque cursor; default 50, max 100.

curl "https://coliswift.com/api/partner/v1/cod-drop/catalog?country=MA&sort=newest" \
  -H "Authorization: Bearer $COLISWIFT_ACCESS_TOKEN"
Response
{
  "data": [
    {
      "id": "3d4e5f6a-7b8c-4d9e-a0f1-b2c3d4e5f6a7",
      "reference": null,
      "label": "Sunset lamp",
      "description": "Warm sunset light, USB powered.",
      "category": "electronics",
      "imageUrl": "https://cdn.example.com/lamp.jpg",
      "imageUrls": [
        "https://cdn.example.com/lamp.jpg"
      ],
      "countryCodes": [
        "MA"
      ],
      "pricesByCountry": [
        {
          "countryCode": "MA",
          "price": "6.0000",
          "currency": "USD"
        }
      ],
      "variants": [
        {
          "id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
          "label": "White",
          "sku": null
        }
      ],
      "adopted": false,
      "createdAt": "2026-10-28T12:00:00.000Z",
      "updatedAt": "2026-11-01T09:00:00.000Z"
    }
  ],
  "nextCursor": null,
  "hasMore": false
}

The COD Drop product

idstring

Product id — the productId to adopt.

referencestring | null

The creator’s SKU — null until the seller adopts the product (adopted: false), as in ColiSwift’s COD Drop catalogue.

label · descriptionstring · string | null

Name and text.

categorystring | null

Product category.

imageUrl · imageUrlsstring | null · string[]

Main image and gallery.

countryCodesstring[]

Countries where the seller can sell it.

pricesByCountry[]object[]

countryCode, price, currency — the COD Drop price shown in ColiSwift’s COD Drop catalogue: what the seller pays per delivered unit in that country (4-decimal string, USD).

variants[]object[]

id, label, sku — sku is null until the seller adopts the product.

adoptedboolean

Whether this seller already adopted it.

createdAt · updatedAttimestamp

Private products appear only for sellers in their audience; the seller’s own products are never listed (a page may therefore be shorter than limit with hasMore: true).

One catalogue item

GET/cod-drop/catalog/{productId}scope catalogue:read

Exactly the row the list would return for this seller, or 404 PRODUCT_NOT_FOUND when it is not (or no longer) in their adoptable catalogue — unpublished, deactivated, deleted, private without them, no shared country, or their own. This is what to re-read on cod_drop.catalog_changed: a 404 means « remove it ». Same access rules as the list.

Adopt a product

POST/cod-drop/adoptionsscope cod_drop:write
Body
productIdstringrequired

Catalogue item id.

prices[]object[], 1–20

countryCode + salePrice (money string), one row per country, each country once. Recommended.

salePricemoney string

Fallback sale price. Required when prices is absent; defaults to the first row of prices otherwise.

sellerSkustring ≤ 100 | null

The seller’s own SKU for this product — what their store will put on order lines. Unique among their adoptions.

curl -X POST "https://coliswift.com/api/partner/v1/cod-drop/adoptions" \
  -H "Authorization: Bearer $COLISWIFT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "productId": "3d4e5f6a-7b8c-4d9e-a0f1-b2c3d4e5f6a7",
  "prices": [
    {
      "countryCode": "MA",
      "salePrice": "149.00"
    }
  ],
  "sellerSku": "MY-LAMP"
}'
201 Created
{
  "id": "3d4e5f6a-7b8c-4d9e-a0f1-b2c3d4e5f6a7",
  "reference": "CRE-LAMP-02",
  "label": "Sunset lamp",
  "description": "Warm sunset light, USB powered.",
  "category": "electronics",
  "imageUrl": "https://cdn.example.com/lamp.jpg",
  "imageUrls": [
    "https://cdn.example.com/lamp.jpg"
  ],
  "countryCodes": [
    "MA"
  ],
  "pricesByCountry": [
    {
      "countryCode": "MA",
      "price": "6.0000",
      "currency": "USD"
    }
  ],
  "salePricesByCountry": [
    {
      "countryCode": "MA",
      "price": "149.0000"
    }
  ],
  "variants": [
    {
      "id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
      "label": "White",
      "sku": "CRE-LAMP-02-W"
    }
  ],
  "adopted": true,
  "createdAt": "2026-10-28T12:00:00.000Z",
  "updatedAt": "2026-11-02T09:40:00.000Z"
}

201 for a new adoption. A retry for a product already adopted answers 200 with "duplicate": true and applies the prices you sent. An adoption made through the API is shared with apps from the start; a new adoption fires adoption.created (reason adopted).

Errors

HTTPCodeMeaning
404PRODUCT_NOT_FOUNDNo such product.
422NOT_COD_DROPNot published to COD Drop.
422CANNOT_ADOPT_OWNThe seller is the creator.
422COD_DROP_PRICE_MISSINGThe creator has not set a COD Drop price.
403PRODUCT_PRIVATE_NOT_ALLOWEDPrivate product, seller not in its audience.
403COD_DROP_NO_SHARED_COUNTRYThe creator and the seller have no country in common for this product.
422COUNTRY_NOT_OPENA prices country is closed to resale for this product.
422SALE_BELOW_CESSIONA sale price is lower than the COD Drop price.
409SKU_CONFLICTsellerSku already used by another adoption of the seller.
403RESELLER_BLOCKEDThe creator blocked this seller.
403COD_DROP_ACCESS_CLOSEDThe seller’s COD Drop access is closed (access).
400VALIDATION_ERRORBody shape, a number instead of a money string, a country twice in prices, neither salePrice nor prices.

Update an adoption

PUT/cod-drop/adoptions/{productId}scope cod_drop:write

Any of prices[], salePrice, sellerSku. A country not sent keeps its price. Answers 200 with the adopted product. 404 ADOPTION_NOT_FOUND when the seller has no adoption of this product or only a removed one (re-adopt with POST). Same price and SKU errors as adopting; 403 RESELLER_BLOCKED on a blocked adoption; 403 COD_DROP_ACCESS_CLOSED when the seller’s access is closed. A real change fires adoption.updated (price_changed, sku_changed).

curl -X PUT "https://coliswift.com/api/partner/v1/cod-drop/adoptions/3d4e5f6a-7b8c-4d9e-a0f1-b2c3d4e5f6a7" \
  -H "Authorization: Bearer $COLISWIFT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "prices": [
    {
      "countryCode": "MA",
      "salePrice": "159.00"
    }
  ]
}'

Give a product back

DELETE/cod-drop/adoptions/{productId}scope cod_drop:write

204 No Content. 404 NOT_ADOPTED when there is nothing to give back. The adoption is marked removed (orders already taken keep pointing at it) and you receive adoption.removed (reason removed, status: "removed"). The product leaves GET /products.

curl -X DELETE "https://coliswift.com/api/partner/v1/cod-drop/adoptions/3d4e5f6a-7b8c-4d9e-a0f1-b2c3d4e5f6a7" \
  -H "Authorization: Bearer $COLISWIFT_ACCESS_TOKEN"

The adopted product

In GET /products, GET /products/{id} and the adoption answers, an adopted product is the COD Drop product above (the creator’s id and reference — the ids resale orders name) with the seller’s own sale price:

Adopted product
{
  "id": "3d4e5f6a-7b8c-4d9e-a0f1-b2c3d4e5f6a7",
  "reference": "CRE-LAMP-02",
  "label": "Sunset lamp",
  "description": "Warm sunset light, USB powered.",
  "category": "electronics",
  "imageUrl": "https://cdn.example.com/lamp.jpg",
  "imageUrls": [
    "https://cdn.example.com/lamp.jpg"
  ],
  "countryCodes": [
    "MA"
  ],
  "pricesByCountry": [
    {
      "countryCode": "MA",
      "price": "6.0000",
      "currency": "USD"
    }
  ],
  "salePricesByCountry": [
    {
      "countryCode": "MA",
      "price": "149.0000"
    }
  ],
  "variants": [
    {
      "id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
      "label": "White",
      "sku": "CRE-LAMP-02-W"
    }
  ],
  "adopted": true,
  "createdAt": "2026-10-28T12:00:00.000Z",
  "updatedAt": "2026-11-02T09:40:00.000Z"
}
pricesByCountry[]object[]

The COD Drop price per country (countryCode, price, currency: "USD"), for each country where the seller can sell it.

salePricesByCountry[]object[]

countryCode, price — the seller’s own sale price there (local currency): the per-country price set on the adoption, else its single salePrice.

adoptedtrue

Present only on adopted products — absent on the seller’s own products.