# API Layer OpenAPI backend является источником истины. После изменения backend-контракта committed snapshot `src/shared/api/spec/openapi.json` обновляют простым копированием опубликованного документа backend, а затем регенерируют `src/shared/api/generated/schema.d.ts` командой `npm run openapi:generate`. Оба файла committed; generated файл не редактируется вручную. `npm run openapi:generate` использует committed snapshot offline. `verify` повторно генерирует types во временную директорию и сравнивает их с committed `schema.d.ts`; backend для этого не требуется, а tracked files gate не меняет. Все HTTP-вызовы используют `apiClient` и `apiQueryClient` из `src/shared/api`. Прямой `fetch` в features, pages и entities не используется. Query options берутся из `apiQueryClient`, а сохранённые cache keys и policies задаются вызывающим slice. Bearer header принадлежит только shared authenticated fetch. Auth endpoints исключены; refresh сохраняет single-flight и один retry `UNAUTHORIZED`. Не передавайте `Authorization` из query или mutation. Request и response types выводятся из generated `paths`, например: ```ts type User = paths["/api/v1/auth/me"]["get"]["responses"][200]["content"]["application/json"]; ``` Ручной domain/UI type допустим только если он отличается от transport DTO по смыслу, а не повторяет его поля.