Skip to content

Trade Finance Rail

The Trade Finance Rail provides APIs for managing Letters of Credit (LC), bank guarantees, documentary collections, and trade presentations, aligned with UCP 600 international standards.

The Trade Finance Rail supports the complete documentary trade cycle:

CapabilityDescription
LC IssuanceIssue, amend, and manage Letters of Credit (UCP 600)
Document PresentationsReceive, review, and process trade presentations
Discrepancy ManagementIdentify, communicate, and resolve document discrepancies
SettlementInitiate and complete trade settlement

The Trade Finance Rail is aligned with:

StandardDescription
UCP 600ICC Uniform Customs and Practice for Documentary Credits (2007 rev.)
ISBP 821International Standard Banking Practice
eUCP 2.0Electronic supplement to UCP for digital presentations
SWIFT MT7xxSWIFT trade finance message standards
ISO 20022Financial messaging standard for trade finance
GET /api/v1/trade/presentations

Lists all documentary presentations for the authenticated tenant.

Query Parameters:

ParameterTypeDescription
statusstringFilter by status (received, under_review, accepted, rejected, discrepant)
lcIdstringFilter by Letter of Credit ID
fromDatestringFilter from presentation date (ISO 8601)
toDatestringFilter to presentation date (ISO 8601)
pagenumberPage number (default: 1)
perPagenumberItems per page (default: 20, max: 100)
POST /api/v1/trade/presentations

Registers a new documentary presentation under an LC.

Request Body:

{
"lcId": "lc_abc123",
"presentingBankBic": "RIBLSARIXXX",
"presentationDate": "2024-01-15",
"documents": [
{
"type": "commercial_invoice",
"documentNumber": "INV-2024-001",
"documentDate": "2024-01-12",
"amount": { "amount": 450000, "currency": "USD" },
"fileReference": "file_doc_001"
},
{
"type": "bill_of_lading",
"documentNumber": "BL-2024-001",
"documentDate": "2024-01-13",
"portOfLoading": "AEJEA",
"portOfDischarge": "SAJED",
"fileReference": "file_doc_002"
},
{
"type": "certificate_of_origin",
"documentNumber": "COO-2024-001",
"issuingAuthority": "Dubai Chamber of Commerce",
"fileReference": "file_doc_003"
}
],
"draftAmount": { "amount": 450000, "currency": "USD" },
"usanceTermDays": 90
}

Response:

{
"data": {
"id": "pres_xyz789",
"status": "received",
"lcId": "lc_abc123",
"presentationDate": "2024-01-15",
"expiryDate": "2024-01-19",
"documents": [
{
"type": "commercial_invoice",
"documentNumber": "INV-2024-001",
"status": "pending_review"
}
],
"draftAmount": { "amount": 450000, "currency": "USD" },
"discrepancyCount": 0,
"createdAt": "2024-01-15T08:00:00Z",
"updatedAt": "2024-01-15T08:00:00Z"
}
}
POST /api/v1/trade/presentations/{id}/review

Initiates the documentary examination process under UCP 600 Article 14.

Request Body:

{
"examinerUserId": "usr_trade_examiner_001",
"examinationStartedAt": "2024-01-15T09:00:00Z"
}
POST /api/v1/trade/presentations/{id}/accept

Accepts a compliant presentation and triggers payment or deferred payment.

Request Body:

{
"acceptanceNotes": "All documents comply with LC terms and UCP 600",
"paymentDueDate": "2024-04-15",
"maturityDate": "2024-04-15"
}

Response:

{
"data": {
"id": "pres_xyz789",
"status": "accepted",
"acceptanceDate": "2024-01-15",
"paymentDueDate": "2024-04-15",
"paymentAmount": { "amount": 450000, "currency": "USD" },
"updatedAt": "2024-01-15T14:00:00Z"
}
}
POST /api/v1/trade/presentations/{id}/reject

Refuses a discrepant presentation under UCP 600 Article 16.

Request Body:

{
"refusalNotice": "Documents refused for the following reasons",
"disposition": "holding_pending_instructions",
"discrepancyIds": ["disc_001", "disc_002"],
"noticeSentAt": "2024-01-16T10:00:00Z"
}
GET /api/v1/trade/presentations/{id}/discrepancies

Lists all identified discrepancies for a presentation.

Response:

{
"data": [
{
"id": "disc_001",
"presentationId": "pres_xyz789",
"documentType": "commercial_invoice",
"discrepancyCode": "AMOUNT_MISMATCH",
"description": "Invoice amount USD 450,000 does not match LC amount USD 445,000",
"severity": "blocking",
"status": "open",
"identifiedAt": "2024-01-15T11:00:00Z"
},
{
"id": "disc_002",
"presentationId": "pres_xyz789",
"documentType": "bill_of_lading",
"discrepancyCode": "LATE_SHIPMENT",
"description": "Shipment date 15 Jan 2024 is after latest shipment date 10 Jan 2024",
"severity": "blocking",
"status": "open",
"identifiedAt": "2024-01-15T11:05:00Z"
}
]
}
POST /api/v1/trade/discrepancies/{id}/resolve

Resolves a discrepancy, either by waiver or corrected document.

Request Body:

