From 153f41faa1d4e2cbda653bbb7d235bc59d696149 Mon Sep 17 00:00:00 2001 From: Demian Parkhomenko <95881717+DemianParkhomenko@users.noreply.github.com> Date: Fri, 10 May 2024 12:09:30 +0300 Subject: [PATCH] Add personal API --- examples/personal.ts | 6 + generated/personal.d.ts | 346 +++++++++++++++++++++++++++++++++++++++ generated/personal.yaml | 351 ++++++++++++++++++++++++++++++++++++++++ package.json | 5 +- src/index.ts | 16 +- 5 files changed, 716 insertions(+), 8 deletions(-) create mode 100644 examples/personal.ts create mode 100644 generated/personal.d.ts create mode 100644 generated/personal.yaml diff --git a/examples/personal.ts b/examples/personal.ts new file mode 100644 index 0000000..8d27157 --- /dev/null +++ b/examples/personal.ts @@ -0,0 +1,6 @@ +import { createClientMonoPersonal } from '../lib'; + +const client = createClientMonoPersonal(); + +const { data, response } = await client.GET('/bank/currency'); +console.log(data, response.status, response.statusText); diff --git a/generated/personal.d.ts b/generated/personal.d.ts new file mode 100644 index 0000000..f2adf1a --- /dev/null +++ b/generated/personal.d.ts @@ -0,0 +1,346 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + + +export interface paths { + "/bank/currency": { + /** + * Отримання курсів валют + * @description Отримати базовий перелік курсів валют monobank. Інформація кешується та оновлюється не частіше 1 разу на 5 хвилин. + */ + get: { + responses: { + /** @description Інформація про курс валют */ + 200: { + content: { + "application/json": components["schemas"]["CurrencyInfo"]; + }; + }; + }; + }; + }; + "/personal/client-info": { + /** + * Інформація про клієнта + * @description Отримання інформації про клієнта та переліку його рахунків. Обмеження на використання функції не частіше ніж 1 раз у 60 секунд. + */ + get: { + parameters: { + header: { + /** + * @description Token для особистого доступу до API + * @example u3AulkpZFI1lIuGsik6vuPsVWqN7GoWs6o_MO2sdf301 + */ + "X-Token": string; + }; + }; + responses: { + /** @description Statement list */ + 200: { + content: { + "application/json": components["schemas"]["UserInfo"]; + }; + }; + }; + }; + }; + "/personal/webhook": { + /** + * Встановлення WebHook + * @description Встановлення URL користувача: + * - Для підтвердження коректності наданої адреси, на неї надсилається GET-запит. Сервер має відповісти строго HTTP статус-кодом 200, і ніяким іншим. Якщо валідацію пройдено, на задану адресу починають надсилатися POST запити з подіями. + * - Події надсилаються у наступному вигляді: POST запит на задану адресу у форматі `{type:"StatementItem", data:{account:"...", statementItem:{#StatementItem}}}`. Якщо сервіс користувача не відповість протягом 5с на команду, сервіс повторить спробу ще через 60 та 600 секунд. Якщо на третью спробу відповідь отримана не буде, функція буде вимкнута. Відповідь сервера має строго містити HTTP статус-код 200. + */ + post: { + parameters: { + header: { + /** @description Token для особистого доступу до API */ + "X-Token": string; + }; + }; + /** @description Optional description in *Markdown* */ + requestBody: { + content: { + "application/json": components["schemas"]["SetWebHook"]; + }; + }; + responses: { + /** @description ok */ + 200: { + content: never; + }; + }; + }; + }; + "/personal/statement/{account}/{from}/{to}": { + /** + * Виписка + * @description Отримання виписки за час від {from} до {to} часу в секундах в форматі Unix time Максимальний час за який можливо отримувати виписку 31 доба + 1 година (2682000 секунд) Обмеження на використання функції не частіше ніж 1 раз у 60 секунд. + */ + get: { + parameters: { + header: { + /** @description Token для особистого доступу до API */ + "X-Token": string; + }; + path: { + /** @description Ідентифікатор рахунку з переліку Statement list або 0 - дефолтний рахунок. */ + account: string; + /** + * @description Початок часу виписки. + * @example 1546304461 + */ + from: string; + /** + * @description Останній час виписки (якщо відсутній, буде використовуватись поточний час). + * @example 1546306461 + */ + to: string; + }; + }; + responses: { + /** @description Statement list */ + 200: { + content: { + "application/json": components["schemas"]["StatementItems"]; + }; + }; + }; + }; + }; +} + +export type webhooks = Record; + +export interface components { + schemas: { + /** @description URL для надсиляння подій по зміні балансу рахунку */ + SetWebHook: { + /** @example https://mysomesite.copm/some_random_data_for_security */ + webHookUrl?: string; + }; + /** @description Опис клієнта та його рахунків. */ + UserInfo: { + /** + * @description Ідентифікатор клієнта (зівпадає з id для send.monobank.ua) + * @example 3MSaMMtczs + */ + clientId?: string; + /** + * @description Ім'я клієнта + * @example Мазепа Іван + */ + name?: string; + /** + * @description URL для надсиляння подій по зміні балансу рахунку + * @example https://mysomesite.copm/some_random_data_for_security + */ + webHookUrl?: string; + /** + * @description Перелік прав, які які надає сервіс (1 літера на 1 permission). + * @example psf + */ + permissions?: string; + /** @description Перелік доступних рахунків */ + accounts?: ({ + /** + * @description Ідентифікатор рахунку + * @example kKGVoZuHWzqVoZuH + */ + id?: string; + /** + * @description Ідентифікатор для сервісу https://send.monobank.ua/{sendId} + * @example uHWzqVoZuH + */ + sendId?: string; + /** + * Format: int64 + * @description Баланс рахунку в мінімальних одиницях валюти (копійках, центах) + * @example 10000000 + */ + balance?: number; + /** + * Format: int64 + * @description Кредитний ліміт + * @example 10000000 + */ + creditLimit?: number; + /** + * @description Тип рахунку + * @example black + * @enum {string} + */ + type?: "black" | "white" | "platinum" | "iron" | "fop" | "yellow" | "eAid"; + /** + * Format: int32 + * @description Код валюти рахунку відповідно ISO 4217 + * @example 980 + */ + currencyCode?: number; + /** + * @description Тип кешбеку який нараховується на рахунок + * @example UAH + * @enum {string} + */ + cashbackType?: "None" | "UAH" | "Miles"; + /** + * @description Перелік замаскованних номерів карт (більше одного може бути у преміальних карт) + * @example [ + * "537541******1234" + * ] + */ + maskedPan?: unknown[]; + /** + * @description IBAN рахунку + * @example UA733220010000026201234567890 + */ + iban?: string; + })[]; + }; + /** @description Перелік транзакцій за вказанний час */ + StatementItems: { + /** + * @description Унікальний id транзакції + * @example ZuHWzqkKGVo= + */ + id?: string; + /** + * Format: int64 + * @description Час транзакції в секундах в форматі Unix time + * @example 1554466347 + */ + time?: number; + /** + * @description Опис транзакцій + * @example Покупка щастя + */ + description?: string; + /** + * Format: int32 + * @description Код типу транзакції (Merchant Category Code), відповідно ISO 18245 + * @example 7997 + */ + mcc?: number; + /** + * Format: int32 + * @description Оригінальний код типу транзакції (Merchant Category Code), відповідно ISO 18245 + * @example 7997 + */ + originalMcc?: number; + /** + * @description Статус блокування суми (детальніше у [wiki](https://en.wikipedia.org/wiki/Authorization_hold)) + * @example false + */ + hold?: boolean; + /** + * Format: int64 + * @description Сума у валюті рахунку в мінімальних одиницях валюти (копійках, центах) + * @example -95000 + */ + amount?: number; + /** + * Format: int64 + * @description Сума у валюті транзакції в мінімальних одиницях валюти (копійках, центах) + * @example -95000 + */ + operationAmount?: number; + /** + * Format: int32 + * @description Код валюти рахунку відповідно ISO 4217 + * @example 980 + */ + currencyCode?: number; + /** + * Format: int64 + * @description Розмір комісії в мінімальних одиницях валюти (копійках, центах) + * @example 0 + */ + commissionRate?: number; + /** + * Format: int64 + * @description Розмір кешбеку в мінімальних одиницях валюти (копійках, центах) + * @example 19000 + */ + cashbackAmount?: number; + /** + * Format: int64 + * @description Баланс рахунку в мінімальних одиницях валюти (копійках, центах) + * @example 10050000 + */ + balance?: number; + /** + * @description Коментар до переказу, уведений користувачем. Якщо не вказаний, поле буде відсутнім + * @example За каву + */ + comment?: string; + /** + * @description Номер квитанции для check.gov.ua. Поле може бути відсутнім + * @example XXXX-XXXX-XXXX-XXXX + */ + receiptId?: string; + /** + * @description ЄДРПОУ контрагента, присутній лише для елементів виписки рахунків ФОП + * @example 3096889974 + */ + counterEdrpou?: string; + /** + * @description IBAN контрагента, присутній лише для елементів виписки рахунків ФОП + * @example UA898999980000355639201001404 + */ + counterIban?: string; + }[]; + /** @description Перелік курсів. Кожна валютна пара може мати одне і більше полів з rateSell, rateBuy, rateCross. */ + CurrencyInfo: { + /** + * Format: int32 + * @description Код валюти рахунку відповідно ISO 4217 + * @example 840 + */ + currencyCodeA?: number; + /** + * Format: int32 + * @description Код валюти рахунку відповідно ISO 4217 + * @example 980 + */ + currencyCodeB?: number; + /** + * Format: int64 + * @description Час курсу в секундах в форматі Unix time + * @example 1552392228 + */ + date?: number; + /** + * Format: float + * @example 27 + */ + rateSell?: number; + /** + * Format: float + * @example 27.2 + */ + rateBuy?: number; + /** + * Format: float + * @example 27.1 + */ + rateCross?: number; + }[]; + Error: { + /** @description Текст помилки для кінцевого користувача, для автоматичного оброблення потрібно аналізувати HTTP код відповіді (200, 404, 429 та інші) */ + errorDescription?: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} + +export type $defs = Record; + +export type external = Record; + +export type operations = Record; diff --git a/generated/personal.yaml b/generated/personal.yaml new file mode 100644 index 0000000..87296ec --- /dev/null +++ b/generated/personal.yaml @@ -0,0 +1,351 @@ +openapi: 3.0.3 +servers: + - url: https://api.monobank.ua +info: + title: Monobank open API + version: v2112 + description: API для отримання інформації про виписки та стан особистого рахунку. + Для надання доступу потрібно пройти авторизацію у особистому кабінеті https://api.monobank.ua/ + та отримати токен для персонального використання. + + + Якщо у вас є запитання щодо роботи API, запрошуємо до ком'юніті у + [Telegram-групі](https://t.me/joinchat/FiAEWhDf-QzTqM4wzEtffw). + + API недоступне для клієнтів до 16 років, дані за дитячими рахунами доступні з батьківського акаунту. + + Якщо у вас є сервіс і ви хочете централізовано приєднатися до API для надання послуг клієнтам, + потрібно підключитися до [корпоративного API](/docs/corporate.html), що має більше можливостей. + Якщо дані клієнтів не будуть надходити на ваші сервери або ви робите сервіс для своєї родини, + використання корпоративного API необов'язкове. Розробка бібліотек або програм, які будуть + використовувати клієнти особисто (дані клієнта не будуть проходити черeз вузли розробника), + також не потребують використання корпоративного API. + + + Це надасть змогу клієнтам monobank авторизуватись у вашому сервісі (наприклад, у фінансовому менеджері) + для надання інформації про стан рахунку або виписки. + + + У разі виявлення експлуатації цього API в якості корпоративного, банк залишає за собою право накласти санкції на компанію. + x-logo: + url: 'logo.png' + altText: logo +paths: + /bank/currency: + get: + tags: + - Публічні дані + summary: Отримання курсів валют + description: + Отримати базовий перелік курсів валют monobank. Інформація кешується та оновлюється не частіше 1 разу на 5 хвилин. + responses: + 200: + description: Інформація про курс валют + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyInfo' + + /personal/client-info: + get: + tags: + - Клієнтські персональні дані + summary: Інформація про клієнта + description: Отримання інформації про клієнта та переліку його рахунків. Обмеження на використання функції не частіше ніж 1 раз у 60 секунд. + parameters: + - name: X-Token + in: header + schema: + type: string + required: true + example: "u3AulkpZFI1lIuGsik6vuPsVWqN7GoWs6o_MO2sdf301" + description: Token для особистого доступу до API + + responses: + 200: + description: Statement list + content: + application/json: + schema: + $ref: '#/components/schemas/UserInfo' + + /personal/webhook: + post: + tags: + - Клієнтські персональні дані + summary: Встановлення WebHook + description: + 'Встановлення URL користувача: + + - Для підтвердження коректності наданої адреси, на неї надсилається GET-запит. + Сервер має відповісти строго HTTP статус-кодом 200, і ніяким іншим. + Якщо валідацію пройдено, на задану адресу починають надсилатися POST запити з подіями. + + - Події надсилаються у наступному вигляді: POST запит на задану адресу у форматі + `{type:"StatementItem", data:{account:"...", statementItem:{#StatementItem}}}`. + Якщо сервіс користувача не відповість протягом 5с на команду, сервіс повторить + спробу ще через 60 та 600 секунд. Якщо на третью спробу відповідь + отримана не буде, функція буде вимкнута. Відповідь сервера має строго містити + HTTP статус-код 200.' + requestBody: + description: Optional description in *Markdown* + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SetWebHook' + parameters: + - name: X-Token + in: header + schema: + type: string + required: true + description: Token для особистого доступу до API + responses: + 200: + description: ok + + /personal/statement/{account}/{from}/{to}: + get: + tags: + - Клієнтські персональні дані + summary: Виписка + description: Отримання виписки за час від {from} до {to} часу в секундах в форматі Unix time + Максимальний час за який можливо отримувати виписку 31 доба + 1 година (2682000 секунд) + Обмеження на використання функції не частіше ніж 1 раз у 60 секунд. + parameters: + - name: X-Token + in: header + schema: + type: string + required: true + description: Token для особистого доступу до API + - name: account + in: path + schema: + type: string + required: true + description: Ідентифікатор рахунку з переліку Statement list або 0 - дефолтний рахунок. + - name: from + in: path + schema: + type: string + required: true + example: "1546304461" + description: Початок часу виписки. + - name: to + in: path + schema: + type: string + required: false + example: "1546306461" + description: Останній час виписки (якщо відсутній, буде використовуватись поточний час). + responses: + 200: + description: Statement list + content: + application/json: + schema: + $ref: '#/components/schemas/StatementItems' +components: + schemas: + SetWebHook: + type: object + description: URL для надсиляння подій по зміні балансу рахунку + properties: + webHookUrl: + example: "https://mysomesite.copm/some_random_data_for_security" + type: string + UserInfo: + type: object + description: Опис клієнта та його рахунків. + properties: + clientId: + description: Ідентифікатор клієнта (зівпадає з id для send.monobank.ua) + type: string + example: 3MSaMMtczs + name: + description: Ім'я клієнта + type: string + example: Мазепа Іван + webHookUrl: + description: URL для надсиляння подій по зміні балансу рахунку + type: string + example: https://mysomesite.copm/some_random_data_for_security + permissions: + description: Перелік прав, які які надає сервіс (1 літера на 1 permission). + type: string + example: "psf" + accounts: + type: array + description: Перелік доступних рахунків + items: + type: object + properties: + id: + type: string + description: Ідентифікатор рахунку + example: kKGVoZuHWzqVoZuH + sendId: + type: string + description: Ідентифікатор для сервісу https://send.monobank.ua/{sendId} + example: uHWzqVoZuH + balance: + type: number + format: int64 + description: Баланс рахунку в мінімальних одиницях валюти (копійках, центах) + example: 10000000 + creditLimit: + type: number + format: int64 + description: Кредитний ліміт + example: 10000000 + type: + type: string + description: Тип рахунку + enum: [black, white, platinum, iron, fop, yellow, eAid] + example: black + currencyCode: + type: number + format: int32 + description: Код валюти рахунку відповідно ISO 4217 + example: 980 + cashbackType: + type: string + description: Тип кешбеку який нараховується на рахунок + enum: [None, UAH, Miles] + example: UAH + maskedPan: + type: array + description: Перелік замаскованних номерів карт (більше одного може бути у преміальних карт) + example: ["537541******1234"] + iban: + type: string + description: IBAN рахунку + example: UA733220010000026201234567890 + StatementItems: + type: array + description: Перелік транзакцій за вказанний час + items: + type: object + properties: + id: + type: string + example: ZuHWzqkKGVo= + description: Унікальний id транзакції + time: + type: number + format: int64 + example: 1554466347 + description: Час транзакції в секундах в форматі Unix time + description: + type: string + example: Покупка щастя + description: Опис транзакцій + mcc: + type: number + format: int32 + example: 7997 + description: Код типу транзакції (Merchant Category Code), відповідно ISO 18245 + originalMcc: + type: number + format: int32 + example: 7997 + description: Оригінальний код типу транзакції (Merchant Category Code), відповідно ISO 18245 + hold: + type: boolean + example: false + description: Статус блокування суми (детальніше у [wiki](https://en.wikipedia.org/wiki/Authorization_hold)) + amount: + type: number + format: int64 + example: -95000 + description: Сума у валюті рахунку в мінімальних одиницях валюти (копійках, центах) + operationAmount: + type: number + format: int64 + example: -95000 + description: Сума у валюті транзакції в мінімальних одиницях валюти (копійках, центах) + currencyCode: + type: number + format: int32 + example: 980 + description: Код валюти рахунку відповідно ISO 4217 + commissionRate: + type: number + format: int64 + example: 0 + description: Розмір комісії в мінімальних одиницях валюти (копійках, центах) + cashbackAmount: + type: number + format: int64 + example: 19000 + description: Розмір кешбеку в мінімальних одиницях валюти (копійках, центах) + balance: + type: number + format: int64 + example: 10050000 + description: Баланс рахунку в мінімальних одиницях валюти (копійках, центах) + comment: + type: string + example: За каву + description: Коментар до переказу, уведений користувачем. Якщо не вказаний, поле буде відсутнім + receiptId: + type: string + example: XXXX-XXXX-XXXX-XXXX + description: Номер квитанции для check.gov.ua. Поле може бути відсутнім + counterEdrpou: + type: string + example: "3096889974" + description: ЄДРПОУ контрагента, присутній лише для елементів виписки рахунків ФОП + counterIban: + type: string + example: UA898999980000355639201001404 + description: IBAN контрагента, присутній лише для елементів виписки рахунків ФОП + + CurrencyInfo: + type: array + description: Перелік курсів. Кожна валютна пара може мати одне і більше полів з rateSell, rateBuy, rateCross. + items: + type: object + properties: + currencyCodeA: + type: number + format: int32 + example: 840 + description: Код валюти рахунку відповідно ISO 4217 + currencyCodeB: + type: number + format: int32 + example: 980 + description: Код валюти рахунку відповідно ISO 4217 + date: + type: number + format: int64 + example: 1552392228 + description: Час курсу в секундах в форматі Unix time + rateSell: + type: number + format: float + example: 27.0 + rateBuy: + type: number + format: float + example: 27.2 + rateCross: + type: number + format: float + example: 27.1 + Error: + type: object + properties: + errorDescription: + type: string + description: Текст помилки для кінцевого користувача, для автоматичного + оброблення потрібно аналізувати HTTP код відповіді (200, 404, 429 та інші) + +tags: + - name: Публічні дані + description: Загальна інформація що надається без авторизації. + - name: Клієнтські персональні дані + description: Інформація, що надається тільки за наявстю token-а доступу, який клієнт може отримати в особистому кабінеті https://api.monobank.ua/ diff --git a/package.json b/package.json index d7e9a86..7a3773c 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,10 @@ "scripts": { "build": "tsc", "test": "echo \"Error: no test specified\"", - "examples": "npx tsx ./examples/acquiring.ts" + "examples:acquiring": "npx tsx ./examples/acquiring.ts", + "examples:personal": "npx tsx ./examples/personal.ts" }, "type": "module", "types": "lib/index.d.ts", - "version": "2.1.1" + "version": "2.2.0" } diff --git a/src/index.ts b/src/index.ts index 9362781..ad0cb75 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,17 @@ import createClient from 'openapi-fetch'; import type { paths as pathsAcquiring } from '../generated/acquiring.js'; +import type { paths as pathsPersonal } from '../generated/personal.js'; export type ClientOptions = Parameters[0]; -export const createClientMonoAcquiring = (clientOptions: ClientOptions) => { - return createClient({ - baseUrl: 'https://api.monobank.ua', - ...clientOptions, - }); -}; +const baseUrl = 'https://api.monobank.ua'; + +export const createClientMonoAcquiring = (clientOptions: ClientOptions = {}) => + createClient({ baseUrl, ...clientOptions }); export type * as ApiMonoAcquiring from '../generated/acquiring.js'; + +export const createClientMonoPersonal = (clientOptions: ClientOptions = {}) => + createClient({ baseUrl, ...clientOptions }); + +export type * as ApiMonoPersonal from '../generated/personal.js';