Moneyline
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/sdk

Quick 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
});
OptionTypeDefaultDescription
apiKeystringMONEYLINE_API_KEYAPI key
baseUrlstringhttps://api.moneyline.devAPI base URL
timeoutnumber60000Request timeout (ms)
maxRetriesnumber3Max 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}`);
  }
}

On this page