SDKs
Node.js / TypeScript SDK
Official Node.js SDK for the Moneyline API. Full TypeScript support with auto-complete for every method and type.
Installation
npm install @moneyline/sdk
# or
pnpm add @moneyline/sdkQuick Start
import { Moneyline } from '@moneyline/sdk';
const client = new Moneyline({ apiKey: 'ml_live_xxxxx' });
// Create a submission
const submission = await client.submissions.create({
externalId: 'acme-001',
name: 'Acme Corp',
});
// Upload a document
const doc = await client.documents.upload({
submissionId: submission.id,
file: fs.readFileSync('bank-statement.pdf'),
filename: 'bank-statement.pdf',
});
// Get analytics
const scorecard = await client.analytics.getScorecard(submission.id);
console.log(`Risk: ${scorecard.riskScore}`);Configuration
const client = new Moneyline({
apiKey: 'ml_live_xxxxx', // or MONEYLINE_API_KEY env var
baseUrl: 'https://api.moneyline.dev', // or MONEYLINE_BASE_URL
timeout: 60_000, // ms (default 60s)
maxRetries: 3, // auto-retry on 429/5xx
});| Option | Type | Default | Description |
|---|---|---|---|
apiKey | string | MONEYLINE_API_KEY | API key |
baseUrl | string | https://api.moneyline.dev | API base URL |
timeout | number | 60000 | Request timeout (ms) |
maxRetries | number | 3 | Max retries on transient errors |
Resources
Submissions
// Create
const sub = await client.submissions.create({
externalId: 'acme-001',
name: 'Acme Corp',
metadata: { source: 'broker-portal' },
});
// Retrieve
const sub = await client.submissions.retrieve('sub_xxxxx');
// Update
const sub = await client.submissions.update('sub_xxxxx', { name: 'Updated' });
// List (paginated)
const page = await client.submissions.list({ cursor: undefined, limit: 25 });
// Delete
await client.submissions.delete('sub_xxxxx');
// Start processing
await client.submissions.startWorkflow('sub_xxxxx');
// Get status
const status = await client.submissions.getStatus('sub_xxxxx');
// Enrich
await client.submissions.enrich('sub_xxxxx', { priority: 'high' });
// Find duplicates
const dupes = await client.submissions.findDuplicates('sub_xxxxx');
// CRM sync
await client.submissions.crmSync('sub_xxxxx');
// Wait for processing
const done = await client.submissions.waitForProcessing('sub_xxxxx', {
timeout: 300_000,
pollInterval: 5_000,
});Documents
// Upload
const doc = await client.documents.upload({
submissionId: 'sub_xxxxx',
file: buffer,
filename: 'statement.pdf',
});
// Retrieve
const doc = await client.documents.retrieve('doc_xxxxx');
// Delete
await client.documents.delete('doc_xxxxx');
// Get base64 content
const { data } = await client.documents.getBase64('doc_xxxxx');
// Get parsed results
const parsed = await client.documents.getParsedResults('sub_xxxxx');
// Reclassify
const doc = await client.documents.reclassify('doc_xxxxx', 'bank_statement');
// Re-parse
const doc = await client.documents.reparse('doc_xxxxx');
// Split multi-page
const docs = await client.documents.split('doc_xxxxx');
// Download all as zip
const buffer = await client.documents.downloadAll('sub_xxxxx');Transactions
// Enrich
const enriched = await client.transactions.enrich({
transactions: [
{ description: 'AMZN MKTP US*123', amount: -49.99, date: '2024-01-15' },
],
});
// Create
const txn = await client.transactions.create({
submissionId: 'sub_xxxxx',
description: 'Wire Transfer',
amount: 10000,
date: '2024-03-01',
});
// List
const txns = await client.transactions.list({ submissionId: 'sub_xxxxx' });
// Delete
await client.transactions.delete('txn_xxxxx');
// Stream enrichment
const stream = await client.transactions.streamEnrichment({ transactions: [...] });
for await (const chunk of stream) {
console.log(chunk);
}Analytics
// Scorecard
const scorecard = await client.analytics.getScorecard('sub_xxxxx');
// Request scorecard (async)
await client.analytics.requestScorecard('sub_xxxxx');
// Cashflow
const cashflow = await client.analytics.getCashflow('sub_xxxxx');
// Risk score
const risk = await client.analytics.getRiskScore('sub_xxxxx');
// Balances
const balances = await client.analytics.getBalance('sub_xxxxx');
// Bank summary
const summary = await client.analytics.getBankSummary('sub_xxxxx');
// Statistics
const stats = await client.analytics.getStatistics('sub_xxxxx');
// Anomalies
const anomalies = await client.analytics.getAnomalies('sub_xxxxx');
// Forecasts
const forecasts = await client.analytics.getForecasts('sub_xxxxx');
// Recurring transactions
const recurring = await client.analytics.getRecurring('sub_xxxxx');
// Merchant summary
const merchants = await client.analytics.getMerchantSummary('sub_xxxxx');
// Financials
const financials = await client.analytics.getFinancials('sub_xxxxx');
// Debt candidates
const debt = await client.analytics.getDebtCandidates('sub_xxxxx');
// Named dates
const dates = await client.analytics.getNamedDates('sub_xxxxx');
// Data coverage
const coverage = await client.analytics.getDataCoverage('sub_xxxxx');
// Benchmarks
const benchmarks = await client.analytics.getMetricBenchmarks('sub_xxxxx');Webhooks
// Create
const wh = await client.webhooks.create({
url: 'https://example.com/hook',
events: ['submission.completed', 'document.parsed'],
});
// Retrieve / List / Update / Delete
const wh = await client.webhooks.retrieve('wh_xxxxx');
const list = await client.webhooks.list({ limit: 25 });
await client.webhooks.update('wh_xxxxx', { url: 'https://new.com/hook' });
await client.webhooks.delete('wh_xxxxx');
// Test
await client.webhooks.test('wh_xxxxx', { eventType: 'submission.completed' });
// Deliveries
const deliveries = await client.webhooks.deliveries('wh_xxxxx');
// Event types
const events = await client.webhooks.eventTypes();Policies & Rules
const policy = await client.policies.create({ name: 'Auto-approve', rules: [...] });
const policies = await client.policies.list();
await client.policies.evaluate('sub_xxxxx');
const rule = await client.rules.create({
policyId: 'pol_xxxxx',
field: 'risk_score',
operator: 'lt',
value: 30,
action: 'approve',
});Merchants
const results = await client.merchants.search('Amazon');
const merchant = await client.merchants.retrieve('mer_xxxxx');Categories
const categories = await client.categories.list();Funders
const funder = await client.funders.retrieve('fnd_xxxxx');
const linked = await client.funders.listLinked();
const result = await client.funders.submit({
submission_id: 'sub_xxxxx',
funder_id: 'fnd_xxxxx',
});Integrations
const integration = await client.integrations.create({ type: 'plaid', name: 'Plaid' });
const link = await client.integrations.createLink('int_xxxxx');
const links = await client.integrations.listLinks('int_xxxxx');
await client.integrations.refreshLink('link_xxxxx');
await client.integrations.deleteLink('link_xxxxx');Entities
const defs = await client.entities.listDefinitions();
const entities = await client.entities.listForSubmission('sub_xxxxx');
await client.entities.bulkSaveAttributes([...]);ISO Applications
const iso = await client.isoApplications.upload({
file: buffer,
filename: 'iso-app.pdf',
submissionId: 'sub_xxxxx',
});Webhook Verification
import { verifyWebhook } from '@moneyline/sdk';
const event = verifyWebhook({
payload: req.body, // raw string or Buffer
signature: req.headers['x-moneyline-signature'],
secret: 'whsec_xxxxx',
});
console.log(event.type); // "submission.completed"Error Handling
import { MoneylineError, RateLimitError } from '@moneyline/sdk';
try {
await client.submissions.retrieve('sub_xxxxx');
} catch (e) {
if (e instanceof RateLimitError) {
console.log(`Retry after ${e.retryAfter}ms`);
} else if (e instanceof MoneylineError) {
console.log(`${e.code}: ${e.message}`);
}
}