Supplier Currency Onboarding Automation in 2026: Vendor Masters, ERP Exports, and FX Evidence
Supplier currency errors are quiet until they are expensive. A three-letter code entered during onboarding can flow into purchase orders, invoices, payment files, aging reports, accruals, and supplier support tickets.
Finance operations teams usually find the problem after work has already piled up: an invoice arrives in one currency, the payment file expects another, the ERP rounds the amount differently, or a supplier asks why the approved quote and payment notice do not match.
A better workflow validates supplier currency data at the front door. Before a vendor master becomes active, check whether the invoice and payment currencies are supported, whether metadata matches finance-system setup, and whether the first rate evidence is stored with the supplier record.
Currency-Exchange.app supports the verified API pieces needed for that pattern: supported-currency listing and metadata, current or historical conversion, pair-rate lookup, API-key management, usage lookup, and usage export. This does not make it a native ERP or AP automation connector. It is an API surface that your spreadsheet script, middleware, queue, no-code step, or internal agent can call.
The onboarding workflow
1. Capture the currency decision before the supplier is active
Collect invoice currency, payment currency, functional currency, legal entity, country or region, payment method, policy owner, and effective date. Do this before the first PO, not after AP receives the first invoice.
2. Validate the currency code and metadata
Use the currency list or details endpoint to confirm the ISO code, display name, symbol, decimal digits, rounding metadata, units, and countries or regions returned by the public API.
3. Run a first FX evidence check
Call the conversion or pair-rate endpoint between the supplier currency and your reporting currency. Store exchangeRate and rateTime so finance can see which rate was used during onboarding.
4. Write evidence back to the vendor master
Attach source fields, API response fields, reviewer, policy date, and exception status to the ERP, AP automation tool, spreadsheet, or procurement record that owns the supplier profile.
5. Revalidate during material changes
Run the same checks when a supplier changes banking details, legal entity, invoice currency, payment currency, or country. Use usage exports to review how much validation traffic each workflow creates.
What the vendor-master record should keep
The supplier record should store more than a currency code. Keep the source fields and the API evidence together so a later AP issue can be traced without asking engineering to rebuild the onboarding run.
- Supplier ID, legal entity, country, and record owner
- Invoice currency and payment currency
- Currency name, symbol, decimal digits, and rounding
- Functional or reporting currency for first-rate checks
- Policy date, request timestamp, and returned rateTime
- Approval status, exception reason, and reviewer
API examples for supplier onboarding
Start with currency metadata. The public OpenAPI schema includes ISO code, display names, symbols, decimal digits, rounding, units, banknotes, coins, and countries or regions.
curl "https://api.currency-exchange.app/v1-list-currencies?code=MXN&active=true&expand=name&expand=symbol&expand=iso&expand=decimalDigits&expand=rounding&expand=countries" \
-H "x-api-key: YOUR_API_KEY"Then run a first conversion or pair-rate evidence check. Use a historical date only when the contract, PO, or finance policy calls for it.
curl "https://api.currency-exchange.app/v1-convert-currency?from=MXN&to=USD&amount=10000&date=2026-06-01" \
-H "x-api-key: YOUR_API_KEY"Review usage when imports, spreadsheet scripts, and agents start making repeated validation calls.
curl "https://api.currency-exchange.app/v1-get-api-usage?from=2026-06-01&to=2026-06-30&service=currency" \
-H "x-api-key: YOUR_API_KEY"A TypeScript worker can validate metadata and first-rate evidence before writing the result into the vendor master.
type SupplierCurrencyInput = {
supplierId: string;
invoiceCurrency: string;
paymentCurrency: string;
reportingCurrency: string;
policyDate?: string;
};
type CurrencyMetadata = {
code: string;
name?: string;
symbol?: string;
decimalDigits?: number;
rounding?: number;
countries?: string[];
};
type CurrencyListPayload = {
list: CurrencyMetadata[];
};
type ConversionEvidence = {
exchangeRate: number;
rateTime: string;
originalAmount: number;
convertedAmount: number;
};
type SupplierCurrencyEvidence = {
supplierId: string;
invoiceCurrency: CurrencyMetadata;
paymentCurrency: CurrencyMetadata;
firstRate: ConversionEvidence;
status: 'approved' | 'needs-review';
reasons: string[];
};
function isCurrencyMetadata(value: unknown): value is CurrencyMetadata {
if (!value || typeof value !== 'object') return false;
const record = value as Record<string, unknown>;
return typeof record.code === 'string';
}
function isCurrencyListPayload(value: unknown): value is CurrencyListPayload {
if (!value || typeof value !== 'object') return false;
const record = value as Record<string, unknown>;
return Array.isArray(record.list) && record.list.every(isCurrencyMetadata);
}
function isConversionEvidence(value: unknown): value is ConversionEvidence {
if (!value || typeof value !== 'object') return false;
const record = value as Record<string, unknown>;
return (
typeof record.exchangeRate === 'number' &&
typeof record.rateTime === 'string' &&
typeof record.originalAmount === 'number' &&
typeof record.convertedAmount === 'number'
);
}
async function getCurrencyMetadata(code: string): Promise<CurrencyMetadata> {
const url = new URL('https://api.currency-exchange.app/v1-list-currencies');
url.searchParams.set('code', code);
url.searchParams.set('active', 'true');
url.searchParams.append('expand', 'name');
url.searchParams.append('expand', 'symbol');
url.searchParams.append('expand', 'iso');
url.searchParams.append('expand', 'decimalDigits');
url.searchParams.append('expand', 'rounding');
url.searchParams.append('expand', 'countries');
const response = await fetch(url, {
headers: { 'x-api-key': process.env.FX_API_KEY ?? '' },
});
const payload: unknown = await response.json();
if (!isCurrencyListPayload(payload) || !payload.list[0]) {
throw new Error('Unsupported supplier currency');
}
return payload.list[0];
}
async function getFirstRate(input: SupplierCurrencyInput): Promise<ConversionEvidence> {
const url = new URL('https://api.currency-exchange.app/v1-convert-currency');
url.searchParams.set('from', input.paymentCurrency);
url.searchParams.set('to', input.reportingCurrency);
url.searchParams.set('amount', '10000');
if (input.policyDate) {
url.searchParams.set('date', input.policyDate);
}
const response = await fetch(url, {
headers: { 'x-api-key': process.env.FX_API_KEY ?? '' },
});
const payload: unknown = await response.json();
if (!isConversionEvidence(payload)) {
throw new Error('Unexpected conversion response shape');
}
return payload;
}
export async function validateSupplierCurrency(input: SupplierCurrencyInput): Promise<SupplierCurrencyEvidence> {
const invoiceCurrency = await getCurrencyMetadata(input.invoiceCurrency);
const paymentCurrency = await getCurrencyMetadata(input.paymentCurrency);
const firstRate = await getFirstRate(input);
const reasons: string[] = [];
if (input.invoiceCurrency !== input.paymentCurrency) {
reasons.push('Invoice currency differs from payment currency');
}
return {
supplierId: input.supplierId,
invoiceCurrency,
paymentCurrency,
firstRate,
status: reasons.length > 0 ? 'needs-review' : 'approved',
reasons,
};
}The evidence stored with the supplier can stay compact.
{
"supplierId": "supplier_1042",
"invoiceCurrency": {
"code": "MXN",
"name": "Mexican Peso",
"symbol": "$",
"decimalDigits": 2
},
"paymentCurrency": {
"code": "MXN",
"name": "Mexican Peso",
"symbol": "$",
"decimalDigits": 2
},
"firstRate": {
"exchangeRate": 0.054,
"rateTime": "2026-06-01T00:00:00.000Z",
"originalAmount": 10000,
"convertedAmount": 540
},
"status": "approved",
"reasons": []
}Workflow options
| Workflow | Best for | Implementation pattern |
|---|---|---|
| Spreadsheet intake | Procurement teams collecting suppliers in Google Sheets or Excel before ERP upload. | Run a script or no-code step over each row, then write validation status and rateTime back to the sheet. |
| ERP vendor master import | Finance operations teams loading supplier CSV exports into ERP or AP systems. | Validate rows in middleware before import. Reject unsupported codes and attach evidence to accepted rows. |
| AP automation queue | Payables teams that approve supplier changes before invoice processing. | Trigger validation when the supplier status changes from draft to review or review to approved. |
| CPQ or procurement quote flow | Teams quoting supplier costs or pass-through services in a different reporting currency. | Store the policy date, pair, rateTime, and converted estimate beside the quote or sourcing event. |
| AI agent or orchestration run | Operations teams that triage supplier records with an internal assistant. | Let the agent call documented API endpoints through approved tooling, cite returned fields, and escalate ambiguous records. |
Controls that prevent AP rework
| Control | Evidence | Owner |
|---|---|---|
| Unsupported or mistyped code | Currency list lookup by code returns no supported active match. | Procurement operations |
| Invoice currency differs from payment currency | Both codes validate, but the supplier record requires approval notes and payment-policy review. | AP manager |
| Rounding and decimal mismatch | Currency metadata shows decimalDigits or rounding that conflicts with the ERP setup. | Finance systems |
| Historical policy date required | Contract, PO, or onboarding policy requires a date-specific rate lookup. | Finance controller |
| High validation traffic | Usage lookup or export shows duplicate calls from import jobs, scripts, or agents. | Engineering or RevOps |
Why finance teams care
Supplier currency evidence reduces manual AP research, keeps quote and invoice assumptions visible, and gives controllers a cleaner record when a vendor asks why a payment was reviewed or held.
Why developers care
The workflow is deterministic: validate codes, collect metadata, run a rate check, store returned fields, respect rate limits, and expose a retry path. That is easier to test than fixing supplier data after invoices land.
Internal links for the implementation path
- inspect the OpenAPI reference for currency, conversion, rate, key, and usage endpoints
- review the supported-currency list before choosing vendor-master defaults
- connect supplier currency checks to currency master-data controls
- carry validated supplier currencies into AP aging automation
- set governance rules for API keys, rate evidence, and workflow ownership
FAQ
Does Currency-Exchange.app publish native ERP, AP, spreadsheet, or no-code integrations?
No native ERP, AP automation, spreadsheet, no-code, CPQ, or MCP connector was verified on the public site, docs, or repo. This article describes API-based workflows using your own middleware, scripts, workers, or orchestration tools.
Is supplier currency onboarding the same as AP aging conversion?
No. Onboarding validates the supplier record before invoices arrive. AP aging conversion happens after invoices exist. The two workflows should share currency definitions, but they answer different operational questions.
Can this workflow process many suppliers at once?
Yes, but describe it accurately. The public OpenAPI reference documents single endpoint calls. Bulk onboarding can be implemented as queued, repeated, rate-limit-aware API calls unless a separate native bulk feature is verified for your plan.
When should historical rates be used during onboarding?
Use a historical date when the supplier record is tied to a contract date, PO date, migration date, or finance policy date. Use current lookup for a new operational readiness check.
Put currency checks before supplier activation
The cleanest AP workflow is the one that rejects bad currency data before the first invoice. Use the API reference to validate supported currencies, store rate evidence, and review usage as automation grows.