SelSup Developers

Product reference data · API Reference

Brands

Create and find brands, map them to Ozon and 1C, manage logos, and safely merge duplicates.

9 endpoints/api/brandStableMachine-readable description ↗
{ }

Every SelSup product needs a brand. For unbranded goods, create a dedicated “No brand” record first and use its identifier in product cards.

/api/brand

Ready-to-use workflows

Ready-to-use workflows

01

Find or create a brand before creating a product

Search for the exact name first. If rows is empty, create the brand and store brandId for the product card.

  1. Call GET /api/brand/find with query and count=true.
  2. Compare name case-insensitively in your application.
  3. If no match exists, send POST /api/brand with name.
  4. Use brandId from the response when creating the product model.
02

Synchronize the directory with 1C

Keep the 1C key in oneCId and fetch pages instead of loading the whole directory in one request.

  1. Request 50–500 records at a time, sorted by BRANDID.
  2. Set count=true on the first request to receive total.
  3. Create missing records or update matches found by brandOneCId.
03

Remove a duplicate without losing product links

Merge moves product models from the duplicate to the primary brand and then deletes the duplicate. This cannot be undone.

  1. Fetch and verify both brand identifiers.
  2. Pass the primary brandId and the duplicate removeBrandId.
  3. Fetch the primary brand again and verify related products.

Data model

Fields actually returned in Brand

Logo fields appear after an image is uploaded. Shared-model fields that do not participate in this API are intentionally omitted.

Brand10 fields
brandIdinteger

Brand identifier within the current SelSup account.

read-only
namestring

Brand name. Leading and trailing spaces are removed when saved.

Required
logoUrlstring

Public URL of the current logo.

read-only
logoSizeinteger

Logo size in bytes.

read-only
logoWidthinteger

Logo width in pixels.

read-only
logoHeightinteger

Logo height in pixels.

read-only
deletedboolean

Whether the brand is archived.

ozonNamestring

Brand name in the Ozon catalog.

nullable
ozonIdinteger · int64

Brand identifier in Ozon.

nullable
oneCIdstring

External brand identifier in 1C.

nullable

Error contract

How application errors are returned

The error code is identical in every locale, while the user-facing message is translated by the server. Build application logic around error and use localMessage for display only.

error

Stable machine-readable code for integration logic.

localMessage

Display-ready message in the API token user's language.

params

Values interpolated by the server into the localized message template.

localMessage uses the lang field of the user who owns the API token. The documentation language and Accept-Language header do not change it; Russian is used when the user has no language configured.

RUUser locale is ru
{
  "error": "error_brand_already_exists",
  "localMessage": "Бренд Base уже существует",
  "params": {
    "name": "Base"
  }
}
ENUser locale is en
{
  "error": "error_brand_already_exists",
  "localMessage": "Brand Base already exists",
  "params": {
    "name": "Base"
  }
}

Endpoints

Endpoints

GET

Find brands

/api/brand/find
Token with read access

The main endpoint for lists, search, and synchronization. It returns brands from the current account and supports stable pagination.

i

total is returned only when count=true. Disable count for subsequent pages.

Query parameters

FieldTypeRequiredDescription
query string No Substring to search for in the brand name.
deleted boolean No true for archived, false for active. Omit to return both.
brandOneCId string No Exact external 1C identifier.
hasOzonId boolean No true to return only brands mapped to Ozon.
limitDefault: 50 integer No Records per page, up to 500.
pageDefault: 1 integer No Page number starting at 1.
countDefault: false boolean No Include the total number of matches in total.
sortBy stringNAME, BRANDID No NAME for brand name, BRANDID for the internal identifier.
ascendingDefault: false boolean No true for ascending, false for descending order.
curl --request GET 'https://api.selsup.ru/api/brand/find?query=Base&limit=50&page=1&count=true&sortBy=NAME&ascending=true' \
  --header 'Authorization: YOUR_API_TOKEN'

Success response

200
FieldTypeRequiredDescription
rows Brand[] Yes Brands on the current page.
Array item structure Brand
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
totalCondition: count=true integer No Total matches; present only when count=true.
page integer Yes Current page number.
hasNextPage boolean Yes true when another page is available.
{
  "rows": [
    {
      "brandId": 8124,
      "name": "Base",
      "deleted": false,
      "ozonName": "BASE"
    }
  ],
  "total": 1,
  "page": 1,
  "hasNextPage": false
}
Errors3

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

GET

List all brands

/api/brand/all
Token with read access