{
"resolutionType": "applicant_waiver",
"waiverReference": "WAIVER-2024-001",
"resolvedBy": "usr_trade_manager_001",
"resolvedAt": "2024-01-16T09:00:00Z",
"notes": "Applicant has accepted the discrepancy under waiver"
}
LC StatusDescription
draftLC application created, pending submission
submittedSubmitted to issuing bank for approval
approvedApproved, pending issuance
issuedLC issued and transmitted to advising/confirming bank
amendedLC amended with applicant/beneficiary agreement
expiredLC past expiry date, no further presentations allowed
cancelledLC cancelled prior to expiry
stateDiagram-v2
direction LR
[*] --> Received: Present Documents
Received --> UnderReview: Initiate Examination
UnderReview --> Accepted: Compliant Documents
UnderReview --> Discrepant: Discrepancies Found
Discrepant --> Accepted: Discrepancies Waived
Discrepant --> Rejected: Refusal Issued
Accepted --> SettlementInitiated: Trigger Payment
SettlementInitiated --> Settled: Payment Completed
classDef received fill:#1565c0,color:#fff,stroke:#1565c0
classDef review fill:#e65100,color:#fff,stroke:#e65100
classDef discrepant fill:#f57f17,color:#fff,stroke:#f57f17
classDef accepted fill:#2e7d32,color:#fff,stroke:#2e7d32
classDef settled fill:#1a5f4a,color:#fff,stroke:#1a5f4a
classDef rejected fill:#c62828,color:#fff,stroke:#c62828
class Received received
class UnderReview review
class Discrepant discrepant
class Accepted accepted
class SettlementInitiated accepted
class Settled settled
class Rejected rejected
CodeDescription
AMOUNT_MISMATCHDocument amount differs from LC or other document amount
LATE_PRESENTATIONDocuments presented after expiry or latest presentation date
LATE_SHIPMENTShipment date after latest shipment date in LC
INCOMPLETE_DOCUMENTSRequired documents missing from presentation
DESCRIPTION_MISMATCHGoods description does not match LC terms
PORT_MISMATCHPort of loading/discharge differs from LC terms
ENDORSEMENT_MISSINGRequired endorsements absent on transport documents
PARTIAL_SHIPMENTPartial shipment when LC prohibits it

The Trade Finance Rail emits the following webhook events:

EventDescription
trade.lc.createdLC application created
trade.lc.submittedLC submitted to issuing bank
trade.lc.approvedLC approved
trade.lc.issuedLC issued and transmitted
trade.presentation.receivedDocumentary presentation received
trade.presentation.reviewedExamination completed
trade.presentation.acceptedPresentation accepted, payment triggered
trade.presentation.rejectedPresentation refused
trade.discrepancy.openedDiscrepancy identified during examination
trade.discrepancy.resolvedDiscrepancy resolved (waiver or correction)
trade.settlement.initiatedSettlement/payment triggered for accepted docs
trade.settlement.completedSettlement completed
import { IOFClient } from "@iof/sdk";
const client = new IOFClient({ apiKey: process.env.IOF_API_KEY });
// Create a trade presentation under an existing LC
const presentation = await client.trade.presentations.create({
lcId: "lc_abc123",
presentingBankBic: "RIBLSARIXXX",
presentationDate: "2024-01-15",
documents: [
{
type: "commercial_invoice",
documentNumber: "INV-2024-001",
documentDate: "2024-01-12",
amount: { amount: 450000, currency: "USD" },
fileReference: "file_doc_001",
},
{
type: "bill_of_lading",
documentNumber: "BL-2024-001",
documentDate: "2024-01-13",
portOfLoading: "AEJEA",
portOfDischarge: "SAJED",
fileReference: "file_doc_002",
},
],
draftAmount: { amount: 450000, currency: "USD" },
});
// Begin examination
await client.trade.presentations.review(presentation.id, {
examinerUserId: "usr_trade_examiner_001",
});
// Accept compliant presentation
await client.trade.presentations.accept(presentation.id, {
acceptanceNotes: "All documents comply with LC terms",
paymentDueDate: "2024-04-15",
});
// Alternatively, check and resolve discrepancies
const discrepancies = await client.trade.presentations.discrepancies(
presentation.id,
);
for (const disc of discrepancies.data) {
await client.trade.discrepancies.resolve(disc.id, {
resolutionType: "applicant_waiver",
waiverReference: "WAIVER-2024-001",
});
}
from iof import IOFClient
client = IOFClient(api_key=os.environ["IOF_API_KEY"])
# Create presentation
presentation = client.trade.presentations.create(
lc_id="lc_abc123",
presenting_bank_bic="RIBLSARIXXX",
presentation_date="2024-01-15",
documents=[
{
"type": "commercial_invoice",
"document_number": "INV-2024-001",
"amount": {"amount": 450000, "currency": "USD"},
"file_reference": "file_doc_001",
}
],
draft_amount={"amount": 450000, "currency": "USD"},
)
# Review and accept
client.trade.presentations.review(presentation.id)
client.trade.presentations.accept(
presentation.id, acceptance_notes="Documents comply with LC terms"
)
# Retrieve discrepancies if any
discrepancies = client.trade.presentations.discrepancies(presentation.id)