# «Счёт табылмады» деген қате — себебі және шешімі

> invoice_not_found қатесінің төрт себебі бар: идентификатор қате, счёт басқа режимде жасалған, кілт басқа кассирге байланған немесе счёт басқа ұйымдікі. Тексеру реті.

## Қысқаша

`invoice_not_found` (HTTP 404) — «счёт жоқ» деген сөз емес, «**осы кілтке бұл счёт көрінбейді**» деген сөз. Счёт әдетте орнында тұрады, бірақ сіз оны басқа кілтпен, басқа режимде немесе басқа ұйымнан сұрап отырсыз. Тексеру реті: идентификатор → режим (`qp_test_` / `qp_live_`) → кілт байланған кассир → ұйым.

## Симптом → себеп → шешім

| Симптом | Себебі | Шешімі |
|---|---|---|
| Жаңа ғана жасалған счёт табылмайды | Жауаптағы `id` емес, басқа өріс алынған | `POST /invoices` жауабындағы `id` өрісін пайдаланыңыз |
| Кабинетте счёт көрініп тұр, API таппайды | Счёт sandbox-та жасалған, сұрау live кілтпен | Кілтті сол режимге сәйкестендіріңіз |
| Кеше істеп тұрған код бүгін 404 береді | Кілт ауыстырылған, жаңа кілт басқа кассирге байланған | Кілттің байланысын кабинеттен қараңыз |
| Бір счёт бір қызметке көрінеді, екіншісіне жоқ | Екі қызметте екі бөлек кілт, біреуі байланған | Ортақ кілт беріңіз немесе байланысты алып тастаңыз |
| `externalOrderId` бойынша іздегенде бос | Іздеу `id` бойынша жүргізілген | Тізім эндпоинтінен сүзіңіз |

## Тексеру реті

### 1. Идентификатор дұрыс па

Счёт `POST /api/v1/invoices` жауабындағы `id` өрісімен сұралады. Жиі кездесетін шатасулар:

- **`externalOrderId` мен `id` шатастырылған.** `externalOrderId` — сіздің өз тапсырыс нөміріңіз, ол webhook-та қайта келеді, бірақ `GET /invoices/{id}` соны қабылдамайды.
- **Артық бос орын немесе жаңа жол.** Кілтті де, идентификаторды да айнымалыға салғанда соңындағы `\n` байқалмай қалады.
- **Басқа ортадан көшірілген.** Тесттен өндіріске көшіп кеткен идентификатор.

Тапсырыс нөмірі бойынша іздеу керек болса, `GET /api/v1/invoices` тізімін пайдаланыңыз. Толығы: [Metadata және тапсырыс нөмірі](/kb/metadata-and-orders).

### 2. Режимі сәйкес пе

Sandbox пен live — **екі бөлек әлем**. `qp_test_…` кілтпен жасалған счёт `qp_live_…` кілтке мүлде көрінбейді, керісінше де солай.

Ең жиі кездесетін жағдай: әзірлеуші sandbox-та сынап, сосын өндіріске көшеді, ал ескі тест идентификаторлары кодта немесе тестте қалып қояды. Нәтижесі — таза 404.

Тексеру: қолданылып жатқан кілттің префиксін қараңыз. `qp_test_` — sandbox, `qp_live_` — нақты режим. Айырмашылығы: [Sandbox пен нақты режим](/kb/sandbox-vs-live).

### 3. Кілт кассирге байланған ба

Кілтті нақты бір кассирге байлауға болады. **Байланған кілттің live счёттары тек сол кассир арқылы жүреді, ол басқа кассирдің счёттарын көрмейді** — сұраған кезде 404 қайтарады.

Бұл қате емес, әдейі жасалған мінез: екі нүкте немесе екі бөлімше бір-бірінің счёттарын көрмеуі үшін.

Қашан кездеседі:

- Ұйымда бірнеше кассир бар, счёттар әртүрлі кілттермен жасалады
- Кілт кейін байланып қойылған, ал ескі счёттар басқа кассирдікі
- Есеп жинайтын қызмет байланған кілт пайдаланып, бәрін көремін деп ойлайды

Шешімі: есепке бәрін көретін, кассирге байланбаған бөлек кілт беріңіз, немесе әр қызметке өз кассирінің кілтін беріңіз. Толығы: [API кілтті кассирге байлау](/kb/api-key-connection).

### 4. Ұйым сол ма

Бір аккаунтта бірнеше ұйым болса, әр ұйымның өз кілттері бар. Басқа ұйымның счётын сұрасаңыз, 404 немесе `forbidden` келеді — счёт бар, бірақ сіздікі емес.

Тексеру: кабинетте кілт қай ұйымда жасалғанын қараңыз. Толығы: [Бір аккаунтта бірнеше ұйым](/kb/multiple-organizations).

## Бір минуттық диагностика

Дәл сол кілтпен тізімді сұраңыз:

```
GET /api/v1/invoices
X-API-Key: <дәл сол кілт>
```

| Нәтиже | Қорытынды |
|---|---|
| Тізім бос | Режим қате немесе кілт мүлде басқа ұйымдікі |
| Тізімде счёттар бар, бірақ іздегеніңіз жоқ | Кілт байланған кассир басқа, немесе идентификатор қате |
| Іздегеніңіз тізімде бар | Идентификаторды дұрыс көшірмегенсіз |
| 401 келді | Кілт мәселесі, счёт емес: [API 401 қайтарады](/kb/api-401) |

## Не істемеу керек

- **Қайталап сұрай бермеңіз.** 404 — уақытша ақау емес, қайталау көмектеспейді әрі `too_many_attempts` қатесіне әкелуі мүмкін.
- **Жаңа счёт жасай салмаңыз.** Ескісі төленіп қалса, клиент екі рет төлейді. Алдымен кабинеттен іздеңіз.
- **Кілтті жоя салмаңыз.** Ол мәселені шешпейді, бірақ істеп тұрған интеграцияларды құлатады.

## Жиі қойылатын сұрақтар

**Счёт жойылған болуы мүмкін бе?** Жоқ. Счёттар жойылмайды, олар күйін өзгертеді: `cancelled`, `expired`. Мұндай счёт `GET` арқылы бұрынғыдай ашылады.

**Кабинетте счёт көрінеді, API таппайды. Қалай болады?** Кабинетте сіз ұйымның бәрін көресіз, ал кілт байланған болса — тек өз кассирінің счёттарын. Ең жиі себебі осы.

**Сандық идентификатор бере аламын ба?** Жоқ, `id` — біздің жақтан берілетін идентификатор, оны өзгертуге болмайды. Өз нөміріңіз үшін `externalOrderId` бар.

**Webhook-та келген `id` жарай ма?** Иә, webhook-тағы `invoice.id` — дәл сол идентификатор. Егер ол 404 берсе, режим немесе кілт сәйкессіздігі деген сөз.

**Sandbox счёттарын live-ға көшіруге бола ма?** Жоқ. Sandbox деректері нақты режимге өтпейді, олар бөлек. Көшкен соң жаңа счёттар жасайсыз.
