n26
Version:
Un-official node.js module for interact with your N26 (previously Number26) account
516 lines (465 loc) • 10.6 kB
JavaScript
;
const request = require('request-promise');
const api = 'https://api.tech26.de';
function errorHandler(err) {
err = err && err.error && err.error !== '' ? err.error : err;
err = err.statusCode ? err.statusCode : err;
throw err;
}
module.exports = {
auth(username, password) {
return request
.post({
url: `${api}/oauth/token`,
form: {
username,
password,
grant_type: 'password'
},
json: true,
headers: {
Authorization: 'Basic bXktdHJ1c3RlZC13ZHBDbGllbnQ6c2VjcmV0',
'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36' // eslint-disable-line max-len
}
})
.catch(errorHandler);
},
blockCard(token, cardId) {
return request
.post({
url: `${api}/api/cards/${cardId}/block`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
unblockCard(token, cardId) {
return request
.post({
url: `${api}/api/cards/${cardId}/unblock`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
checkBarzahlen(token) {
return request
.get({
url: `${api}/api/barzahlen/check`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
createTransfer(token, data) {
return request
.post({
url: `${api}/api/transactions`,
json: {
pin: String(data.pin),
transaction: {
partnerBic: data.bic,
amount: data.amount,
type: 'DT',
partnerIban: data.iban,
partnerName: data.name,
referenceText: data.reference
}
},
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
createOrUpdateMemo(token, opts) {
return request({
method: opts.meta && opts.meta.memo ? 'PUT' : 'POST',
url: `${api}/api/transactions/${opts.smartLinkId}/memo`,
json: {
memo: opts.memo
},
headers: {
Authorization: `Bearer ${token}`
}
});
},
getAccount(token) {
return request
.get({
url: `${api}/api/accounts`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getAddresses(token) {
return request
.get({
url: `${api}/api/addresses`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getBarzahlen(coords) {
return request
.get({
url: `${api}/api/barzahlen/branches`,
json: true,
qs: coords
})
.catch(errorHandler);
},
getCategories(token) {
return request
.get({
url: `${api}/api/smrt/categories`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getCard(token, cardId) {
return request
.get({
url: `${api}/api/cards/${cardId}`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getCards(token) {
return request
.get({
url: `${api}/api/v2/cards`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getCardLimits(token, cardId) {
return request
.get({
url: `${api}/api/settings/limits/${cardId}`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
setCardLimits(token, opt) {
return request
.put({
url: `${api}/api/settings/limits/${opt.cardId}`,
json: opt.limit,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getContacts(token) {
return request
.get({
url: `${api}/api/smrt/contacts`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getCSV(token, opts) {
return request
.get({
url: `${api}/api/smrt/reports/${opts.from}/${opts.to}/statements`,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getLimits(token) {
return request
.get({
url: `${api}/api/settings/account/limits`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getMe(token, options) {
const qs = {};
if (options.full) {
qs.full = options.full;
}
return request
.get({
url: `${api}/api/me`,
qs,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getStatement(token, options) {
return request
.get({
url: `${api}/api/statements/${options.pdf ? '' : 'json/'}${options.id}`,
json: !options.pdf,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getStatements(token) {
return request
.get({
url: `${api}/api/statements`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getStats(token, opt) {
return request
.get({
url: `${api}/api/accounts/stats?type=acct&from=${opt.from}&to=${
opt.to
}&numSlices=1`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getStatuses(token) {
return request
.get({
url: `${api}/api/me/statuses`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getTransactions(token, options) {
const qs = {
limit: options.limit || 50,
pending: options.pending || false
};
if (options.categories) {
qs.categories = options.categories.join(',');
}
if (options.from && options.to) {
qs.from = options.from;
qs.to = options.to;
}
if (options.text) {
qs.textFilter = options.text;
}
return request
.get({
url: `${api}/api/smrt/transactions`,
qs,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
},
getTransaction(token, opts) {
const that = this;
return request
.get({
url: `${api}/api/smrt/transactions/${opts.id}`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.then(transaction => {
if (!opts.meta) {
return transaction;
}
return that
.getTransactionMeta(token, transaction.smartLinkId)
.then(meta => {
transaction.meta = meta;
return transaction;
});
})
.catch(errorHandler);
},
getTransactionMeta(token, smartLinkId) {
return request.get({
url: `${api}/api/transactions/${smartLinkId}/metadata`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
});
},
/*
Invitations
*/
sendInvitations(token, email) {
return request.post({
url: `${api}/api/aff/invite`,
json: {
email
},
headers: {
Authorization: `Bearer ${token}`
}
});
},
getInvitations(token) {
return request.get({
url: `${api}/api/aff/invitations`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
});
},
setLimits(token, limits) {
return request.post({
url: `${api}/api/settings/account/limits`,
json: limits,
headers: {
Authorization: `Bearer ${token}`
}
});
},
/*
Pairing / unpairing
*/
unpairUpstart(token) {
return request
.post({
url: `${api}/api/unpair/uppstart`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.then(body => {
if (!body.success) {
throw body.message;
}
return body.message.replace('https://my.number26.de/unpair/', '');
})
.catch(errorHandler);
},
unpairVerify(token, unpairToken) {
return request
.post({
url: `${api}/api/unpair/verify/${unpairToken}`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.then(body => {
if (!body.success) {
throw body;
}
return body;
})
.catch(errorHandler);
},
unpairValidationPin(token, pin) {
return request
.post({
url: `${api}/api/unpair/validation/pin`,
json: {
pin
},
headers: {
Authorization: `Bearer ${token}`
}
})
.then(body => {
if (!body.success) {
throw body;
}
return body;
})
.catch(errorHandler);
},
unpairValidationCard(token, cardNumber) {
return request
.post({
url: `${api}/api/unpair/validation/card/${cardNumber}`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.then(body => {
if (!body.success) {
throw body;
}
return body;
})
.catch(errorHandler);
},
unpairValidationSms(token) {
return request
.post({
url: `${api}/api/unpair/validation/sms/send`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.then(body => {
if (!body.success) {
throw body;
}
return body;
})
.catch(errorHandler);
},
unpairValidationSmsVerify(token, smsNumber) {
return request
.post({
url: `${api}/api/unpair/validation/sms/verify/${smsNumber}`,
json: true,
headers: {
Authorization: `Bearer ${token}`
}
})
.catch(errorHandler);
}
};