Экспресс-доставка Major Express
Доставометр использует официальный калькулятор Major Express и справочник городов. Ответ приходит в едином JSON-формате.
Какие данные нужны
- Названия городов отправления и получения из доступного направления.
- Вес в граммах и размеры в сантиметрах.
- Корректное сопоставление городов с официальным справочником Major.
- Положительная объявленная ценность: declared_value_kopecks. Стоимость должна быть больше нуля и не выше 100 000 000 рублей.
Что возвращает сервис
Услуга экспресс-доставки, стоимость с учётом страхования в целых копейках и сообщённые перевозчиком сроки. Код службы — major. Публичный калькулятор не уточняет способ передачи отправления: delivery_type возвращается как unknown.
Ограничения
Расчёт зависит от доступности перевозчика и поддержанных направлений. При нулевой или не переданной объявленной ценности Major возвращается в unavailable с причиной declared_value_required. Если справочник не даёт однозначного города либо калькулятор недоступен, причина также показывается в unavailable. Наличие предварительного тарифа не является подтверждением приёма отправления.
Официальная документация Major Express.
Пример запроса
Укажите carriers: ["major"], чтобы запросить только эту службу. Ключ храните на сервере.
В примере объявленная ценность 500 000 копеек (5 000 ₽) — замените её фактической стоимостью отправления. Major требует положительное значение.
cURLПример запроса
curl --fail-with-body https://api.dostavometr.ru/v1/rates \
-H "Authorization: Bearer $DOSTAVOMETR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": {
"country": "RU",
"city": "Чита",
"postal_code": "672000"
},
"to": {
"country": "RU",
"city": "Москва",
"postal_code": "101000"
},
"parcel": {
"weight_grams": 1000,
"length_cm": 30,
"width_cm": 20,
"height_cm": 15
},
"carriers": [
"major"
],
"declared_value_kopecks": 500000
}'PythonПример запроса
import json
import os
import urllib.request
payload = {
"from": {
"country": "RU",
"city": "Чита",
"postal_code": "672000"
},
"to": {
"country": "RU",
"city": "Москва",
"postal_code": "101000"
},
"parcel": {
"weight_grams": 1000,
"length_cm": 30,
"width_cm": 20,
"height_cm": 15
},
"carriers": [
"major"
],
"declared_value_kopecks": 500000
}
request = urllib.request.Request(
"https://api.dostavometr.ru/v1/rates",
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": "Bearer " + os.environ["DOSTAVOMETR_API_KEY"],
"Content-Type": "application/json",
},
)
with urllib.request.urlopen(request, timeout=30) as response:
print(json.load(response))PHPПример запроса
<?php
$key = getenv('DOSTAVOMETR_API_KEY');
if (!$key) { throw new RuntimeException('Set DOSTAVOMETR_API_KEY'); }
$ch = curl_init('https://api.dostavometr.ru/v1/rates');
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key, 'Content-Type: application/json'],
];
$payload = json_decode(<<<'JSON'
{
"from": {
"country": "RU",
"city": "Чита",
"postal_code": "672000"
},
"to": {
"country": "RU",
"city": "Москва",
"postal_code": "101000"
},
"parcel": {
"weight_grams": 1000,
"length_cm": 30,
"width_cm": 20,
"height_cm": 15
},
"carriers": [
"major"
],
"declared_value_kopecks": 500000
}
JSON, true, 512, JSON_THROW_ON_ERROR);
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = json_encode($payload, JSON_THROW_ON_ERROR);
curl_setopt_array($ch, $options);
$body = curl_exec($ch);
if ($body === false) { throw new RuntimeException(curl_error($ch)); }
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) { throw new RuntimeException($body); }
print_r(json_decode($body, true, 512, JSON_THROW_ON_ERROR));JavaScriptПример запроса
// Node.js 20+; запускайте на сервере, чтобы не раскрыть API-ключ.
const apiKey = process.env.DOSTAVOMETR_API_KEY;
if (!apiKey) throw new Error('Set DOSTAVOMETR_API_KEY');
const response = await fetch('https://api.dostavometr.ru/v1/rates', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"from": {
"country": "RU",
"city": "Чита",
"postal_code": "672000"
},
"to": {
"country": "RU",
"city": "Москва",
"postal_code": "101000"
},
"parcel": {
"weight_grams": 1000,
"length_cm": 30,
"width_cm": 20,
"height_cm": 15
},
"carriers": [
"major"
],
"declared_value_kopecks": 500000
}),
signal: AbortSignal.timeout(30000),
});
const result = await response.json();
if (!response.ok) throw new Error(JSON.stringify(result));
console.log(result);Единый результат
В каждом тарифе есть price_kopecks, days_min, days_max, delivery_type и price_type. Если перевозчик не ответил, причина находится в unavailable.
Цена ориентировочная: итоговую стоимость и возможность отправки подтверждает перевозчик.