Client Libraries

SDKs & Libraries

Official client libraries for the MCE platform. Fully typed, well-documented, and designed to get you from zero to first API call in minutes.

@mesocrats/mce-sdk

v1.0.0

Package

@mesocrats/mce-sdk

License

MIT

TypeScript

Full types included

Node.js

>= 18.0.0

Installation

npm
bash
npm install @mesocrats/mce-sdk
yarn
bash
yarn add @mesocrats/mce-sdk
pnpm
bash
pnpm add @mesocrats/mce-sdk

Quick Start

Initialize the client
typescript
import { MesocraticClient } from "@mesocrats/mce-sdk";
const mce = new MesocraticClient({
apiKey: process.env.MCE_API_KEY,
// baseUrl: "https://api.mesocrats.org" (default)
// sandbox: true (uses test data, no real filings)
});

Usage Examples

List contributions
typescript
1// List itemized contributions for Q1 2026
2const contributions = await mce.contributions.list({
3 year: 2026,
4 period: "Q1",
5 itemized: true,
6 limit: 50,
7});
8
9for (const c of contributions.data) {
10 const dollars = (c.amount_cents / 100).toFixed(2);
11 console.log(
12 c.contributor_name,
13 "-- $" + dollars,
14 c.itemized ? "(itemized)" : "(unitemized)"
15 );
16}
17
18// Paginate through all results
19if (contributions.has_more) {
20 const nextPage = await mce.contributions.list({
21 year: 2026,
22 period: "Q1",
23 cursor: contributions.next_cursor,
24 });
25}
Generate a report
typescript
1// Generate FEC Form 3X for Q1 2026
2const report = await mce.reports.generate({
3 year: 2026,
4 period: "Q1",
5 format: "json",
6 cashOnHandStart: 1500000, // $15,000.00
7});
8
9console.log("Total receipts:", report.summary.totalReceiptsCents);
10console.log("Schedule A entries:", report.scheduleA.length);
11console.log("Warnings:", report.warnings.length);
12
13// Download the .fec electronic filing
14const fecFile = await mce.reports.generate({
15 year: 2026,
16 period: "Q1",
17 format: "fec",
18});
19
20await fs.writeFile("./filings/mnc_q1_2026.fec", fecFile);
21
22// Generate IRS Form 8872 XML
23const xml = await mce.reports.generate({
24 year: 2026,
25 period: "Q1",
26 format: "8872xml",
27 filingType: "InitalReport",
28});
29
30await fs.writeFile("./filings/form8872_q1_2026.xml", xml);
Record a disbursement
typescript
1// Record a disbursement
2const disbursement = await mce.disbursements.create({
3 payee_name: "Capitol Printing Co.",
4 amount_cents: 125000, // $1,250.00
5 date: "2026-02-10",
6 purpose: "Printing and mailing -- Q1 fundraising letters",
7 category: "operating",
8 payee_address_line1: "900 E Broad St",
9 payee_address_city: "Richmond",
10 payee_address_state: "VA",
11 payee_address_zip: "23219",
12 check_number: "1042",
13});
14
15console.log("Recorded:", disbursement.id);
Webhook verification (Next.js API route)
typescript
1import { MesocraticClient } from "@mesocrats/mce-sdk";
2import { NextRequest, NextResponse } from "next/server";
3
4const mce = new MesocraticClient({
5 apiKey: process.env.MCE_API_KEY,
6});
7
8export async function POST(req: NextRequest) {
9 const body = await req.text();
10 const signature = req.headers.get("x-mce-signature") || "";
11
12 // Verify HMAC-SHA256 signature
13 const isValid = mce.webhooks.verifySignature({
14 payload: body,
15 signature,
16 secret: process.env.MCE_WEBHOOK_SECRET!,
17 });
18
19 if (!isValid) {
20 return NextResponse.json({ error: "Invalid signature" }, { status: 401 });
21 }
22
23 const event = JSON.parse(body);
24
25 switch (event.type) {
26 case "contribution.created":
27 console.log("New contribution:", event.data.id);
28 break;
29
30 case "aggregate.threshold_crossed":
31 console.log("Donor crossed $200:", event.data.donor_id);
32 // Trigger best-efforts follow-up
33 break;
34
35 case "compliance.deadline_approaching":
36 console.log("Deadline in", event.data.days_remaining, "days");
37 break;
38 }
39
40 return NextResponse.json({ received: true });
41}

OpenAPI Specification

Machine-readable API description conforming to OpenAPI 3.1. Use it to generate client libraries, mock servers, or import into Postman, Insomnia, or any OpenAPI-compatible tool.