Meridian ERP API v1 · 2026-09-01
Overview
The Meridian ERP API gives read-only, programmatic access to the DocuSign, Inc. ERP tenant (docusign-prod).
It is a JSON-over-HTTPS REST API: resources have predictable URLs, every request is a GET, and all responses are JSON.
Transactional data is available from 2024-02-01 through 2026-09-30 (DocuSign fiscal years FY2025, FY2026 and FY2027 year to date).
| Base URL | https://meridian-erp.duckdns.org/v1 |
|---|---|
| OpenAPI 3.1 spec | /openapi.json · /openapi.yaml |
| Plain-text docs | /docs.md (same content as this page, in Markdown) |
| Interactive explorer | /swagger · /redoc |
| API version | 2026-09-01 |
Quickstart
Every /v1 endpoint except /v1/health requires an API key. Make your first call:
curl https://meridian-erp.duckdns.org/v1/company \
-H "Authorization: Bearer $MERIDIAN_API_KEY"
Then page through AP invoices for a period:
curl "https://meridian-erp.duckdns.org/v1/invoices?invoice_date_from=2025-02-01&invoice_date_to=2026-01-31&limit=200" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"
Python:
import requests
BASE = "https://meridian-erp.duckdns.org/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
def list_all(path, **params):
params.setdefault("limit", 200)
while True:
page = requests.get(f"{BASE}{path}", headers=HEADERS, params=params).json()
yield from page["data"]
if not page["has_more"]:
break
params["cursor"] = page["next_cursor"]
for inv in list_all("/invoices", fiscal_period="FY2026-P01"):
print(inv["vendor_name"], inv["total_amount"], inv["currency"])
Authentication
Authenticate with the API key issued to your integration. Send it as a bearer token:
Authorization: Bearer <API key>
The X-API-Key: <API key> header is also accepted. Requests without a key return 401 with
error.type = "authentication_error". Keys are scoped to a single tenant and grant read-only access.
Pagination
All list endpoints return a list envelope and use cursor pagination:
{
"object": "list",
"data": [ ... ],
"has_more": true,
"next_cursor": "bzoyMDA=",
"total_count": 2824
}
limit— page size, 1–200 (default 50).cursor— pass the previous response'snext_cursorto get the next page. Keep all other filters the same.- Results are sorted by their primary date ascending (
invoice_date,submitted_date,posting_date, …), then byid.
Conventions
- IDs are opaque, prefixed strings (
inv_…,ven_…,loc_…,exp_…). Treat them as case-sensitive. - Dates are ISO-8601
YYYY-MM-DD; timestamps are UTC ISO-8601 (2025-03-04T15:21:09Z). Date filters are inclusive. - Money is a decimal number in the document's
currency(ISO 4217). Invoices and expense reports also carryexchange_rate_to_usdandtotal_amount_usdat the document-month rate. Lineamounts exclude tax. - Fiscal calendar: fiscal years end January 31 and are named for the calendar year they end in.
FY2026-P01= February 2025. - Quantities: document lines carry
quantity+unit_of_measurewhen the vendor bills a measurable quantity (kWh, therm, m3, US_gal, kg, lb, metric_ton, CCF, room_night, unit, seat, GB-Mo, Instance-Hrs, …). - Custom fields: vendor- or commodity-specific attributes (meter numbers, rate schedules, AWS regions, refrigerant types,
waste streams, freight origin/destination, …) live in
custom_fields. - Incremental sync:
/v1/invoicesand/v1/expense-reportsacceptupdated_since.
Where to find data
A map of common reporting needs to the records that hold them.
| Need | Endpoint | How to filter / read |
|---|---|---|
| Spend by vendor, category, GL account | /v1/invoices, /v1/vendors | Join vendor_id → vendor category / naics_code; line gl_account_code |
| Site electricity, gas, district heat | /v1/invoices | commodity_category=electricity|natural_gas|district_heating; line quantity/unit_of_measure, location_id, service_period_* |
| Data center power | /v1/invoices | GL 5120 lines in kWh per colocation site; PUE in custom_fields.reported_pue |
| Public cloud usage | /v1/invoices | commodity_category=cloud_compute_storage; region in custom_fields |
| Generator fuel, refrigerants | /v1/invoices | commodity_category=diesel_fuel (US_gal), refrigerant (lb/kg, refrigerant_type) |
| Water & waste | /v1/invoices | commodity_category=water|wastewater|waste; custom_fields.waste_stream |
| Freight & shipping | /v1/invoices | commodity_category=freight; kg, transport_mode, origin, destination |
| Capital purchases (IT & network hardware) | /v1/purchase-orders, /v1/invoices | GL 1510/1520; commodity_category=it_hardware|network_hardware |
| Business travel | /v1/expense-reports | Line category; flight_segments (IATA + cabin), lodging nights, rail segments, distances |
| Events & hotel room blocks | /v1/invoices | GL 6400; custom_fields.event; room_night quantities |
| Commuting & remote work | /v1/headcount, /v1/invoices | work_arrangement, avg_office_days_per_week; commuter benefit lines (GL 6700) |
| Reconciling to the ledger | /v1/journal-entries | source_type + source_id link back to invoices / expense reports |
Errors
Errors use conventional HTTP status codes and a consistent body:
{"error": {"type": "invalid_request_error", "message": "Input should be less than or equal to 200", "param": "limit"}}
| Status | type | Meaning |
|---|---|---|
| 400 | invalid_request_error | A parameter is missing, malformed or out of range. |
| 401 | authentication_error | No API key, or a malformed Authorization header. |
| 404 | not_found | The object does not exist. |
| 429 | rate_limit_error | Too many requests; retry after X-RateLimit-Reset seconds. |
Rate limits
Each key may make 600 requests per minute. Every response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.
Meta
Service health.
Health check
Unauthenticated liveness probe.
curl "https://meridian-erp.duckdns.org/v1/health"Example response
{
"status": "ok",
"api_version": "2026-09-01"
}Organization
Tenant configuration and master data: legal entities, locations, cost centers and the chart of accounts.
Retrieve company
Tenant-level settings: legal name, base currency, fiscal calendar and the date range for which transactional data is available.
Returns a Company object.
curl "https://meridian-erp.duckdns.org/v1/company" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"id": "ten_docusign",
"name": "DocuSign, Inc.",
"erp_instance": "docusign-prod",
"base_currency": "USD",
"fiscal_year_end": "01-31",
"fiscal_calendar": "Fiscal years run Feb 1 - Jan 31 and are named for the calendar year in which they end (FY2026 = 2025-02-01 to 2026-01-31). Period P01 is February.",
"data_available_from": "2024-02-01",
"data_available_to": "2026-09-30",
"headquarters": {
"line1": "221 Main Street, Suite 1550",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
}
}List legal entities
All legal entities (subsidiaries) in the consolidation, with their functional currency.
| Parameter | Type | Description |
|---|---|---|
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of LegalEntity.
curl "https://meridian-erp.duckdns.org/v1/legal-entities?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "le_us",
"code": "US01",
"name": "DocuSign, Inc.",
"country": "US",
"functional_currency": "USD",
"tax_id": "91-2183967",
"parent_id": null
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 11
}List locations
Offices, colocation data centers, warehouses and virtual (remote-employee) locations. Location IDs are referenced from document lines and headcount.
| Parameter | Type | Description |
|---|---|---|
type query | enum: office, colocation_data_center, warehouse, virtual | null | Filter by location type. |
country query | string | null | ISO 3166-1 alpha-2 country code. |
legal_entity_id query | string | null | |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of Location.
curl "https://meridian-erp.duckdns.org/v1/locations?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "loc_sfo_hq",
"code": "SFO-HQ",
"name": "San Francisco HQ",
"type": "office",
"legal_entity_id": "le_us",
"address": {
"line1": "221 Main Street",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
},
"country": "US",
"latitude": 37.7908,
"longitude": -122.3925,
"floor_area": {
"value": 284000,
"unit": "sq_ft"
},
"tenure": "leased",
"status": "active",
"opened_on": "2016-01-01",
"nearest_airport": "SFO",
"cost_center_code": "5300"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 21
}Retrieve a location
| Parameter | Type | Description |
|---|---|---|
location_id path, required | string |
Returns a Location object.
curl "https://meridian-erp.duckdns.org/v1/locations/loc_sfo_hq" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"id": "loc_sfo_hq",
"code": "SFO-HQ",
"name": "San Francisco HQ",
"type": "office",
"legal_entity_id": "le_us",
"address": {
"line1": "221 Main Street",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
},
"country": "US",
"latitude": 37.7908,
"longitude": -122.3925,
"floor_area": {
"value": 284000,
"unit": "sq_ft"
},
"tenure": "leased",
"status": "active",
"opened_on": "2016-01-01",
"nearest_airport": "SFO",
"cost_center_code": "5300"
}List cost centers
| Parameter | Type | Description |
|---|---|---|
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of CostCenter.
curl "https://meridian-erp.duckdns.org/v1/cost-centers?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "cc_1000",
"code": "1000",
"name": "Executive Office",
"status": "active",
"parent_code": null
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 14
}List GL accounts
The chart of accounts. Every document line carries a gl_account_code from this list.
| Parameter | Type | Description |
|---|---|---|
account_type query | enum: asset, liability, cost_of_revenue, expense | null | |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of GLAccount.
curl "https://meridian-erp.duckdns.org/v1/gl-accounts?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "gla_1510",
"code": "1510",
"name": "Computer Equipment",
"account_type": "asset",
"status": "active"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 37
}Procurement
Vendors and purchase orders.
List vendors
| Parameter | Type | Description |
|---|---|---|
category query | string | null | Filter by vendor category. |
country query | string | null | |
q query | string | null | Case-insensitive substring match on vendor name. |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of Vendor.
curl "https://meridian-erp.duckdns.org/v1/vendors?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "ven_55357933A7310D2DB90C",
"vendor_number": "V10000",
"name": "Amazon Web Services, Inc.",
"category": "cloud_hosting",
"country": "US",
"naics_code": "518210",
"payment_terms": "NET30",
"status": "active",
"default_currency": "USD",
"created_at": "2019-03-11T17:02:44Z",
"updated_at": "2025-07-12T09:14:35Z"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 83
}Retrieve a vendor
| Parameter | Type | Description |
|---|---|---|
vendor_id path, required | string |
Returns a Vendor object.
curl "https://meridian-erp.duckdns.org/v1/vendors/ven_55357933A7310D2DB90C" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"id": "ven_55357933A7310D2DB90C",
"vendor_number": "V10000",
"name": "Amazon Web Services, Inc.",
"category": "cloud_hosting",
"country": "US",
"naics_code": "518210",
"payment_terms": "NET30",
"status": "active",
"default_currency": "USD",
"created_at": "2019-03-11T17:02:44Z",
"updated_at": "2025-07-12T09:14:35Z"
}List purchase orders
Purchase orders, mainly for IT hardware, data center equipment and events. Sorted by order_date ascending.
| Parameter | Type | Description |
|---|---|---|
vendor_id query | string | null | |
legal_entity_id query | string | null | |
order_date_from query | string (date) | null | Inclusive, YYYY-MM-DD. |
order_date_to query | string (date) | null | Inclusive, YYYY-MM-DD. |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of PurchaseOrder.
curl "https://meridian-erp.duckdns.org/v1/purchase-orders?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "po_8F948A282EF94AD13180",
"po_number": "PO-2024-40059",
"vendor_id": "ven_DA4645F8EC567FDD49F6",
"vendor_name": "Moscone Center (ASM Global)",
"legal_entity_id": "le_us",
"order_date": "2023-11-04",
"currency": "USD",
"total_amount": 1594000,
"status": "closed",
"requesting_cost_center_code": "4100",
"memo": "Momentum 2024 venue",
"lines": [
{
"description": "Momentum 2024 - venue rental, Moscone West",
"gl_account_code": "6400",
"cost_center_code": "4100",
"location_id": null,
"quantity": 4,
"unit_of_measure": "day",
"unit_price": 345000.0,
"amount": 1380000,
"service_period_start": "2024-05-13",
"service_period_end": "2024-05-16",
"commodity_category": "event_venue",
"custom_fields": {
"event": "Momentum 2024",
"event_city": "San Francisco"
},
"line_number": 1,
"id": "pol_8DE96E01EA6151513676"
},
{
"description": "Momentum 2024 - electrical service & rigging",
"gl_account_code": "6400",
"cost_center_code": "4100",
"location_id": null,
"quantity": null,
"unit_of_measure": null,
"unit_price": null,
"amount": 214000,
"service_period_start": "2024-05-13",
"service_period_end": "2024-05-16",
"commodity_category": "event_venue",
"custom_fields": {
"event": "Momentum 2024",
"event_city": "San Francisco",
"venue_metered_kwh": "58460"
},
"line_number": 2,
"id": "pol_D3CCEC6761BB7235C1A6"
}
],
"created_at": "2023-11-04T16:13:16Z",
"updated_at": "2023-12-14T12:27:28Z"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 61
}Retrieve a purchase order
| Parameter | Type | Description |
|---|---|---|
purchase_order_id path, required | string |
Returns a PurchaseOrder object.
curl "https://meridian-erp.duckdns.org/v1/purchase-orders/po_8F948A282EF94AD13180" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"id": "po_8F948A282EF94AD13180",
"po_number": "PO-2024-40059",
"vendor_id": "ven_DA4645F8EC567FDD49F6",
"vendor_name": "Moscone Center (ASM Global)",
"legal_entity_id": "le_us",
"order_date": "2023-11-04",
"currency": "USD",
"total_amount": 1594000,
"status": "closed",
"requesting_cost_center_code": "4100",
"memo": "Momentum 2024 venue",
"lines": [
{
"description": "Momentum 2024 - venue rental, Moscone West",
"gl_account_code": "6400",
"cost_center_code": "4100",
"location_id": null,
"quantity": 4,
"unit_of_measure": "day",
"unit_price": 345000.0,
"amount": 1380000,
"service_period_start": "2024-05-13",
"service_period_end": "2024-05-16",
"commodity_category": "event_venue",
"custom_fields": {
"event": "Momentum 2024",
"event_city": "San Francisco"
},
"line_number": 1,
"id": "pol_8DE96E01EA6151513676"
},
{
"description": "Momentum 2024 - electrical service & rigging",
"gl_account_code": "6400",
"cost_center_code": "4100",
"location_id": null,
"quantity": null,
"unit_of_measure": null,
"unit_price": null,
"amount": 214000,
"service_period_start": "2024-05-13",
"service_period_end": "2024-05-16",
"commodity_category": "event_venue",
"custom_fields": {
"event": "Momentum 2024",
"event_city": "San Francisco",
"venue_metered_kwh": "58460"
},
"line_number": 2,
"id": "pol_D3CCEC6761BB7235C1A6"
}
],
"created_at": "2023-11-04T16:13:16Z",
"updated_at": "2023-12-14T12:27:28Z"
}Payables
Accounts-payable invoices with line-level GL coding, quantities and units of measure.
List AP invoices
Accounts-payable (vendor) invoices with their line items, sorted by invoice_date ascending. Lines carry GL account, cost center, location, quantity and unit of measure (for example kWh on utility bills, kg on freight invoices, room nights on hotel invoices).
| Parameter | Type | Description |
|---|---|---|
vendor_id query | string | null | |
legal_entity_id query | string | null | |
location_id query | string | null | Only invoices with at least one line for this location. |
gl_account_code query | string | null | Only invoices with at least one line on this GL account. |
commodity_category query | string | null | Only invoices with at least one line in this commodity category. |
status query | enum: pending_approval, approved, paid | null | |
invoice_date_from query | string (date) | null | Inclusive, YYYY-MM-DD. |
invoice_date_to query | string (date) | null | Inclusive, YYYY-MM-DD. |
fiscal_period query | string | null | e.g. FY2026-P03. |
updated_since query | string | null | ISO-8601 timestamp; only objects updated at or after this time (for incremental sync). |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of Invoice.
curl "https://meridian-erp.duckdns.org/v1/invoices?commodity_category=electricity&invoice_date_from=2026-01-01&limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "inv_FD16CD0635790B0E4AB7",
"document_number": "AP-102687",
"vendor_invoice_number": "PAC-8487262",
"vendor_id": "ven_DBF662A314870538BF3E",
"vendor_name": "Pacific Gas and Electric Company",
"legal_entity_id": "le_us",
"invoice_date": "2026-10-02",
"posting_date": "2026-10-03",
"due_date": "2026-10-23",
"fiscal_year": "FY2027",
"fiscal_period": "FY2027-P09",
"currency": "USD",
"subtotal": 124136.49,
"tax_amount": 0.0,
"total_amount": 124136.49,
"exchange_rate_to_usd": 1.0,
"total_amount_usd": 124136.49,
"status": "paid",
"paid_on": "2026-10-20",
"purchase_order_id": null,
"memo": null,
"lines": [
{
"description": "Electric service - B-19 Medium General Demand TOU",
"gl_account_code": "6110",
"cost_center_code": "5300",
"location_id": "loc_sfo_hq",
"quantity": 328286.531,
"unit_of_measure": "kWh",
"unit_price": 0.318,
"amount": 104395.12,
"service_period_start": "2026-09-01",
"service_period_end": "2026-09-30",
"commodity_category": "electricity",
"custom_fields": {
"service_agreement_id": "6912087341",
"meter_number": "1009873245",
"rate_schedule": "B19",
"peak_demand_kw": "995"
},
"line_number": 1,
"id": "invl_A051C98B3BDA1DE5BF1D"
},
{
"description": "Gas service - G-NR2 Large Commercial",
"gl_account_code": "6111",
"cost_center_code": "5300",
"location_id": "loc_sfo_hq",
"quantity": 5467.069,
"unit_of_measure": "therm",
"unit_price": 2.41,
"amount": 13175.64,
"service_period_start": "2026-09-01",
"service_period_end": "2026-09-30",
"commodity_category": "natural_gas",
"custom_fields": {
"service_agreement_id": "6912087358",
"meter_number": "G-04417781",
"rate_schedule": "G-NR2"
},
"line_number": 2,
"id": "invl_F6499E139E4A09380086"
},
{
"description": "Clean Power SF - SuperGreen (100% renewable) premium",
"gl_account_code": "6110",
"cost_center_code": "5300",
"location_id": "loc_sfo_hq",
"quantity": 328286.531,
"unit_of_measure": "kWh",
"unit_price": 0.02,
"amount": 6565.73,
"service_period_start": "2026-09-01",
"service_period_end": "2026-09-30",
"commodity_category": "electricity",
"custom_fields": {
"program": "CleanPowerSF SuperGreen"
},
"line_number": 3,
"id": "invl_EBDD187B0709179BD98E"
}
],
"created_at": "2026-10-03T15:07:01Z",
"updated_at": "2026-10-24T18:40:23Z"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 2824
}Retrieve an AP invoice
| Parameter | Type | Description |
|---|---|---|
invoice_id path, required | string |
Returns a Invoice object.
curl "https://meridian-erp.duckdns.org/v1/invoices/inv_FD16CD0635790B0E4AB7" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"id": "inv_FD16CD0635790B0E4AB7",
"document_number": "AP-102687",
"vendor_invoice_number": "PAC-8487262",
"vendor_id": "ven_DBF662A314870538BF3E",
"vendor_name": "Pacific Gas and Electric Company",
"legal_entity_id": "le_us",
"invoice_date": "2026-10-02",
"posting_date": "2026-10-03",
"due_date": "2026-10-23",
"fiscal_year": "FY2027",
"fiscal_period": "FY2027-P09",
"currency": "USD",
"subtotal": 124136.49,
"tax_amount": 0.0,
"total_amount": 124136.49,
"exchange_rate_to_usd": 1.0,
"total_amount_usd": 124136.49,
"status": "paid",
"paid_on": "2026-10-20",
"purchase_order_id": null,
"memo": null,
"lines": [
{
"description": "Electric service - B-19 Medium General Demand TOU",
"gl_account_code": "6110",
"cost_center_code": "5300",
"location_id": "loc_sfo_hq",
"quantity": 328286.531,
"unit_of_measure": "kWh",
"unit_price": 0.318,
"amount": 104395.12,
"service_period_start": "2026-09-01",
"service_period_end": "2026-09-30",
"commodity_category": "electricity",
"custom_fields": {
"service_agreement_id": "6912087341",
"meter_number": "1009873245",
"rate_schedule": "B19",
"peak_demand_kw": "995"
},
"line_number": 1,
"id": "invl_A051C98B3BDA1DE5BF1D"
},
{
"description": "Gas service - G-NR2 Large Commercial",
"gl_account_code": "6111",
"cost_center_code": "5300",
"location_id": "loc_sfo_hq",
"quantity": 5467.069,
"unit_of_measure": "therm",
"unit_price": 2.41,
"amount": 13175.64,
"service_period_start": "2026-09-01",
"service_period_end": "2026-09-30",
"commodity_category": "natural_gas",
"custom_fields": {
"service_agreement_id": "6912087358",
"meter_number": "G-04417781",
"rate_schedule": "G-NR2"
},
"line_number": 2,
"id": "invl_F6499E139E4A09380086"
},
{
"description": "Clean Power SF - SuperGreen (100% renewable) premium",
"gl_account_code": "6110",
"cost_center_code": "5300",
"location_id": "loc_sfo_hq",
"quantity": 328286.531,
"unit_of_measure": "kWh",
"unit_price": 0.02,
"amount": 6565.73,
"service_period_start": "2026-09-01",
"service_period_end": "2026-09-30",
"commodity_category": "electricity",
"custom_fields": {
"program": "CleanPowerSF SuperGreen"
},
"line_number": 3,
"id": "invl_EBDD187B0709179BD98E"
}
],
"created_at": "2026-10-03T15:07:01Z",
"updated_at": "2026-10-24T18:40:23Z"
}Travel & Expense
Employee expense reports with itemized travel details.
List expense reports
Employee travel & expense reports with itemized lines, sorted by submitted_date ascending. Airfare lines include flight segments (IATA origin/destination, cabin class); lodging lines include nights and city; mileage, rideshare and car-rental lines include distances.
| Parameter | Type | Description |
|---|---|---|
employee_id query | string | null | |
legal_entity_id query | string | null | |
cost_center_code query | string | null | |
category query | string | null | Only reports with at least one line in this category (e.g. airfare). |
status query | enum: submitted, approved, reimbursed | null | |
submitted_date_from query | string (date) | null | |
submitted_date_to query | string (date) | null | |
fiscal_period query | string | null | |
updated_since query | string | null | |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of ExpenseReport.
curl "https://meridian-erp.duckdns.org/v1/expense-reports?category=airfare&limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "exp_B177B86DE5AD937E5C62",
"report_number": "ER-508449",
"title": "Washington trip - Sep 2026",
"employee": {
"id": "emp_4DE62D12209F2C3B18BC",
"employee_number": "E22394",
"name": "Daniel Nguyen",
"cost_center_code": "5200",
"home_location_id": "loc_syd_01"
},
"legal_entity_id": "le_au",
"trip_start_date": "2026-09-24",
"trip_end_date": "2026-09-26",
"submitted_date": "2026-10-08",
"approved_date": "2026-10-13",
"fiscal_year": "FY2027",
"fiscal_period": "FY2027-P09",
"currency": "AUD",
"total_amount": 6753.18,
"exchange_rate_to_usd": 0.6717,
"total_amount_usd": 4536.11,
"status": "reimbursed",
"lines": [
{
"expense_date": "2026-09-11",
"category": "airfare",
"gl_account_code": "6300",
"merchant": "Qantas",
"amount": 5048.29,
"currency": "AUD",
"transaction_amount": 3390.94,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"ticket_number": "5843757990917",
"trip_type": "round_trip",
"flight_segments": [
{
"origin": "SYD",
"destination": "IAD",
"departure_date": "2026-09-24",
"carrier": "Qantas",
"flight_number": "QA743",
"cabin_class": "economy",
"fare_class": "H"
},
{
"origin": "IAD",
"destination": "SYD",
"departure_date": "2026-09-26",
"carrier": "Qantas",
"flight_number": "QA632",
"cabin_class": "economy",
"fare_class": "Y"
}
],
"booking_channel": "Navan",
"line_number": 1,
"id": "expl_7BA19B14266058FAE9FA",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-26",
"category": "lodging",
"gl_account_code": "6310",
"merchant": "Courtyard by Marriott Washington",
"amount": 1273.0,
"currency": "AUD",
"transaction_amount": 855.08,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"nights": 2,
"check_in_date": "2026-09-24",
"check_out_date": "2026-09-26",
"city": "Washington",
"country": "US",
"line_number": 2,
"id": "expl_B0AD38CDADA68FA05B38",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-24",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Lyft",
"amount": 88.27,
"currency": "AUD",
"transaction_amount": 59.29,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 21.5,
"distance_unit": "mi",
"line_number": 3,
"id": "expl_A953D1140E705F92FDFB",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-25",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Lyft",
"amount": 104.49,
"currency": "AUD",
"transaction_amount": 70.18,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 18.2,
"distance_unit": "mi",
"line_number": 4,
"id": "expl_61842D348F0E51D1F588",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-26",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Uber",
"amount": 61.07,
"currency": "AUD",
"transaction_amount": 41.02,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 4.5,
"distance_unit": "mi",
"line_number": 5,
"id": "expl_C6E67667406F0ACDB0B2",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-24",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Uber",
"amount": 99.96,
"currency": "AUD",
"transaction_amount": 67.14,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 13.6,
"distance_unit": "mi",
"line_number": 6,
"id": "expl_8703707AD0B8FA18A51B",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-25",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Lyft",
"amount": 78.1,
"currency": "AUD",
"transaction_amount": 52.46,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "personal_card",
"city": "Washington",
"distance": 11.7,
"distance_unit": "mi",
"line_number": 7,
"id": "expl_71B53236280E0BDD1D0E",
"cost_center_code": "5200"
}
],
"created_at": "2026-10-08T20:02:25Z",
"updated_at": "2026-10-18T10:40:59Z"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 8473
}Retrieve an expense report
| Parameter | Type | Description |
|---|---|---|
expense_report_id path, required | string |
Returns a ExpenseReport object.
curl "https://meridian-erp.duckdns.org/v1/expense-reports/exp_B177B86DE5AD937E5C62" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"id": "exp_B177B86DE5AD937E5C62",
"report_number": "ER-508449",
"title": "Washington trip - Sep 2026",
"employee": {
"id": "emp_4DE62D12209F2C3B18BC",
"employee_number": "E22394",
"name": "Daniel Nguyen",
"cost_center_code": "5200",
"home_location_id": "loc_syd_01"
},
"legal_entity_id": "le_au",
"trip_start_date": "2026-09-24",
"trip_end_date": "2026-09-26",
"submitted_date": "2026-10-08",
"approved_date": "2026-10-13",
"fiscal_year": "FY2027",
"fiscal_period": "FY2027-P09",
"currency": "AUD",
"total_amount": 6753.18,
"exchange_rate_to_usd": 0.6717,
"total_amount_usd": 4536.11,
"status": "reimbursed",
"lines": [
{
"expense_date": "2026-09-11",
"category": "airfare",
"gl_account_code": "6300",
"merchant": "Qantas",
"amount": 5048.29,
"currency": "AUD",
"transaction_amount": 3390.94,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"ticket_number": "5843757990917",
"trip_type": "round_trip",
"flight_segments": [
{
"origin": "SYD",
"destination": "IAD",
"departure_date": "2026-09-24",
"carrier": "Qantas",
"flight_number": "QA743",
"cabin_class": "economy",
"fare_class": "H"
},
{
"origin": "IAD",
"destination": "SYD",
"departure_date": "2026-09-26",
"carrier": "Qantas",
"flight_number": "QA632",
"cabin_class": "economy",
"fare_class": "Y"
}
],
"booking_channel": "Navan",
"line_number": 1,
"id": "expl_7BA19B14266058FAE9FA",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-26",
"category": "lodging",
"gl_account_code": "6310",
"merchant": "Courtyard by Marriott Washington",
"amount": 1273.0,
"currency": "AUD",
"transaction_amount": 855.08,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"nights": 2,
"check_in_date": "2026-09-24",
"check_out_date": "2026-09-26",
"city": "Washington",
"country": "US",
"line_number": 2,
"id": "expl_B0AD38CDADA68FA05B38",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-24",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Lyft",
"amount": 88.27,
"currency": "AUD",
"transaction_amount": 59.29,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 21.5,
"distance_unit": "mi",
"line_number": 3,
"id": "expl_A953D1140E705F92FDFB",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-25",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Lyft",
"amount": 104.49,
"currency": "AUD",
"transaction_amount": 70.18,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 18.2,
"distance_unit": "mi",
"line_number": 4,
"id": "expl_61842D348F0E51D1F588",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-26",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Uber",
"amount": 61.07,
"currency": "AUD",
"transaction_amount": 41.02,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 4.5,
"distance_unit": "mi",
"line_number": 5,
"id": "expl_C6E67667406F0ACDB0B2",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-24",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Uber",
"amount": 99.96,
"currency": "AUD",
"transaction_amount": 67.14,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "corporate_card",
"city": "Washington",
"distance": 13.6,
"distance_unit": "mi",
"line_number": 6,
"id": "expl_8703707AD0B8FA18A51B",
"cost_center_code": "5200"
},
{
"expense_date": "2026-09-25",
"category": "rideshare",
"gl_account_code": "6320",
"merchant": "Lyft",
"amount": 78.1,
"currency": "AUD",
"transaction_amount": 52.46,
"transaction_currency": "USD",
"business_purpose": "Customer meetings",
"payment_method": "personal_card",
"city": "Washington",
"distance": 11.7,
"distance_unit": "mi",
"line_number": 7,
"id": "expl_71B53236280E0BDD1D0E",
"cost_center_code": "5200"
}
],
"created_at": "2026-10-08T20:02:25Z",
"updated_at": "2026-10-18T10:40:59Z"
}General Ledger
Posted journal entries.
List journal entries
Posted general-ledger journal entries generated from AP invoices and approved expense reports, sorted by posting_date ascending.
| Parameter | Type | Description |
|---|---|---|
legal_entity_id query | string | null | |
source_type query | enum: ap_invoice, expense_report | null | |
gl_account_code query | string | null | Only entries touching this account. |
posting_date_from query | string (date) | null | |
posting_date_to query | string (date) | null | |
fiscal_period query | string | null | |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of JournalEntry.
curl "https://meridian-erp.duckdns.org/v1/journal-entries?limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "je_802DA07D21F1C3EEDCD2",
"entry_number": "JE-508301",
"posting_date": "2026-10-13",
"fiscal_year": "FY2027",
"fiscal_period": "FY2027-P09",
"legal_entity_id": "le_uk",
"currency": "GBP",
"source_type": "expense_report",
"source_id": "exp_4370C46B229C95854C3B",
"description": "Munich trip - Sep 2026",
"lines": [
{
"line_number": 1,
"gl_account_code": "6300",
"cost_center_code": "3200",
"location_id": null,
"debit": 383.7,
"credit": 0.0,
"description": "airfare - British Airways"
},
{
"line_number": 2,
"gl_account_code": "6310",
"cost_center_code": "3200",
"location_id": null,
"debit": 366.73,
"credit": 0.0,
"description": "lodging - Hilton Munich"
},
{
"line_number": 3,
"gl_account_code": "6320",
"cost_center_code": "3200",
"location_id": null,
"debit": 39.15,
"credit": 0.0,
"description": "rideshare - Uber"
},
{
"line_number": 4,
"gl_account_code": "6320",
"cost_center_code": "3200",
"location_id": null,
"debit": 19.78,
"credit": 0.0,
"description": "rideshare - FREE NOW"
},
{
"line_number": 5,
"gl_account_code": "6320",
"cost_center_code": "3200",
"location_id": null,
"debit": 30.81,
"credit": 0.0,
"description": "rideshare - Bolt"
},
{
"line_number": 6,
"gl_account_code": "6340",
"cost_center_code": "3200",
"location_id": null,
"debit": 75.71,
"credit": 0.0,
"description": "meals - Sweetgreen"
},
{
"line_number": 7,
"gl_account_code": "2100",
"cost_center_code": null,
"location_id": null,
"debit": 0.0,
"credit": 915.88,
"description": "Reimbursable - Sakura Chen"
}
],
"created_at": "2026-10-08T20:26:25Z"
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 11297
}People
Month-end headcount by location.
List headcount snapshots
Month-end headcount by location, including work-arrangement split (onsite / hybrid / remote) and average office attendance.
| Parameter | Type | Description |
|---|---|---|
location_id query | string | null | |
period_from query | string | null | YYYY-MM, inclusive. |
period_to query | string | null | YYYY-MM, inclusive. |
limit query | integer · default 50 | Page size (1-200). |
cursor query | string | null | Opaque pagination cursor from a previous response's next_cursor. |
Returns a list envelope whose data is an array of HeadcountSnapshot.
curl "https://meridian-erp.duckdns.org/v1/headcount?period_from=2026-09&limit=1" \
-H "Authorization: Bearer $MERIDIAN_API_KEY"Example response
{
"object": "list",
"data": [
{
"id": "hc_7B9C6C19B804B0CED47D",
"period": "2026-09",
"as_of_date": "2026-09-30",
"fiscal_period": "FY2027-P08",
"location_id": "loc_remote_eu",
"legal_entity_id": "le_ie",
"headcount": 172,
"fte": 169.4,
"contractors": 12,
"work_arrangement": {
"onsite": 0,
"hybrid": 0,
"remote": 172
},
"avg_office_days_per_week": null
}
],
"has_more": true,
"next_cursor": "bzox",
"total_count": 512
}Objects
Address
| Field | Type | Description |
|---|---|---|
line1 | string | |
city | string | |
region optional | string | null | |
postal_code optional | string | null | |
country | string | ISO 3166-1 alpha-2 country code. |
Company
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
erp_instance | string | |
base_currency | string | Reporting currency for consolidated (*_usd) amounts. |
fiscal_year_end | string | MM-DD of fiscal year end. |
fiscal_calendar | string | |
data_available_from | string (date) | |
data_available_to | string (date) | |
headquarters | Address |
CostCenter
| Field | Type | Description |
|---|---|---|
id | string | |
code | string | |
name | string | |
parent_code optional | string | null | |
status | string |
DocumentLine
| Field | Type | Description |
|---|---|---|
id | string | |
line_number | integer | |
description | string | |
gl_account_code | string | |
cost_center_code | string | |
location_id optional | string | null | Site the cost relates to, when applicable. |
quantity optional | number | null | Billed quantity in unit_of_measure (e.g. kWh, therm, kg, room_night, unit). |
unit_of_measure optional | string | null | e.g. kWh, therm, m3, US_gal, kg, lb, metric_ton, CCF, room_night, unit, seat, GB-Mo. |
unit_price optional | number | null | |
amount | number | Line amount in the document currency, excluding tax. Credits are negative. |
service_period_start optional | string (date) | null | |
service_period_end optional | string (date) | null | |
commodity_category optional | string | null | Normalized commodity, e.g. electricity, natural_gas, district_heating, diesel_fuel, refrigerant, water, waste, freight, cloud_compute_storage, it_hardware, hotel_accommodation. |
custom_fields optional | object (map) | Vendor/commodity specific fields such as meter_number, rate_schedule, aws_region, refrigerant_type, waste_stream, transport_mode, origin, destination. |
EmployeeRef
| Field | Type | Description |
|---|---|---|
id | string | |
employee_number | string | |
name | string | |
cost_center_code | string | |
home_location_id | string |
Error
| Field | Type | Description |
|---|---|---|
error | ErrorBody |
ErrorBody
| Field | Type | Description |
|---|---|---|
type | string | Machine-readable error type, e.g. authentication_error, invalid_request_error, not_found. |
message | string | Human-readable description of the error. |
param optional | string | null | The request parameter the error relates to, if any. |
ExpenseLine
| Field | Type | Description |
|---|---|---|
id | string | |
line_number | integer | |
expense_date | string (date) | |
category | enum: airfare, lodging, car_rental, fuel, rideshare, rail, mileage, parking, meals, conference_fees, other | |
gl_account_code | string | |
cost_center_code | string | |
merchant | string | |
amount | number | Amount in the report currency. |
currency | string | |
transaction_amount | number | Amount in the currency the card was charged in. |
transaction_currency | string | |
business_purpose | string | |
payment_method | enum: corporate_card, personal_card | |
flight_segments optional | array of FlightSegment | null | Present on airfare lines. |
ticket_number optional | string | null | |
trip_type optional | string | null | |
booking_channel optional | string | null | |
rail_segments optional | array of RailSegment | null | Present on rail lines. |
nights optional | integer | null | Present on lodging lines. |
check_in_date optional | string (date) | null | |
check_out_date optional | string (date) | null | |
city optional | string | null | |
country optional | string | null | |
rental_days optional | integer | null | |
vehicle_class optional | string | null | Present on car_rental lines, e.g. compact, standard_suv, hybrid, electric. |
distance optional | number | null | Present on mileage and rideshare lines. |
distance_driven optional | number | null | Present on car_rental lines. |
distance_unit optional | enum: mi, km | null | |
vehicle_type optional | string | null | |
fuel_quantity optional | number | null | |
fuel_unit optional | string | null | |
fuel_type optional | string | null | |
attendees optional | integer | null |
ExpenseReport
| Field | Type | Description |
|---|---|---|
id | string | |
report_number | string | |
title | string | |
employee | EmployeeRef | |
legal_entity_id | string | |
trip_start_date | string (date) | |
trip_end_date | string (date) | |
submitted_date | string (date) | |
approved_date optional | string (date) | null | |
fiscal_year | string | |
fiscal_period | string | |
currency | string | |
total_amount | number | |
exchange_rate_to_usd | number | |
total_amount_usd | number | |
status | enum: submitted, approved, reimbursed | |
lines | array of ExpenseLine | |
created_at | string | |
updated_at | string |
FlightSegment
| Field | Type | Description |
|---|---|---|
origin | string | IATA airport code. |
destination | string | IATA airport code. |
departure_date | string (date) | |
carrier | string | |
flight_number | string | |
cabin_class | enum: economy, premium_economy, business, first | |
fare_class | string |
GLAccount
| Field | Type | Description |
|---|---|---|
id | string | |
code | string | |
name | string | |
account_type | enum: asset, liability, cost_of_revenue, expense | |
status | string |
HeadcountSnapshot
| Field | Type | Description |
|---|---|---|
id | string | |
period | string | Calendar month, YYYY-MM. |
as_of_date | string (date) | |
fiscal_period | string | |
location_id | string | |
legal_entity_id | string | |
headcount | integer | Active employees assigned to the location at month end. |
fte | number | |
contractors | integer | |
work_arrangement | WorkArrangement | |
avg_office_days_per_week optional | number | null | Badge-derived average in-office days per week for assigned employees. |
Invoice
| Field | Type | Description |
|---|---|---|
id | string | |
document_number | string | Internal AP document number. |
vendor_invoice_number | string | |
vendor_id | string | |
vendor_name | string | |
legal_entity_id | string | |
invoice_date | string (date) | |
posting_date | string (date) | |
due_date | string (date) | |
fiscal_year | string | |
fiscal_period | string | |
currency | string | |
subtotal | number | |
tax_amount | number | |
total_amount | number | |
exchange_rate_to_usd | number | |
total_amount_usd | number | |
status | enum: pending_approval, approved, paid | |
paid_on optional | string (date) | null | |
purchase_order_id optional | string | null | |
memo optional | string | null | |
lines | array of DocumentLine | |
created_at | string | |
updated_at | string |
JournalEntry
| Field | Type | Description |
|---|---|---|
id | string | |
entry_number | string | |
posting_date | string (date) | |
fiscal_year | string | |
fiscal_period | string | |
legal_entity_id | string | |
currency | string | |
source_type | enum: ap_invoice, expense_report | |
source_id | string | ID of the originating invoice or expense report. |
description | string | |
lines | array of JournalLine | |
created_at | string |
JournalLine
| Field | Type | Description |
|---|---|---|
line_number | integer | |
gl_account_code | string | |
cost_center_code optional | string | null | |
location_id optional | string | null | |
debit | number | |
credit | number | |
description | string |
LegalEntity
| Field | Type | Description |
|---|---|---|
id | string | |
code | string | |
name | string | |
country | string | |
functional_currency | string | ISO 4217 currency in which this entity books documents. |
tax_id | string | |
parent_id optional | string | null |
Location
| Field | Type | Description |
|---|---|---|
id | string | |
code | string | |
name | string | |
type | enum: office, colocation_data_center, warehouse, virtual | virtual locations hold remote employees and have no premises. |
legal_entity_id | string | |
address optional | Address | null | |
country | string | |
latitude optional | number | null | |
longitude optional | number | null | |
floor_area optional | Quantity | null | Rentable floor area. Null for data centers and virtual locations. |
tenure | enum: leased, owned, colocation_contract, none | |
status | enum: active, closed | |
opened_on | string (date) | |
nearest_airport optional | string | null | IATA code. |
cost_center_code optional | string | null | Default cost center for site costs. |
PurchaseOrder
| Field | Type | Description |
|---|---|---|
id | string | |
po_number | string | |
vendor_id | string | |
vendor_name | string | |
legal_entity_id | string | |
order_date | string (date) | |
currency | string | |
total_amount | number | |
status | enum: open, received, closed | |
requesting_cost_center_code | string | |
memo optional | string | null | |
lines | array of DocumentLine | |
created_at | string | |
updated_at | string |
Quantity
| Field | Type | Description |
|---|---|---|
value | number | |
unit | string |
RailSegment
| Field | Type | Description |
|---|---|---|
origin_station | string | |
destination_station | string | |
operator | string | |
travel_class | enum: standard, first | |
trip_type | enum: one_way, round_trip |
Vendor
| Field | Type | Description |
|---|---|---|
id | string | |
vendor_number | string | |
name | string | |
category | string | Procurement category, e.g. cloud_hosting, utility_electricity, real_estate_lease, freight_parcel. |
country | string | |
naics_code | string | 2022 NAICS code of the vendor's primary activity. |
payment_terms | string | |
default_currency | string | |
status | string | |
created_at | string | |
updated_at | string |
WorkArrangement
| Field | Type | Description |
|---|---|---|
onsite | integer | |
hybrid | integer | |
remote | integer |