Returns every brand in the account, sorted by name.

i

For large directories and recurring synchronization, use /find with pagination.

curl --request GET 'https://api.selsup.ru/api/brand/all' \
  --header 'Authorization: YOUR_API_TOKEN'

Success response

200
Array item structure Brand[]
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
[
  {
    "brandId": 8124,
    "name": "Base",
    "deleted": false
  },
  {
    "brandId": 8125,
    "name": "Air",
    "deleted": false
  }
]
Errors3

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

GET

Get a brand by ID

/api/brand/{brandId}
Token with read access

Returns a brand from the current account by its internal identifier.

i

The current implementation returns an empty value for an unknown brandId instead of HTTP 404. Handle an empty response.

Path parameters

FieldTypeRequiredDescription
brandId integer Yes Brand identifier in SelSup.
curl --request GET 'https://api.selsup.ru/api/brand/8124' \
  --header 'Authorization: YOUR_API_TOKEN'

Success response

200
Object fields Brand
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
{
  "brandId": 8124,
  "name": "Base",
  "deleted": false,
  "ozonName": "BASE",
  "ozonId": 100582
}
Errors3

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

POST

Create a brand

/api/brand
Token with write access

Creates a brand in the current account. name is enough for the common case.

i

Names are compared case-insensitively; “Base” and “base” are treated as the same brand.

Request body

application/json
FieldTypeRequiredDescription
name string Yes Unique, non-empty brand name.
ozonName string No Name from the Ozon directory, when known.
ozonId integer · int64 No Ozon brand ID when cards are sent without a prior import.
oneCId string No Stable external brand key in 1C.
curl --request POST 'https://api.selsup.ru/api/brand' \
  --header 'Authorization: YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Base",
  "ozonName": "BASE",
  "ozonId": 100582,
  "oneCId": "BRAND-001"
}'

Success response

200
Object fields Brand
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
{
  "brandId": 8124,
  "name": "Base",
  "deleted": false,
  "ozonName": "BASE",
  "ozonId": 100582,
  "oneCId": "BRAND-001"
}
Errors6

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

400error_empty_brand_name
Empty brand name

name is missing, empty, or contains whitespace only.

400error_brand_already_exists
Brand already exists

The account already has a case-insensitive match. params.name contains the conflicting name.

400error_subscription_expired
Subscription expired

Pay the tariff to continue using the service. Use error_subscription_expired in integration logic.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

PUT

Update a brand

/api/brand/{brandId}
Token with write access

Replaces the editable brand fields. The ID comes from the URL; do not send brandId in JSON.

i

This is PUT, so include every value you need to preserve. Logo fields are managed by separate endpoints.

Path parameters

FieldTypeRequiredDescription
brandId integer Yes Brand to update.

Request body

application/json
FieldTypeRequiredDescription
name string Yes New unique name.
deletedDefault: false boolean No Archived status.
ozonName string No Brand name in Ozon.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No Brand identifier in 1C.
curl --request PUT 'https://api.selsup.ru/api/brand/8124' \
  --header 'Authorization: YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Base Studio",
  "deleted": false,
  "ozonName": "BASE STUDIO",
  "ozonId": 100582,
  "oneCId": "BRAND-001"
}'

Success response

200
Object fields Brand
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
{
  "brandId": 8124,
  "name": "Base Studio",
  "deleted": false,
  "ozonName": "BASE STUDIO",
  "ozonId": 100582,
  "oneCId": "BRAND-001"
}
Errors6

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

400error_empty_brand_name
Empty brand name

name is missing, empty, or contains whitespace only.

400error_brand_already_exists
Brand already exists

The account already has a case-insensitive match. params.name contains the conflicting name.

400error_subscription_expired
Subscription expired

Pay the tariff to continue using the service. Use error_subscription_expired in integration logic.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

DELETE

Delete, archive, or restore a brand

/api/brand/{brandId}
Token with write access

With deleted=true, SelSup attempts a hard delete. If references exist, it archives the brand instead. deleted=false restores it.

Path parameters

FieldTypeRequiredDescription
brandId integer Yes Brand identifier.

Query parameters

FieldTypeRequiredDescription
deleted boolean Yes true to delete or archive; false to restore.
curl --request DELETE 'https://api.selsup.ru/api/brand/8124?deleted=true' \
  --header 'Authorization: YOUR_API_TOKEN'

Success response

200
brand_has_been_removed

The brand was permanently deleted.

brand_signed_as_deleted

