Skip to content

feat(transactions): add originator info to external funding source#544

Merged
pengying merged 1 commit into
mainfrom
06-03-feat_incoming_originator_info
Jun 3, 2026
Merged

feat(transactions): add originator info to external funding source#544
pengying merged 1 commit into
mainfrom
06-03-feat_incoming_originator_info

Conversation

@pengying
Copy link
Copy Markdown
Contributor

@pengying pengying commented Jun 3, 2026

Summary

Exposes structured originator (sender) information for externally-funded inbound (INCOMING) payments by generalizing the existing REALTIME_FUNDING transaction source into an External Funding Source and adding originator fields inline. Fields are modeled on ISO 20022 (pacs.008 / camt) debtor concepts, the shared vocabulary the underlying rails (ACH, wire, RTP, FedNow, Spark, Stables) map onto.

Why on this source

  • An external funding source only ever occurs on inbound payments (outgoing sources are the platform's internal accounts), so these fields are isolated to inbound — no leakage onto outgoing transactions.
  • Transactions and quotes use separate source schemas, so the quote source is untouched.
  • REALTIME_FUNDING already represents external funding across rails, so generalizing it (retitle + description) avoids an overlapping new source type.
  • Inbound senders are frequently unknown third parties never registered as an external account, so there is no externalAccountId — originator details are carried inline.

Changes to RealtimeFundingTransactionSource

  • Retitled to "External Funding Source"; description updated to "Transaction was funded using an external funding source."
  • sourceType discriminator value stays REALTIME_FUNDING (no enum/union change).
  • New optional, best-effort originator fields (availability varies by rail):
Field Notes
name Sender / debtor name
accountIdentifier Sender account number or IBAN (often masked)
bankName Originating bank name
bankIdentifier Routing number / BIC / SWIFT of originating bank
paymentRail Rail funds arrived on (reuses the existing PaymentRail enum)
remittanceInformation Unified addenda (ACH) / OBI (wire) / remittance (RTP, FedNow) / description
endToEndId Originator's own payment reference
traceNumber ACH trace number / wire IMAD/OMAD, for reconciliation

Out of scope

  • Originator postal address (deferred)
  • externalAccountId (senders may be unregistered)
  • Renaming the REALTIME_FUNDING discriminator value
  • Outgoing transactions, quotes, and the shared destination union (untouched)

🤖 Generated with Claude Code

@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 3, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
grid-flow-builder Ignored Ignored Preview Jun 3, 2026 9:41pm

Request Review

@pengying pengying marked this pull request as ready for review June 3, 2026 17:21
Copy link
Copy Markdown
Contributor Author

pengying commented Jun 3, 2026

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

✱ Stainless preview builds for grid

This PR will update the grid SDKs with the following commit messages.

cli

chore(internal): regenerate SDK with no functional changes

csharp

feat(api): add originator, payment rail, trace number fields to incoming transactions

go

feat(api): add payment rail and originator info to incoming transaction types

kotlin

feat(api): add originator, paymentRail, endToEndId, remittanceInformation, traceNumber fields

openapi

feat(api): add Originator model and payment metadata fields to inbound payment responses

php

feat(api): add originator, paymentRail, tracking fields to IncomingTransaction/webhooks

python

feat(api): add originator, payment_rail, trace_number, remittance fields to incoming_transaction

ruby

feat(api): add originator/payment_rail/trace_number/remittance_information to incoming_transaction

typescript

feat(api): add endToEndId, originator, paymentRail, remittanceInfo, traceNumber to transactions
grid-openapi studio · code

Your SDK build had at least one "note" diagnostic.
generate ✅

grid-ruby studio · code

Your SDK build had at least one "note" diagnostic.
generate ✅build ⏭️lint ✅test ✅

grid-kotlin studio · code

Your SDK build had at least one "note" diagnostic.
generate ✅build ⏭️lint ⏭️test ✅

grid-typescript studio · code

Your SDK build had at least one "note" diagnostic.
generate ✅build ⏭️lint ⏭️test ✅

⚠️ grid-python studio · code

Your SDK build had a failure in the test CI job, which is a regression from the base state.
generate ✅build ⏭️lint ⏭️test ❗

⚠️ grid-csharp studio · code

Your SDK build had a failure in the test CI job, which is a regression from the base state.
generate ⚠️build ⏭️lint ⏭️test ❗

⚠️ grid-go studio · code

Your SDK build had a failure in the lint CI job, which is a regression from the base state.
generate ✅build ⏭️lint ❗test ❗

go get github.com/stainless-sdks/grid-go@3c57d8e08b346c70bae25019048a837bc2e8ab96
grid-php studio · code

Your SDK build had at least one "note" diagnostic.
generate ✅lint ✅test ✅

⚠️ grid-cli studio · code

Your SDK build had a failure in the test CI job, which is a regression from the base state.
generate ⚠️build ⏭️lint ⏭️test ❗


This comment is auto-generated by GitHub Actions and is automatically kept up to date as you push.
If you push custom code to the preview branch, re-run this workflow to update the comment.
Last updated: 2026-06-03 22:05:31 UTC

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Jun 3, 2026

Greptile Summary

This PR generalizes RealtimeFundingTransactionSource into an External Funding Source and adds eight optional originator fields (accountHolderName, accountIdentifier, bankName, bankIdentifier, paymentRail, remittanceInformation, endToEndId, traceNumber) to expose sender information on inbound payments. The source schema in openapi/ is the only direct edit; both bundled outputs (openapi.yaml, mintlify/openapi.yaml) are consistent regenerations via make build.

  • Title and description updated from "Real-time Funding Source" to "External Funding Source"; the REALTIME_FUNDING discriminator value is preserved.
  • All new fields are optional and correctly excluded from the required array, matching the best-effort availability documented in the description.
  • paymentRail references the existing PaymentRail enum via allOf, covering ACH, WIRE, RTP, FEDNOW, SEPA/SEPA_INSTANT, SWIFT, and more.

Confidence Score: 5/5

Safe to merge — additive schema change with no breaking modifications to existing fields or discriminator values.

All changes are purely additive optional fields on an existing schema. The sourceType discriminator value is unchanged, existing required fields are untouched, and both bundled outputs are consistent with the source edit. No logic, auth, or data-mutation paths are involved.

No files require special attention.

Important Files Changed

Filename Overview
openapi/components/schemas/transactions/RealtimeFundingTransactionSource.yaml Source schema updated: title changed to "External Funding Source", eight optional originator fields added, and description updated — changes are structurally correct and all new fields are properly marked optional.
openapi.yaml Bundled root spec regenerated from source via make build; content is identical to the source changes in RealtimeFundingTransactionSource.
mintlify/openapi.yaml Mintlify-bundled copy regenerated in sync with the root bundle; no independent changes.

Class Diagram

%%{init: {'theme': 'neutral'}}%%
classDiagram
    class BaseTransactionSource {
        +sourceType: TransactionSourceType
        +currency: string
    }

    class RealtimeFundingTransactionSource {
        +sourceType: "REALTIME_FUNDING"
        +currency: string [required]
        +customerId: string [optional]
        +accountHolderName: string [optional]
        +accountIdentifier: string [optional]
        +bankName: string [optional]
        +bankIdentifier: string [optional]
        +paymentRail: PaymentRail [optional]
        +remittanceInformation: string [optional]
        +endToEndId: string [optional]
        +traceNumber: string [optional]
    }

    class PaymentRail {
        <<enumeration>>
        ACH
        WIRE
        RTP
        FEDNOW
        SEPA
        SEPA_INSTANT
        SWIFT
        PIX
        SPEI
        FASTER_PAYMENTS
    }

    class TransactionSourceOneOf {
        <<union>>
        AccountTransactionSource
        RealtimeFundingTransactionSource
        UMAAddressTransactionSource
    }

    BaseTransactionSource <|-- RealtimeFundingTransactionSource : extends (allOf)
    RealtimeFundingTransactionSource --> PaymentRail : paymentRail (allOf ref)
    TransactionSourceOneOf ..> RealtimeFundingTransactionSource : oneOf
Loading
Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
openapi/components/schemas/transactions/RealtimeFundingTransactionSource.yaml:45-52
The `remittanceInformation` description names the ACH Addenda, wire OBI, and RTP/FedNow fields, but the `PaymentRail` enum also includes `SEPA`, `SEPA_INSTANT`, `PIX`, `SWIFT`, `SPEI`, `FASTER_PAYMENTS`, and others. Developers integrating with those rails will find no guidance on where this field is sourced. Adding a brief catch-all phrase keeps the description accurate as more rails are supported.

```suggestion
      remittanceInformation:
        type: string
        description: >-
          Free-form information about the payment provided by the originator.
          The source field depends on the payment rail: the Addenda record for
          ACH, the OBI / beneficiary information for wires, the
          remittanceInformation field for RTP and FedNow, and the equivalent
          unstructured remittance field for other rails.
        example: '12345'
```

Reviews (4): Last reviewed commit: "feat(transactions): add originator info ..." | Re-trigger Greptile

Comment thread openapi/components/schemas/transactions/IncomingTransaction.yaml Outdated
@pengying pengying force-pushed the 06-03-feat_incoming_originator_info branch from 3bcc2db to d263e34 Compare June 3, 2026 18:07
@pengying pengying changed the title feat(transactions): expose originator information on inbound transactions feat(transactions): add EXTERNAL_ACCOUNT transaction source with originator info Jun 3, 2026
@github-actions github-actions Bot added the breaking-change Introduces a breaking change to the OpenAPI spec label Jun 3, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

⚠️ Breaking OpenAPI changes detected

This PR introduces breaking changes to openapi.yaml:

API Changelog 2025-10-13 vs. 2025-10-13

API Changes

PATCH /config

  • ⚠️ removed the enum value ID_NUMBER of the request property supportedCurrencies/items/providerRequiredCounterpartyCustomerFields/items/
  • ⚠️ removed the enum value ID_NUMBER of the request property supportedCurrencies/items/providerRequiredCustomerFields/items/
  • ⚠️ removed the enum value ID_NUMBER of the request property supportedCurrencies/items/requiredCounterpartyFields/items/name
  • ⚠️ removed the enum value ID_TYPE of the request property supportedCurrencies/items/providerRequiredCounterpartyCustomerFields/items/
  • ⚠️ removed the enum value ID_TYPE of the request property supportedCurrencies/items/providerRequiredCustomerFields/items/
  • ⚠️ removed the enum value ID_TYPE of the request property supportedCurrencies/items/requiredCounterpartyFields/items/name

POST webhook:incoming-payment

  • ⚠️ removed the enum value ID_NUMBER of the request property allOf[subschema #2]/data/allOf[subschema #2]/requestedReceiverCustomerInfoFields/items/name
  • ⚠️ removed the enum value ID_TYPE of the request property allOf[subschema #2]/data/allOf[subschema #2]/requestedReceiverCustomerInfoFields/items/name

Detected by oasdiff. This PR will need approval from an API reviewer before merge.

@pengying pengying force-pushed the 06-03-feat_incoming_originator_info branch from d263e34 to 7b73705 Compare June 3, 2026 21:13
@pengying pengying changed the title feat(transactions): add EXTERNAL_ACCOUNT transaction source with originator info feat(transactions): add originator info to external funding source Jun 3, 2026
@pengying pengying force-pushed the 06-03-feat_incoming_originator_info branch 2 times, most recently from 642587d to ad8d90c Compare June 3, 2026 21:40
Generalize the REALTIME_FUNDING transaction source into an External Funding
Source and add inline originator information for externally-funded inbound
payments: name, accountIdentifier, bankName, bankIdentifier, paymentRail,
remittanceInformation, endToEndId, and traceNumber.

Modeled on ISO 20022 debtor concepts. Lives on the funding source (not the
transaction) because an external funding source only occurs on inbound
payments, which isolates these fields to inbound without affecting outgoing
transactions or quotes. Inbound senders may be unregistered third parties, so
all originator fields are optional.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@pengying pengying force-pushed the 06-03-feat_incoming_originator_info branch from ad8d90c to b293757 Compare June 3, 2026 21:41
@pengying pengying merged commit 2fa1417 into main Jun 3, 2026
10 checks passed
@pengying pengying deleted the 06-03-feat_incoming_originator_info branch June 3, 2026 21:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking-change Introduces a breaking change to the OpenAPI spec

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants