NurCore API
API Reference

Passenger Data Correction

Корректировка имени / документа пассажира после OCI до boarding.

Correction flow — для исправления опечатки в имени или обновления документа пассажира после check-in, но до boarding. Дешевле чем full exchange, но имеет ограничения.

Когда использовать:

СценарийРешение
Опечатка "Jonh" → "John"✅ Correction (~1500 KGS)
Старый паспорт → новый паспорт (после renewal)✅ Correction
Сменил фамилию (брак)⚠️ Correction если ≤ 3 символа отличия, иначе через support авиакомпании
Заменить полностью другого пассажира❌ Это новая бронь
Изменить пол❌ Только через support (требуются легальные документы)
Изменить дату рождения❌ Требуется approval авиакомпании

Endpoints

EndpointНазначение
POST /{id}/correction/availabilityPreview — что можно изменить + расчёт fee
POST /{id}/correction/applyПрименить + списать fee

Окно correction

OCI открыт (T-24h) → coupon=OPEN

     ├─ Correction доступен  ✓
     │  (только пока coupon не COMPLETED+boarded или < 30 мин до вылета)


Boarding (T-30m) → coupon=COMPLETED


< 30 мин до вылета → Correction ЗАБЛОКИРОВАН
     (обратитесь к агенту в аэропорту)


Boarded → Correction ЗАБЛОКИРОВАН (физически на борту)

POST /{booking_id}/correction/availability

Preview — проверить что correction возможен и сколько стоит. Не изменяет данные.

curl -X POST \
  -H "X-API-Key: $SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "corrections": [
      {
        "passenger_id": "uuid",
        "changes": {
          "first_name": "John",
          "document_number": "AN9876543"
        }
      }
    ]
  }' \
  "https://api.nurcore.kg/api/v1/bookings/$BOOKING_ID/correction/availability"

Request body:

{
  "corrections": [
    {
      "passenger_id": "uuid",
      "changes": {"first_name": "John"}
    }
  ]
}
ПолеОписание
corrections[]Один или несколько patches (1-9, на каждого пассажира свой patch)
passenger_idUUID пассажира из этой брони
changesdict: {field: new_value}

Response 200 — allowed:

{
  "allowed": true,
  "total_fee": 3000,
  "currency": "KGS",
  "items": [
    {
      "passenger_id": "uuid",
      "passenger_name": "Jonh Doe",
      "changes": [
        {"field": "first_name", "old": "Jonh", "new": "John", "fee": 1500},
        {"field": "document_number", "old": "AN1234567", "new": "AN9876543", "fee": 1500}
      ],
      "subtotal": 3000
    }
  ],
  "minutes_to_departure": 180
}

Response 200 — blocked:

{
  "allowed": false,
  "blocked_reason": "first_name: слишком сильно отличается от текущего значения (correction для исправления опечатки)",
  "total_fee": 0,
  "currency": "KGS"
}

Errors:

CodeСценарий
400Бронь CANCELLED/EXPIRED, пассажир boarded, < 30 мин до вылета
400Поле в списке RESTRICTED (gender, date_of_birth, passenger_type)
400passenger_id не принадлежит брони
404Бронь не найдена

POST /{booking_id}/correction/apply

Применить correction + списать fee.

curl -X POST \
  -H "X-API-Key: $SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "corrections": [
      {
        "passenger_id": "uuid",
        "changes": {"first_name": "John"}
      }
    ],
    "pay_with_balance": false
  }' \
  "https://api.nurcore.kg/api/v1/bookings/$BOOKING_ID/correction/apply"

Request body: identical to /availability плюс:

ПолеОписание
pay_with_balancetrue → списать с partner wallet (B2B). false → вернуть payment_url для отдельной оплаты

Response 200:

{
  "applied": true,
  "total_fee": 1500,
  "currency": "KGS",
  "payment_required": true,
  "payment_url": "/booking/correction-pay?bid=uuid&amount=1500",
  "applied_changes": [
    {"passenger_id": "uuid", "field": "first_name", "old": "Jonh", "new": "John", "fee": 1500}
  ]
}

Семантика:

  • applied: true — данные пассажира обновлены в БД немедленно
  • payment_required — если true, fee ещё не списан. UI редиректит на payment_url для оплаты
  • payment_required: false — fee автоматически списан (free correction или pay_with_balance)

Важно: correction применяется до payment. Если пассажир не оплатит — fee останется как debt на брони (Sprint 4 feature). Для MVP — оплата на доверии.


Поля и их fee

FieldFee (KGS)Constraints
first_name15001-50 символов, Levenshtein ≤ 3 vs текущее
last_name15001-50 символов, Levenshtein ≤ 3 vs текущее
middle_name01-50 символов (если задан)
document_number1500[A-Z0-9\-\s]+
document_expiry1500ISO 8601, не в прошлом
document_type1500passport / id_card / birth_certificate / driver_license
nationality0ISO 3-letter код

Restricted (нельзя через correction):

  • gender — только через support авиакомпании
  • date_of_birth — требуется approval авиакомпании (легальные документы)
  • passenger_type — exchange (adult ↔ child переход)

BCBP reissue после correction

Если у пассажира уже выпущен boarding pass, после correction его нужно перевыпустить. Текущая реализация:

  • ⚠️ Не делается автоматически — агент в аэропорту вручную выпускает новый BP
  • Sprint 4: интеграция с check-in service для авто-перевыпуска

В UI рекомендуется показать пассажиру предупреждение:

«После изменения данных нужно перевыпустить посадочный талон. Подойдите к стойке регистрации или kiosk».


Примеры use cases

Опечатка в имени

# 1. Preview
curl -X POST .../correction/availability \
  -d '{"corrections":[{"passenger_id":"u1","changes":{"first_name":"John"}}]}'
# → total_fee: 1500

# 2. Apply
curl -X POST .../correction/apply \
  -d '{"corrections":[{"passenger_id":"u1","changes":{"first_name":"John"}}]}'
# → applied: true, payment_required: true, payment_url: ...

Новый паспорт (renewal)

curl -X POST .../correction/apply \
  -d '{
    "corrections": [{
      "passenger_id": "u1",
      "changes": {
        "document_number": "AN9876543",
        "document_expiry": "2036-05-01"
      }
    }]
  }'
# → fee: 1500 (один charge даже за 2 поля document_*)

Бесплатная correction (middle_name + nationality)

curl -X POST .../correction/apply \
  -d '{
    "corrections": [{
      "passenger_id": "u1",
      "changes": {
        "middle_name": "Andreyevich",
        "nationality": "KGZ"
      }
    }]
  }'
# → fee: 0, payment_required: false

Errors

CodeСценарий
400Окно correction закрыто (boarded / < 30 мин / cancelled)
400Validation: недопустимое поле / формат / Levenshtein > 3
400Нет изменений (changes пустой или равен текущим значениям)
401Нет auth (требуется API key)
404Бронь не найдена

Связанные документы

On this page