Описание API работы с данными Дзен-мани.
Происходит через протокол OAuth 2.0.
Подать заявку на регистрацию можно, заполнив форму на этой странице. Заранее предупредим, что регистрируем мы только реальные проекты, удовлетворяющие протоколу OAuth 2.0 авторизации, игнорируя все остальные. После обработки вашей заявки мы вышлем вам на почту consumer_key и consumer_secret, которые вы сможете использовать вместе с введенным вами OAuth callback point url в качестве соответственно client_id, client_secret и redirect_uri протокола OAuth 2.0
Если вам нужен просто токен для работы с API Дзен-мани, то получить его вы можете без регистрации у любого из ранее зарегистрировавшегося в Дзен-мани сервиса. Например, отсюда – Zerro.app.
Основные URL авторизации:
https://api.zenmoney.ru/oauth2/authorize/
https://api.zenmoney.ru/oauth2/token/
GET /oauth2/authorize/?response_type=code&client_id=464119&redirect_uri=http%3A%2F%2Fexample.com%2Fcb%2F123 HTTP/1.1 Host: api.zenmoney.ru
После этого пользователь подтверждает выдачу прав клиенту, и происходит переадресация:
HTTP/1.1 302 Found Location: http://example.com/cb/123?code=FD0485FC
Используем полученный code для получения access_token, выполняя запрос:
POST /oauth2/token/ HTTP/1.1 Host: api.zenmoney.ru Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&client_id=464119&client_secret=deadbeef&code=FD0485FC&redirect_uri=http%3A%2F%2Fexample.com%2Fcb%2F123 HTTP/1.1 200 OK Content-Type: application/json { "access_token":"RQJpVwPJie7wr9SEzYNi5nVWVdKRTP", "token_type":"bearer", "expires_in":86400, "refresh_token":"jHCAqb9A1WGIkuk34SJm2VTg6PZY5K" }Пользовательские Системные Account Instrument Tag Company Merchant User Reminder ReminderMarker Transaction Budget
Пользовательские сущности можно создавать / изменять / удалять, системные же доступны только для чтения.
{ id: Int changed: Int // Unix timestamp title: String shortTitle: String symbol: String rate: Double }
shortTitle
- это трехбуквенный код данной валюты.symbol
- символ валюты.rate
- стоимость единицы валюты в рублях.
{ id: Int changed: Int // Unix timestamp title: String fullTitle: String www: String country: String }
Company - это банк либо другая платежная организация, в которой могут существовать счета.
{ id: Int changed: Int // Unix timestamp login: String? currency: Int -> Instrument.id parent: Int? -> User.id }
currency
- основная валюта пользователя. В ней система считает балансы и показывает пользователю отчеты.parent
- родительский пользователь семейного учета. Он является администратором и может удалять дочерних пользователей. Для родительского пользователя parent == null
.
{ id: String // UUID changed: Int // Unix timestamp user: Int -> User.id role: Int? -> User.id? instrument: Int? -> Instrument.id company: Int? -> Company.id type: ('cash' | 'ccard' | 'checking' | 'loan' | 'deposit' | 'emoney' | 'debt') title: String syncID: [String]? balance: Double? startBalance: Double? creditLimit: Double? >= 0 inBalance: Bool savings: Bool? enableCorrection: Bool enableSMS: Bool archive: Bool //Для счетов с типом отличных от 'loan' и 'deposit' в этих полях можно ставить null capitalization: Bool percent: Double >= 0 && < 100 startDate: 'yyyy-MM-dd' endDateOffset: Int endDateOffsetInterval: ('day' | 'week' | 'month' | 'year') payoffStep: Int? payoffInterval: ('month' | 'year')? }
Account - счёт пользователя.
balance
- текущий баланс счета.startBalance
- баланс счета в момент открытия. Если тип счета - кредит, то указывается тело кредита.creditLimit
- кредитный лимит в случае, если тип счета - банковская карта или банковский счет.
inBalance
- является ли счёт балансовым. Если является, то его баланс учитывается в общем балансе и в отчётах учитываются расходы и доходы по нему.savings
- является ли счёт накопительным.enableCorrection
- если true, то при распознавании SMS приложение Дзен-мани будет корректировать баланс счёта до его значения в SMS.enableSMS
- включено ли распознавание SMS по счёту.archive
- является ли счёт архивным.
syncID
- массив банковских номеров счета. Обычно берутся последние 4 цифры номера счета и последние 4 цифры номеров банковских карт, привязанных к счету.type
- тип счета: ccard
- банковская карта, checking
- банковский счет, loan
- кредит, deposit
- депозит, cash
- наличные, debt
- долги. Счет с типом debt является системным и единственным с таким типом.
При добавлении счетов типа loan
или deposit
нужно указать дополнительные параметры.
capitalization
- для депозита - есть ли капитализация процентов. Для кредита - является ли кредит аннуитетным.percent
- процентная ставка по счету (в процентах).startDate
- дата открытия депозита / кредита.endDateOffset
- срок действия кредита / депозита в промежутках endDateOffsetInterval
начиная с даты открытия.payoffInterval
- промежуток между выплатами. Может быть null, тогда считается, что выплата процентов или погашение кредита происходит в конце срока.payoffStep
- раз в сколько payoffInterval
происходят выплаты, начиная со следующей даты startDate + payoffInterval
. Если payoffInterval == null
, то значение должно быть равно 0.
{ id: String // UUID changed: Int // Unix timestamp user: Int -> User.id title: String parent: String? -> Tag.id icon: String? picture: String? color: Int? showIncome: Bool showOutcome: Bool budgetIncome: Bool budgetOutcome: Bool required: Bool? }
parent
- родительская категория. Допускается степень вложенности не больше 1, т.е. у категории может быть родительская категория, а у родительской категории уже не может быть своего родителя.showIncome
- является ли категория доходной.showOutcome
- является ли категория расходной.budgetIncome
- включена ли категория в расчёт дохода в бюджете.budgetOutcome
- включена ли категория в расчёт расхода в бюджете.required
- являются ли расходы по данной категории обязательными. Если null, то тоже считаются обязательными.icon
- id иконки категории.color
- цвет иконки категории в в виде числа. Рассчитывается по alpha, red, green, blue 0 <= 255. unsigned long color = (a << 24) + (r << 16) + (g << 8) + (b << 0).
picture
- ссылка на картинку для данной категории.
{ id: String // UUID changed: Int // Unix timestamp user: Int -> User.id title: String }
Контрагент операции. В отличие от строкового payee в операциях, Merchant отображается в списке плательщиков и получателей в приложении и по ним приложение делает подсказки.
{ id: String // UUID changed: Int // Unix timestamp user: Int -> User.id incomeInstrument: Int -> Instrument.id incomeAccount: String -> Account.id income: Double >= 0 outcomeInstrument: Int -> Instrument.id outcomeAccount: String -> Account.id outcome: Double >= 0 tag: [String -> Tag.id]? merchant: String? -> Merchant.id payee: String? comment: String? interval: ('day' | 'week' | 'month' | 'year')? step: Int? >= 0 points: [Int >= 0 && < step]? startDate: 'yyyy-MM-dd' endDate: 'yyyy-MM-dd'? notify: Bool }
Объект описывающий принцип создания планируемых операций.interval
- интервал шага. Если null, значит, планируемая без повторения.step
- шаг с которым создаются планируемые операции.points
- точки внутри шага, в которых создаются планируемые.startDate
- с какой даты создавать планируемые.endDate
- до какой даты включительно создавать планируемые. Если null, то бессрочно.notify
- уведомлять ли о данных операциях.
Пример:
{ //... interval: 'day', step: 7, points: [0, 2, 4], startDate: '2017-03-08', endDate: null //... }
Reminder с такими параметрами означает, что нужно повторять операции каждую неделю, начиная с 2017-03-08 по средам, пятницам и воскресеньям. Потому что 2017-03-08 - среда, значит точка 0 - среда, точка 2 - пятница, точка 4 - воскресенье. Каждую неделю - потому как шаг 7 дней.
{ id: String // UUID changed: Int // Unix timestamp user: Int -> User.id incomeInstrument: Int -> Instrument.id incomeAccount: String -> Account.id income: Double >= 0 outcomeInstrument: Int -> Instrument.id outcomeAccount: String -> Account.id outcome: Double >= 0 tag: [String -> Tag.id]? merchant: String? -> Merchant.id payee: String? comment: String? date: 'yyyy-MM-dd' reminder: String -> Reminder.id state: ('planned' | 'processed' | 'deleted') notify: Bool }
Планируемая операция. Поля те же, что и в Reminder, только есть еще дата операции и ее состояние.state
- состояние операции: planned
- планируемая, processed
- обработанная (внесенная, по ней была создана обычная операция Transaction), deleted
- удаленная.
{ id: String // UUID changed: Int // Unix timestamp created: Int // Unix timestamp user: Int -> User.id deleted: Bool hold: Bool? incomeInstrument: Int -> Instrument.id incomeAccount: String -> Account.id income: Double >= 0 outcomeInstrument: Int -> Instrument.id outcomeAccount: String -> Account.id outcome: Double >= 0 tag: [String -> Tag.id]? merchant: String? -> Merchant.id payee: String? originalPayee: String? comment: String? date: 'yyyy-MM-dd' mcc: Int? reminderMarker: String? -> ReminderMarker.id opIncome: Double? >= 0 opIncomeInstrument: Int? -> Instrument.id opOutcome: Double? >= 0 opOutcomeInstrument: Int? -> Instrument.id latitude: Double? >= -90 && <= 90 longitude: Double? >= -180 && <= 180 }
Денежная операция.
outcome
- снято со счета outcomeAccount
.income
- зачислено на счёт incomeAccount
.incomeInstrument
- то же самое, что и incomeAccount.instrument
иoutcomeInstrument
- то же самое, что и outcomeAccount.instrument
за исключением случая, когда этот счёт - долговой. В случае долговой операции сумма операции всегда пишется в валюте недолгового счёта, а в поле instrument стоит значение instrument недолгового счёта. Валюта же долгового счёта всегда равна user.currency
- основной валюте пользователя.
opIncomeInstrument
иopOutcomeInstrument
- непосредственная валюта операции. Допустим была операция снятия долларов с рублевого счёта. Тогда в outcome
будет сумма в рублях. А действительную сумму в долларах нужно записать в opOutcome
. Данное поле следует использовать только, когда валюта операции отличается от валюты счета.opIncome
иopOutcome
- сумма операции в непосредственной валюте операции.
Примеры:
{ //... incomeInstrument: 2, incomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7', income: 0, outcomeInstrument: 2, outcomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7', outcome: 500 //... }
'574DA4BC-9598-4124-8749-E9DF7B240AE7' - рублевый счёт
{ //... incomeInstrument: 2, incomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7', income: 0, outcomeInstrument: 2, outcomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7', outcome: 500, opOutcome: 10, opOutcomeInstrument: 1 //... }
'574DA4BC-9598-4124-8749-E9DF7B240AE7' - рублевый счёт
{ //... incomeInstrument: 1, incomeAccount: 'B8D2C203-60E7-4AFE-839E-4CFCEC3AFF3B', income: 10, outcomeInstrument: 1, outcomeAccount: 'B8D2C203-60E7-4AFE-839E-4CFCEC3AFF3B', outcome: 0 //... }
'B8D2C203-60E7-4AFE-839E-4CFCEC3AFF3B' - долларовый счёт
{ //... incomeInstrument: 1, incomeAccount: 'B8D2C203-60E7-4AFE-839E-4CFCEC3AFF3B', income: 10, outcomeInstrument: 2, outcomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7', outcome: 500 //... }
{ //... incomeInstrument: 2, incomeAccount: 'E40F1B61-F1FC-4197-81BA-2C23DF5E71AA', income: 500, outcomeInstrument: 2, outcomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7', outcome: 500, payee: 'Маша', merchant: 'D8733A65-F61D-4E5D-A39D-5AB1C6983F2A' //... }
'574DA4BC-9598-4124-8749-E9DF7B240AE7' - рублёвый счёт. 'E40F1B61-F1FC-4197-81BA-2C23DF5E71AA' - долговой счёт. Обратите внимание, что его валюта может быть вовсе не рубли.
'D8733A65-F61D-4E5D-A39D-5AB1C6983F2A' - это мерчант Маша. Его можно и не создавать, но тогда Машу не будет видно в списке получателей в приложении.
{ //... incomeInstrument: 1, incomeAccount: 'B8D2C203-60E7-4AFE-839E-4CFCEC3AFF3B', income: 30, outcomeInstrument: 1, outcomeAccount: 'E40F1B61-F1FC-4197-81BA-2C23DF5E71AA', outcome: 30, payee: 'Маша', merchant: 'D8733A65-F61D-4E5D-A39D-5AB1C6983F2A' //... }
'E40F1B61-F1FC-4197-81BA-2C23DF5E71AA' - долговой счёт. Обратите внимание, что его валютой совсем не обязательно являются доллары.
deleted
- является ли операция удаленной.reminderMarker
- планируемая операция из которой была создана данная операция.
{
changed: Int // Unix timestamp
user: Int -> User.id
tag: String? -> Tag.id | '00000000-0000-0000-0000-000000000000'
date: 'yyyy-MM-dd'
income: Double
incomeLock: Bool
outcome: Double
outcomeLock: Bool
}
date
- дата начала месяца.tag
- категория бюджета. Если null, то это бюджет по операциям без категории. Если '00000000-0000-0000-0000-000000000000', то это бюджет совокупный за месяц.incomeLock
- если true, то сумма income
задает точный доходный бюджет по данной категории. Если false, то в качестве бюджета по данной категории берется сумма income
и всех доходов по планируемым операциям в этом месяце по данной категории.income
- доходный бюджет.outcomeLock
- то же самое, что для incomeLock
.outcome
- расходный бюджет.
Удалить бюджет за данный месяц можно, если убрать lock и поставить 0 в соответствующую сумму.
Основные URL:
https://api.zenmoney.ru/v8/diff/ - Diff
https://api.zenmoney.ru/v8/suggest/ - Suggest
Основная работа с API идёт через Diff.
Скрипт синхронизации. Принимает на вход изменения на клиенте с момента последней синхронизации и отдает изменения на сервере за этот же промежуток времени. Формат обмена - Diff object.
func diff = /v8/diff/ diff(diff: DiffObject) -> DiffObject
{ currentClientTimestamp: Int //Unix timestamp serverTimestamp: Int //Unix timestamp forceFetch: [String -> Object.class]? instrument: [Instrument]? company: [Company]? user: [User]? account: [Account]? tag: [Tag]? merchant: [Merchant]? budget: [Budget]? reminder: [Reminder]? reminderMarker: [ReminderMarker]? transaction: [Transaction]? deletion: [ { id: String -> Object.id object: String -> Object.class stamp: Int user: Int } ]? }
currentClientTimestamp
- текущее время на клиенте. Используется сервером для коррекции времени. Не передается от сервера клиенту.
serverTimestamp
- метка последней синхронизации. В случае первой синхронизации клиент должен передать 0. При получении ответа от сервера клиент сохраняет serverTimestamp
из его ответа для передачи на сервер при следующем запросе.
forceFetch
- какие сущности сервер должен выдать полностью, как будто это первая синхронизация.
Далее идут объекты системные и пользовательские, которые изменились со времени последней синхронизации. При обработке запроса клиента сервер сверяет changed в объекте с changed серверной версии объекта, и если на сервере объект более новый, то он не меняется. В ответ сервер симметрично запросу клиента выдает свои изменения с времени последней синхронизации.
deletion
- информация по удаленному объекту. Некоторые объекты, например Transaction, ReminderMarker, Budget могут быть помечены удаленными полем внутри себя, но все пользовательские объекты, у которых есть id, могут быть удалены окончательно через deletion. При получении объекта deletion получившая сторона обязана удалить у себя этот объект.
Примеры:
{ currentClientTimestamp: (new Date()).getTime() / 1000, serverTimestamp: 0 }
Ответ сервера (всего лишь пример):
{ serverTimestamp: 1490016362, instrument: [ { id: 1, changed: 1490000000, title: 'Доллар США', shortTitle: 'USD', symbol: '$', rate: 57.55 }, { id: 2, title: 'Российский рубль', shortTitle: 'RUB', changed: 1490000000, symbol: 'руб.', rate: 1 } ], company: [ { id: 4624, title: 'Сбербанк России', fullTitle: null, www: 'sbrf.ru', country: 'RU' } ], user: [ { id: 1, changed: 1490000000, login: 'my_user', currency: 1, parent: null } ], account: [ { id: 'A85F1093-3886-4C99-823E-04E7202E5771', changed: 1490000000, user: 1, role: null, instrument: 1, company: null, type: 'debt', title: 'Долги', syncID: null, balance: 34.75, startBalance: 0, creditLimit: null, inBalance: false, savings: false, enableCorrection: false, enableSMS: false, archive: false, capitalization: null, percent: null, startDate: null, endDateOffset: null, endDateOffsetInterval: null, payoffStep: null, payoffInterval: null }, { id: 'C52B6A9C-5BF1-435B-9568-DAA91CE8BAF8', changed: 1490000000, user: 1, role: null, instrument: 1, company: null, type: 'cash', title: 'Доллары', syncID: null, balance: 322.5, startBalance: 22.5, creditLimit: null, inBalance: true, savings: false, enableCorrection: false, enableSMS: false, archive: false, capitalization: null, percent: null, startDate: null, endDateOffset: null, endDateOffsetInterval: null, payoffStep: null, payoffInterval: null }, { id: '1E60FC58-D639-47E3-8D7A-809586862F06', changed: 1490000000, user: 1, role: null, instrument: 2, company: null, type: 'cash', title: 'Рубли', syncID: null, balance: 4400, startBalance: 4400, creditLimit: null, inBalance: true, savings: false, enableCorrection: false, enableSMS: false, archive: false, capitalization: null, percent: null, startDate: null, endDateOffset: null, endDateOffsetInterval: null, payoffStep: null, payoffInterval: null }, { id: '0593FEF0-2618-45EB-B8DA-6BCF3B660177', changed: 1490000000, user: 1, role: null, instrument: 2, company: 4624, type: 'ccard', title: 'Кредитка Сбера', syncID: ['1240'], balance: -2500, startBalance: 4000, creditLimit: 150000, inBalance: true, savings: false, enableCorrection: true, enableSMS: true, archive: false, capitalization: null, percent: null, startDate: null, endDateOffset: null, endDateOffsetInterval: null, payoffStep: null, payoffInterval: null } ], tag: [ { id: '5114B761-4FC4-4107-A0F2-C4DF0ED9CB07', changed: 1490000000, title: 'Квартира (дом)', showIncome: false, showOutcome: true, budgetIncome: false, budgetOutcome: true }, { id: '7B8A79A6-FA48-4DE8-A820-3CCC4DDB0EB6', changed: 1490000000, title: 'Зарплата', showIncome: true, showOutcome: false, budgetIncome: true, budgetOutcome: false } ], merchant: [ { id: '202EC174-9C9D-42FE-BD55-A5D4F38D5E76', changed: 1490000000, user: 1, title: 'Паша' } ], reminder: [ { id: 'EB80C872-D9E1-48E7-B021-1C2B23BBE88F', changed: 1490010362, user: 1, incomeInstrument: 2, incomeAccount: 'A85F1093-3886-4C99-823E-04E7202E5771', income: 2000, outcomeInstrument: 2, outcomeAccount: '1E60FC58-D639-47E3-8D7A-809586862F06', outcome: 2000, tag: null, merchant: '202EC174-9C9D-42FE-BD55-A5D4F38D5E76', payee: 'Паша', comment: 'Возврат долга', interval: null, step: null, points: null, startDate: '2017-03-22' endDate: null, notify: true } ], reminderMarker: [ { id: '26AEDA53-D532-42FA-A099-EEC78741DE58', changed: 1490010362, user: 1, incomeInstrument: 2, incomeAccount: 'A85F1093-3886-4C99-823E-04E7202E5771', income: 2000, outcomeInstrument: 2, outcomeAccount: '1E60FC58-D639-47E3-8D7A-809586862F06', outcome: 2000, tag: null, merchant: '202EC174-9C9D-42FE-BD55-A5D4F38D5E76', payee: 'Паша', comment: 'Возврат долга', date: '2017-03-22', reminder: 'EB80C872-D9E1-48E7-B021-1C2B23BBE88F', state: 'planned', notify: true } ], transaction: [ { id: 'EB80C872-D9E1-48E7-B021-1C2B23BBE88F', changed: 1490010362, created: 1490010222, user: 1, deleted: false, incomeInstrument: 1, incomeAccount: 'C52B6A9C-5BF1-435B-9568-DAA91CE8BAF8', income: 300, outcomeInstrument: 1, outcomeAccount: 'C52B6A9C-5BF1-435B-9568-DAA91CE8BAF8', outcome: 0, tag: ['7B8A79A6-FA48-4DE8-A820-3CCC4DDB0EB6'], merchant: null, payee: null, originalPayee: null, comment: 'Аванс', date: '2017-03-20', mcc: null, reminderMarker: null, opIncome: null, opIncomeInstrument: null, opOutcome: null, opOutcomeInstrument: null, latitude: null, longitude: null }, { id: '8ECFEAB7-17F2-40F5-8B9B-279D2A136732', changed: 1488000309, created: 1488000309, user: 1, deleted: false, incomeInstrument: 2, incomeAccount: '0593FEF0-2618-45EB-B8DA-6BCF3B660177', income: 0, outcomeInstrument: 2, outcomeAccount: '0593FEF0-2618-45EB-B8DA-6BCF3B660177', outcome: 8500, tag: ['5114B761-4FC4-4107-A0F2-C4DF0ED9CB07'], merchant: null, payee: 'OOO Techdom', originalPayee: null, comment: 'За воду + смена счетчиков', date: '2017-03-08', mcc: null, reminderMarker: null, opIncome: null, opIncomeInstrument: null, opOutcome: null, opOutcomeInstrument: null, latitude: null, longitude: null }, { id: '8ECFEAB7-17F2-40F5-8B9B-279D2A136732', changed: 1488000309, created: 1488000309, user: 1, deleted: false, incomeInstrument: 2, incomeAccount: '0593FEF0-2618-45EB-B8DA-6BCF3B660177', income: 0, outcomeInstrument: 2, outcomeAccount: 'A85F1093-3886-4C99-823E-04E7202E5771', outcome: 2000, tag: null, merchant: '202EC174-9C9D-42FE-BD55-A5D4F38D5E76', payee: 'Паша', originalPayee: null, comment: 'Паша дал в долг до среды', date: '2017-03-20', mcc: null, reminderMarker: null, opIncome: null, opIncomeInstrument: null, opOutcome: null, opOutcomeInstrument: null, latitude: null, longitude: null } ] }
{ //... deletion: [ { id: '7DE41EB0-3C61-4DB2-BAE8-BDB2A6A46604', object: 'transaction', user: 123456, stamp: 1490008039 } ] //... }
Скрипт для подсказки категории и получателя для операции.
func suggest = /v8/suggest/ suggest(transaction: Transaction) -> Transaction suggest(transaction: [Transaction]) -> [Transaction]
Можно при вызове передавать только часть полей операции, к примеру только payee
. Тогда на выходе будет урезанный объект операции. Гарантированно возвращаются только переданные поля.
Пример:
POST /v8/suggest/ HTTP/1.1 Content-Type: application/json Authorization: Bearer AbF949beF4DC46b1 { "payee": "McDonalds" } HTTP/1.1 200 OK Content-Type: application/json { "payee": "МакДональдс", "merchant": "7BF5E890-2E2B-42FD-842A-B70B56620755", "tag": ["1B11D636-5250-4DDA-8157-3810A0319EC2"] }
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4