Skip to content

ZenMoney API

Дмитрий edited this page Aug 4, 2023 · 20 revisions

ZenMoney API

Описание 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

Пользовательские сущности можно создавать / изменять / удалять, системные же доступны только для чтения.

Instrument

{
    id:         Int
    changed:    Int // Unix timestamp 
    title:      String
    shortTitle: String
    symbol:     String
    rate:       Double
}

shortTitle - это трехбуквенный код данной валюты.
symbol - символ валюты.
rate - стоимость единицы валюты в рублях.

Company

{
    id:        Int
    changed:   Int // Unix timestamp 
    title:     String
    fullTitle: String
    www:       String
    country:   String
}

Company - это банк либо другая платежная организация, в которой могут существовать счета.

User

{
    id:       Int
    changed:  Int // Unix timestamp 
    login:    String?
    currency: Int  -> Instrument.id
    parent:   Int? -> User.id
}

currency - основная валюта пользователя. В ней система считает балансы и показывает пользователю отчеты.
parent - родительский пользователь семейного учета. Он является администратором и может удалять дочерних пользователей. Для родительского пользователя parent == null.

Account

{
    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.

Tag

{
    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 - ссылка на картинку для данной категории.

Merchant

{
    id:      String // UUID
    changed: Int    // Unix timestamp 
    user:    Int  -> User.id
    title:   String
}

Контрагент операции. В отличие от строкового payee в операциях, Merchant отображается в списке плательщиков и получателей в приложении и по ним приложение делает подсказки.

Reminder

{
    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 дней.

ReminderMarker

{
    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 - удаленная.

Transaction

{
    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 - сумма операции в непосредственной валюте операции.

Примеры:

  • расход 500 рублей (instrument 2)
{
    //...
    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' - рублевый счёт

  • расход 10 $ с рублевого счёта по курсу 50 рублей за доллар
{
    //...
    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' - рублевый счёт

  • доход 10 $ (instrument 1)
{
    //...
    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' - долларовый счёт

  • перевод 500 рублей на долларовый счет по курсу 50 рублей за доллар
{
    //...
    incomeInstrument: 1,
    incomeAccount: 'B8D2C203-60E7-4AFE-839E-4CFCEC3AFF3B',
    income: 10,
    outcomeInstrument: 2,
    outcomeAccount: '574DA4BC-9598-4124-8749-E9DF7B240AE7',
    outcome: 500
    //...
}
  • дал в долг Маше 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' - это мерчант Маша. Его можно и не создавать, но тогда Машу не будет видно в списке получателей в приложении.

  • взял в долг у Маши 30 $
{
    //...
    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 - планируемая операция из которой была создана данная операция.

Budget

{
    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

Скрипт синхронизации. Принимает на вход изменения на клиенте с момента последней синхронизации и отдает изменения на сервере за этот же промежуток времени. Формат обмена - Diff object.

func diff = /v8/diff/
diff(diff: DiffObject) -> DiffObject

Diff object

{
    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
        }
    ]
}   
  • Допустим клиент полностью удалил у себя операцию с id '7DE41EB0-3C61-4DB2-BAE8-BDB2A6A46604'. Тогда он в Diff передает следующий объект deleteion:
{
    //...
    deletion: [
        {
            id: '7DE41EB0-3C61-4DB2-BAE8-BDB2A6A46604',
            object: 'transaction',
            user: 123456,
            stamp: 1490008039
        }
    ]
    //...
}

Suggest

Скрипт для подсказки категории и получателя для операции.

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"]
}