
Security News
Axios Supply Chain Attack Reaches OpenAI macOS Signing Pipeline, Forces Certificate Rotation
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.
This is not the official Mangopay Node library.
At this time they don't have one, so we'll see what's next.
It's here for a personal use and inspired by Stripe node api wrapper.
Feel free to use & contribute
npm install mangopay
Documentation is available at http://docs.mangopay.com/api-references
Every resource is accessed via your mango instance:
var mango = require('mangopay')({
username: 'username',
password: 'passphrase',
production: false
})
// mango.{ RESOURCE_NAME }.{ METHOD_NAME }()
Every resource method accepts an optional callback as the last argument:
mango.card.create({
UserId: '2565355',
CardNumber: '4970100000000154',
CardExpirationDate: '0216',
CardCvx: '123',
}, function(err, card, res){
err;
card; // mango card object
res; // raw 'http' response object => res.statusCode === 200
})
The callback gets called with three arguments: err, data and the raw response object. In case of an error, the data and response are still passed because the MangoPay API returns data together with errors, e.g. when attempting to retrieve a failed payOut.
Methods that list items (cards, transactions, users, etc...) can paginate, filter and sort fields using a special $query parameter:
mango.user.transactions({
UserId: "123456789",
$query:{
Sort:"LastName:asc",
page:1,
per_page:100
}
},
function(err, transactions, res){
console.log('err', err);
console.log('transactions', transactions);
console.log('res', res.statusCode);
});
or alternatively you can pass a String: $query: "Sort=LastName:asc&page=1&per_page=100"
More information on the specific documentation page
Where you see params it is a plain JavaScript object, e.g. { Email: 'foo@example.com' }
Create natural user:
mango.user.create({
FirstName: "Victor" // Required
, LastName: "Hugo" // Required
, Birthday: 1300186358 // Required
, Nationality: "FR" // Required - default: 'FR'
, CountryOfResidence: "FR" // Required - default: 'FR'
, Occupation: "Writer"
, IncomeRange: "6"
, ProofOfIdentity: ""
, ProofOfAddress: ""
, PersonType: "NATURAL"
, Email: "victor@hugo.com"
, Tag: "custom tag"
, Address: {
AddressLine1: "4101 Reservoir Rd NW"
, AddressLine2: ""
, City: "Washington"
, Region: "District of Columbia"
, PostalCode: "20007"
, Country: "US"
, }
}, function(err, user, res){
console.log('err', err);
console.log('user', user);
console.log('res', res.statusCode);
});
Create natural user and wallet:
mango.user.signup({
FirstName: "Victor", // Required
LastName: "Hugo", // Required
Birthday: 1300186358, // Required
Nationality: "FR", // Required, default: 'FR'
CountryOfResidence: "FR", // Required, default: 'FR'
Address: "1 rue des Misérables, Paris",
Occupation: "Writer",
IncomeRange: "6",
ProofOfIdentity: null,
ProofOfAddress: null,
PersonType: "NATURAL",
Email: "victor@hugo.com",
Tag: "custom tag",
}, function(err, user, wallet){
console.log('err', err);
console.log('user', user);
console.log('wallet', wallet);
});
Fetch natural user:
mango.user.fetch({
Id: "123456789", // Required
}, function(err, user, res){
console.log('err', err);
console.log('user', user);
console.log('res', res.statusCode);
});
Update natural user:
mango.user.update({
Id: "123456789", // Required
// all the fields to be updated
}, function(err, user, res){
console.log('err', err);
console.log('user', user);
console.log('res', res.statusCode);
});
List natural users:
mango.user.list(function(err,users){
console.log(users);
});
Create legal user:
mango.user.createLegal({
Name: 'mycompany.com',
Email: 'info@mycompany.com',
LegalPersonType: 'BUSINESS',
LegalRepresentativeFirstName: 'John',
LegalRepresentativeLastName: 'Doe',
LegalRepresentativeEmail: 'john_doe@mycompany.es',
HeadquartersAddress: 'Canal Street, Madrid, Spain',
LegalRepresentativeAdress: 'Canal Street, Madrid, Spain',
LegalRepresentativeBirthday: moment('300681', 'DDMMYY').unix(),
LegalRepresentativeCountryOfResidence: 'ES',
LegalRepresentativeNationality: 'ES',
}, function(err, user, res){
console.log('err', err);
console.log('user', user);
console.log('res', res.statusCode);
});
Fetch legal user:
mango.user.fetchLegal({
Id: "123456789", // Required
}, function(err, user, res){
console.log('err', err);
console.log('user', user);
console.log('res', res.statusCode);
});
List all cards belonging to a user:
mango.user.cards({
UserId: "123456789", // Required
}, function(err, cards, res){
console.log('err', err);
console.log('cards', cards);
console.log('res', res.statusCode);
});
List all wallets belonging to a user:
mango.user.wallets({
UserId: "123456789", // Required
}, function(err, wallets, res){
console.log('err', err);
console.log('wallets', wallets);
console.log('res', res.statusCode);
});
List all transactions belonging to a user:
mango.user.transactions({
UserId: "123456789", // Required
}, function(err, transactions, res){
console.log('err', err);
console.log('transactions', transactions);
console.log('res', res.statusCode);
});
List all bank accounts linked to a user:
mango.user.banks({
UserId: "123456789", // Required
}, function(err, bankaccounts, res){
console.log('err', err);
console.log('bankaccounts', bankaccounts);
console.log('res', res.statusCode);
});
Create wallet for a user:
mango.wallet.create({
Owners: ["1167492"], // Required
Description: "A very cool wallet", // Required, default: 'wallet'
Currency: "EUR", // Required, default: 'EUR'
Tag: "your custom tag"
}, function(err, wallet, res){
console.log('err', err);
console.log('wallet', wallet);
console.log('res', res.statusCode);
});
Fetch wallet by id:
mango.wallet.fetch({
Id: "1167492", // Required
}, function(err, wallet, res){
console.log('err', err);
console.log('wallet', wallet);
console.log('res', res.statusCode);
});
Transfer e-money from a wallet to another wallet:
mango.wallet.transfer({
AuthorId : "1167495", // Required
DebitedFunds: {Currency : "EUR", Amount : 1000}, // Required
Fees : {Currency : "EUR", Amount : 100}, // Required, default 'EUR' and 0
DebitedWalletID : "1167496", // Required (Where the funds are held before the transfer)
CreditedWalletID : "1167504", // Required (Where the funds will be held after the transfer)
CreditedUserId : "1167502",
Tag : "DefaultTag"
}, function(err, transfer, res){
console.log('err', err);
console.log('transfer', transfer);
console.log('res', res.statusCode);
});
For a complete list of available parameters check http://docs.mangopay.com/api-references/transfers/
Fetch transfer:
mango.wallet.fetchTransfer({
Id: "1167492", // Required
}, function(err, transfer, res){
console.log('err', err);
console.log('transfer', transfer);
console.log('res', res.statusCode);
});
Fetch all transactions for a given wallet:
mango.wallet.transactions({
Id: "123456789", // Required
}, function(err, transaction, res){
console.log('err', err);
console.log('transaction', transcation);
console.log('res', res.statusCode);
});
Create refund:
mango.wallet.createRefund({
Id: "1122477", // Required (The ID of the Transfer)
AuthorId: "1167492", // Required (The user ID of the Transfer transaction’s author)
}, function(err, refund, res){
console.log('err', err);
console.log('refund', refund);
console.log('res', res.statusCode);
})
Fetch refund:
mango.wallet.fetchRefund({
Id: "1348477", // Required (The ID of the Refund)
}, function(err, refund, res){
console.log('err', err);
console.log('refund', refund);
console.log('res', res.statusCode);
})
Register a card:
mango.card.create({
UserId: '2565355',
CardNumber: '4970100000000154',
CardExpirationDate: '0216',
CardCvx: '123',
}, function(err, card, res){
err;
card; // mango card object
res; // raw 'http' response object => res.statusCode === 200
})
Init two-step card registration process:
mango.card.initRegistration({
UserId: '2565355',
Currency: "EUR"
}, function(err, registration, res){
err;
registration; // mango registration object
res; // raw 'http' response object => res.statusCode === 200
})
Fetch a registered card:
mango.card.fetch({
Id: '2565355', // Required
}, function(err, card, res){
console.log('err', err);
console.log('card', card);
console.log('res', res.statusCode);
})
Update a registered card:
The only editable parameter is Active, that can be switched from true to false and this action is irreversible.
mango.card.update({
Id: "2565355", // Required
}, function(err, card, res){
console.log('err', err);
console.log('card', card);
console.log('res', res.statusCode);
});
Register a bank account for a user:
mango.bank.create({
OwnerName: "Victor Hugo", // Required
UserId: "1345678", // Required
Type: "IBAN", // Required, Default: 'IBAN'
OwnerAddress: "1 rue des Misérables", // Required
IBAN: "FR3020041010124530725S03383", // Required
BIC: "CRLYFRPP" // Required
}, function(err, bankaccount, res){
console.log('err', err);
console.log('bankaccount', bankaccount);
console.log('res', res.statusCode);
})
Get a bank account:
mango.bank.fetch({
UserId: '2565355', // Required
BankId: '1234566', // Required
}, function(err, bankaccount, res){
console.log('err', err);
console.log('bankaccount', bankaccount);
console.log('res', res.statusCode);
})
Withdraw money from a wallet to a bank account:
mango.bank.wire({
AuthorId:"12567875", // Required
DebitedWalletId:"12449234", // Required
DebitedFunds:{ // Required
Currency:"EUR",
Amount:"1000"
},
Fees:{ // Required, Default: 'EUR', 0
Currency:"EUR",
Amount:"100"
},
BankAccountId:"12449209", // Required
BIC: "CRLYFRPP" // Required
}, function(err, wire, res){
console.log('err', err);
console.log('wire', wire);
console.log('res', res.statusCode);
})
Get wire:
mango.bank.fetchWire({
Id: '2565355', // Required
}, function(err, wire, res){
console.log('err', err);
console.log('wire', wire);
console.log('res', res.statusCode);
})
Update a registered bank account:
The only editable parameter is Active, that can be switched from true to false and this action is irreversible.
mango.bank.update({
Id: "2565355", // Required
}, function(err, bank, res){
console.log('err', err);
console.log('bank', bank);
console.log('res', res.statusCode);
});
author
create(params)document
create(params)createWithFile(params)addFile(params)fetch(params)update(params)payin
Create a direct payin by tokenized card:
mango.payin.createByToken({
AuthorId: "1167492", // Required (The user ID of the Payin transaction’s author)
CreditedUserId : "1167502", // Required (The ID of the owner of the credited wallet)
DebitedFunds: { // Required
Currency: "EUR",
Amount: 10000
},
Fees: { // Required
Currency: "EUR",
Amount: 100
},
CreditedWalletId: "1167810", // Required (The ID of the credited wallet)
CardId: "1262419", // Required
SecureMode:"DEFAULT",
SecureModeReturnURL:"https://www.mysite.com",
Tag: "payin" // Required
}, function(err, payin, res){
console.log('err', err);
console.log('payin', payin);
console.log('res', res.statusCode);
})
Create a direct payin by card:
mango.payin.createByCard({
AuthorId: "1167492", // Required (The user ID of the Payin transaction’s author)
CreditedUserId : "1167502", // Required (The ID of the owner of the credited wallet)
DebitedFunds: { // Required
Currency: "EUR",
Amount: 10000
},
DeclaredFees: { // Required
Currency: "EUR",
Amount: 100
},
CreditedWalletId: "1167810", // Required (The ID of the credited wallet)
ReturnURL:"https://www.mysite.com",
Culture: "nl",
CardType: "IDEAL", // Required
Tag: "payin" // Required
}, function(err, payin, res){
console.log('err', err);
console.log('payin', payin);
console.log('res', res.statusCode);
})
Fetch payin:
mango.payin.fetch({
Id: "1122477", // Required (The ID of the Payin)
}, function(err, payin, res){
console.log('err', err);
console.log('payin', payin);
console.log('res', res.statusCode);
})
Create refund:
mango.payin.createRefund({
Id: "1122477", // Required (The ID of the Payin)
AuthorId: "1167492", // Required (The user ID of the Payin transaction’s author)
}, function(err, refund, res){
console.log('err', err);
console.log('refund', refund);
console.log('res', res.statusCode);
})
Fetch refund:
mango.payin.fetchRefund({
Id: "1348477", // Required (The ID of the Refund)
}, function(err, refund, res){
console.log('err', err);
console.log('refund', refund);
console.log('res', res.statusCode);
})
Create a hook:
mango.hook.create({
Url: "https://my_notifications_end_point.com", // Required
EventType: "PAYIN_NORMAL_SUCCEDED", // Required
Tag: "hook"
}, function(err, hook, res){
console.log('err', err);
console.log('hook', hook);
console.log('res', res.statusCode);
})
List all hooks:
mango.hook.list(function(err, hooks, res){
console.log('err', err);
console.log('hooks', hooks);
console.log('res', res.statusCode);
})
Fetch hook:
mango.hook.fetch({
Id: "12345678"
}, function(err, hook, res){
console.log('err', err);
console.log('hook', hook);
console.log('res', res.statusCode);
})
update hook:
mango.hook.update({
Id: "12345678",
Status: "DISABLED"
}, function(err, hook, res){
console.log('err', err);
console.log('hook', hook);
console.log('res', res.statusCode);
})
To leverage Mangopay's idempotency support, you can specify an $idempotencyKey parameter:
mango.user.update({
Id: "123456789",
$idempotencyKey: "a_valid_idempotency_key"
// all the fields to be updated
}, function(err, user, res){
console.log('err', err);
console.log('user', user);
console.log('res', res.statusCode);
});
Note that the idempotency key must be between 16 and 36 characters and contain only alphanumeric characters or dashes.
npm test
don't forget to provide credentials in test/__credentials.json
FAQs
Mango API wrapper
We found that mangopay demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.

Security News
Open source is under attack because of how much value it creates. It has been the foundation of every major software innovation for the last three decades. This is not the time to walk away from it.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.