References prevented deletion, so the brand was archived.

brand_has_been_restore

The brand was restored from the archive.

"brand_signed_as_deleted"
Errors3

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

POST

Upload a logo

/api/brand/{brandId}/image
Token with write access

Uploads an image as multipart/form-data. An existing logo is replaced.

i

Send the binary file in file; this endpoint does not accept JSON.

Path parameters

FieldTypeRequiredDescription
brandId integer Yes Brand identifier.

Request body

multipart/form-data
FieldTypeRequiredDescription
file binary Yes Image file in a supported format.
curl --request POST 'https://api.selsup.ru/api/brand/8124/image' \
  --header 'Authorization: YOUR_API_TOKEN' \
  --form 'file=@./logo.png'

Success response

200
Object fields Brand
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
{
  "brandId": 8124,
  "name": "Base",
  "logoUrl": "https://files.selsup.ru/brand/8124.png",
  "logoSize": 18420,
  "logoWidth": 512,
  "logoHeight": 512,
  "deleted": false
}
Errors7

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

400error_brand_to_found
Logo target not found

brandId does not exist in the current account. The documentation preserves the error code exactly as returned by the API.

400error_wrong_image_format
Unsupported image

The file could not be decoded as a supported image format.

400error_max_upload_size_exceeded
File is too large

The multipart request exceeds the server upload limit.

400error_subscription_expired
Subscription expired

Pay the tariff to continue using the service. Use error_subscription_expired in integration logic.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

DELETE

Delete a logo

/api/brand/{brandId}/image
Token with write access

Deletes the logo file and resets its dimensions in the brand record.

Path parameters

FieldTypeRequiredDescription
brandId integer Yes Brand identifier.
curl --request DELETE 'https://api.selsup.ru/api/brand/8124/image' \
  --header 'Authorization: YOUR_API_TOKEN'

Success response

200
Object fields Brand
FieldTypeRequiredDescription
brandId integer No Brand identifier within the current SelSup account.
name string Yes Brand name. Leading and trailing spaces are removed when saved.
logoUrl string No Public URL of the current logo.
logoSize integer No Logo size in bytes.
logoWidth integer No Logo width in pixels.
logoHeight integer No Logo height in pixels.
deletedDefault: false boolean No Whether the brand is archived.
ozonName string No Brand name in the Ozon catalog.
ozonId integer · int64 No Brand identifier in Ozon.
oneCId string No External brand identifier in 1C.
{
  "brandId": 8124,
  "name": "Base",
  "logoSize": 0,
  "logoWidth": 0,
  "logoHeight": 0,
  "deleted": false
}
Errors7

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

400error_brand_to_found
Logo target not found

brandId does not exist in the current account. The documentation preserves the error code exactly as returned by the API.

400error_empty_brand_logo
Brand has no logo

Logo deletion was requested for a brand without a logo.

400error_cant_remove_brand_logo
Logo deletion failed

Storage could not delete the file or update the brand record.

400error_subscription_expired
Subscription expired

Pay the tariff to continue using the service. Use error_subscription_expired in integration logic.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

POST

Merge duplicates

/api/brand/{brandId}/merge/{removeBrandId}
Token with write access

Moves product models from removeBrandId to brandId, then permanently deletes removeBrandId.

i

This cannot be undone. brandId is retained; removeBrandId is the duplicate to remove.

Path parameters

FieldTypeRequiredDescription
brandId integer Yes Primary brand identifier.
removeBrandId integer Yes Duplicate brand identifier to delete.
curl --request POST 'https://api.selsup.ru/api/brand/8124/merge/9012' \
  --header 'Authorization: YOUR_API_TOKEN'

Success response

200

The response has no body.

Errors5

Application errors are normally returned as JSON with error, localMessage, and params. Branch on error; localized text may change. How application errors are returned ↑

401auth_required
Authentication required

Authorization is missing, empty, or contains an invalid token.

400error_access_denied
Insufficient permissions

The token exists, but its role cannot perform this operation.

400error_brand_not_found
Brand not found

One of the brands requested for merging does not exist in the current account.

400error_subscription_expired
Subscription expired

Pay the tariff to continue using the service. Use error_subscription_expired in integration logic.

500error_unknown
Unexpected error

Internal failure. Save the request time and contact support; do not blindly retry a mutation.

Authorization

Token for test requests

The token stays in this browser's localStorage and is sent only in the Authorization header of requests to api.selsup.ru.

Try it

Real request parameters

Live API response

Send a request to see the SelSup response.