Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 21 additions & 7 deletions .github/workflows/docs-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ jobs:
claude_args:
--allowedTools Bash,Read,Write,Edit,Glob,Grep,WebFetch
--model claude-opus-4-5-20251101
--max-turns 30
--max-turns 45
prompt: |
## Task: Documentation Sync Review

Expand Down Expand Up @@ -123,22 +123,36 @@ jobs:
- `mintlify/snippets/` - Shared content snippets
- `mintlify/platform-overview/` - Core concepts

4. **Check for Outdated References**
4. **Check Kotlin Sample App**
- Review `samples/kotlin/src/main/kotlin/com/grid/sample/routes/` for route handlers that reference changed schemas
- Check that request body construction matches current OpenAPI schemas (field names, required fields, enum values)
- Verify external account creation handlers support all current `ExternalAccountType` enum values from `openapi/components/schemas/external_accounts/ExternalAccountType.yaml`
- Check that webhook handling in `Webhooks.kt` matches current webhook schemas
- Check that quote creation in `Quotes.kt` includes all required fields
- Verify SDK method calls match the schema structure (e.g., beneficiary nested inside accountInfo, paymentRails included)

5. **Check Grid Visualizer Data**
- Review `components/grid-visualizer/src/data/account-types.ts` — account type keys and field specs must match `ExternalAccountType` enum values and their corresponding `*AccountInfo.yaml` schemas in `openapi/components/schemas/common/`
- Review `components/grid-visualizer/src/data/currencies.ts` — `accountType` values must match `ExternalAccountType` enum, `allRails` and `instantRails` must match the `paymentRails` enum values in each account info schema
- Review `components/grid-visualizer/src/data/crypto.ts` — crypto account types must match wallet types in the ExternalAccountType enum
- Review `components/grid-visualizer/src/lib/code-generator.ts` — generated API call bodies must match current request schemas (e.g., `accountInfo` structure, `paymentRails` inclusion, beneficiary format)

6. **Check for Outdated References**
- Look for hardcoded field names that may have changed
- Check for endpoint paths that may have been renamed
- Verify response structure descriptions match the schema

### Actions

If documentation updates are needed:
1. Make the necessary changes to keep docs in sync
If updates are needed in any area (docs, Kotlin sample, or Grid Visualizer):
1. Make the necessary changes to keep everything in sync with the OpenAPI schema
2. Run `npm run build:openapi` if you modified any files in `openapi/`
3. Create a PR with:
3. Create a single PR with all changes:
- Branch name: `docs/sync-$(date +%Y%m%d)`
- Clear title describing the sync
- Description listing what was updated and why
- Description listing what was updated and why, organized by area (docs, Kotlin sample, Grid Visualizer)

If documentation is already up to date:
If everything is already up to date:
- Output a brief summary confirming no updates needed
- Do not create a PR

Expand Down
156 changes: 126 additions & 30 deletions components/grid-visualizer/src/data/account-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,28 @@ export interface AccountFieldSpec {
export interface AccountTypeSpec {
accountType: string;
fields: AccountFieldSpec[];
paymentRails?: string[];
beneficiaryRequired: boolean;
purposeOfPaymentRequired?: boolean;
}

export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
US_ACCOUNT: {
accountType: 'US_ACCOUNT',
USD_ACCOUNT: {
accountType: 'USD_ACCOUNT',
fields: [
{ name: 'accountNumber', example: '123456789' },
{ name: 'routingNumber', example: '021000021' },
{ name: 'accountCategory', example: 'CHECKING', description: 'CHECKING or SAVINGS' },
],
paymentRails: ['ACH', 'WIRE', 'RTP', 'FEDNOW'],
beneficiaryRequired: true,
},
IBAN: {
accountType: 'IBAN',
EUR_ACCOUNT: {
accountType: 'EUR_ACCOUNT',
fields: [
{ name: 'iban', example: 'DE89370400440532013000' },
{ name: 'swiftBic', example: 'DEUTDEFF' },
],
paymentRails: ['SEPA', 'SEPA_INSTANT'],
beneficiaryRequired: true,
},
GBP_ACCOUNT: {
Expand All @@ -35,29 +37,42 @@ export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
{ name: 'sortCode', example: '20-00-00' },
{ name: 'accountNumber', example: '12345678' },
],
paymentRails: ['FASTER_PAYMENTS'],
beneficiaryRequired: true,
},
PIX: {
accountType: 'PIX',
BRL_ACCOUNT: {
accountType: 'BRL_ACCOUNT',
fields: [
{ name: 'pixKey', example: '55119876543210' },
{ name: 'pixKeyType', example: 'PHONE', description: 'CPF, CNPJ, EMAIL, PHONE, or RANDOM' },
{ name: 'taxId', example: '12345678901' },
],
paymentRails: ['PIX'],
beneficiaryRequired: true,
},
CLABE: {
accountType: 'CLABE',
MXN_ACCOUNT: {
accountType: 'MXN_ACCOUNT',
fields: [
{ name: 'clabeNumber', example: '123456789012345678' },
],
paymentRails: ['SPEI'],
beneficiaryRequired: true,
},
UPI: {
accountType: 'UPI',
INR_ACCOUNT: {
accountType: 'INR_ACCOUNT',
fields: [
{ name: 'vpa', example: 'customer@okbank' },
],
paymentRails: ['UPI', 'IMPS'],
beneficiaryRequired: true,
},
DKK_ACCOUNT: {
accountType: 'DKK_ACCOUNT',
fields: [
{ name: 'iban', example: 'DK5000400440116243' },
{ name: 'swiftBic', example: 'NDEADKKK' },
],
paymentRails: ['SEPA', 'SEPA_INSTANT'],
beneficiaryRequired: true,
},
NGN_ACCOUNT: {
Expand All @@ -66,6 +81,7 @@ export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
{ name: 'accountNumber', example: '0123456789' },
{ name: 'bankName', example: 'First Bank of Nigeria' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
purposeOfPaymentRequired: true,
},
Expand All @@ -76,6 +92,7 @@ export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
{ name: 'branchCode', example: '00012' },
{ name: 'accountNumber', example: '1234567' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
PHP_ACCOUNT: {
Expand All @@ -84,6 +101,7 @@ export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
{ name: 'bankName', example: 'BDO Unibank' },
{ name: 'accountNumber', example: '001234567890' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
SGD_ACCOUNT: {
Expand All @@ -93,6 +111,103 @@ export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
{ name: 'swiftCode', example: 'DBSSSGSG' },
{ name: 'accountNumber', example: '0123456789' },
],
paymentRails: ['PAYNOW', 'FAST', 'BANK_TRANSFER'],
beneficiaryRequired: true,
},
HKD_ACCOUNT: {
accountType: 'HKD_ACCOUNT',
fields: [
{ name: 'bankName', example: 'HSBC Hong Kong' },
{ name: 'accountNumber', example: '123456789012' },
{ name: 'swiftCode', example: 'HSBCHKHHHKH' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
IDR_ACCOUNT: {
accountType: 'IDR_ACCOUNT',
fields: [
{ name: 'accountNumber', example: '1234567890' },
{ name: 'bankName', example: 'Bank Central Asia' },
{ name: 'swiftCode', example: 'CENAIDJA' },
{ name: 'phoneNumber', example: '+6281234567890' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
KES_ACCOUNT: {
accountType: 'KES_ACCOUNT',
fields: [
{ name: 'phoneNumber', example: '+254712345678' },
{ name: 'provider', example: 'M-PESA', description: 'Mobile money provider' },
],
paymentRails: ['MOBILE_MONEY'],
beneficiaryRequired: true,
},
MYR_ACCOUNT: {
accountType: 'MYR_ACCOUNT',
fields: [
{ name: 'bankName', example: 'Maybank' },
{ name: 'accountNumber', example: '1234567890' },
{ name: 'swiftCode', example: 'MABORUMMYYY' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
RWF_ACCOUNT: {
accountType: 'RWF_ACCOUNT',
fields: [
{ name: 'phoneNumber', example: '+250781234567' },
{ name: 'provider', example: 'MTN', description: 'MTN or AIRTEL' },
],
paymentRails: ['MOBILE_MONEY'],
beneficiaryRequired: true,
},
THB_ACCOUNT: {
accountType: 'THB_ACCOUNT',
fields: [
{ name: 'bankName', example: 'Bangkok Bank' },
{ name: 'accountNumber', example: '1234567890' },
{ name: 'swiftCode', example: 'BKKBTHBK' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
TZS_ACCOUNT: {
accountType: 'TZS_ACCOUNT',
fields: [
{ name: 'phoneNumber', example: '+255712345678' },
{ name: 'provider', example: 'VODACOM', description: 'AIRTEL or VODACOM' },
],
paymentRails: ['MOBILE_MONEY'],
beneficiaryRequired: true,
},
VND_ACCOUNT: {
accountType: 'VND_ACCOUNT',
fields: [
{ name: 'bankName', example: 'Vietcombank' },
{ name: 'accountNumber', example: '1234567890' },
{ name: 'swiftCode', example: 'BFTVVNVX' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
ZAR_ACCOUNT: {
accountType: 'ZAR_ACCOUNT',
fields: [
{ name: 'accountNumber', example: '1234567890' },
{ name: 'bankName', example: 'Standard Bank' },
],
paymentRails: ['BANK_TRANSFER'],
beneficiaryRequired: true,
},
ZMW_ACCOUNT: {
accountType: 'ZMW_ACCOUNT',
fields: [
{ name: 'phoneNumber', example: '+260971234567' },
{ name: 'provider', example: 'MTN', description: 'TNM, AIRTEL, ZAMTEL, or MTN' },
],
paymentRails: ['MOBILE_MONEY'],
beneficiaryRequired: true,
},
SPARK_WALLET: {
Expand Down Expand Up @@ -137,23 +252,4 @@ export const accountTypeSpecs: Record<string, AccountTypeSpec> = {
],
beneficiaryRequired: false,
},
// --- Generic bank transfer account types (best-guess, confirm with API team) ---
...Object.fromEntries(
[
'XOF_ACCOUNT', 'XAF_ACCOUNT', 'GHS_ACCOUNT', 'KES_ACCOUNT', 'ZAR_ACCOUNT',
'BWP_ACCOUNT', 'TZS_ACCOUNT', 'UGX_ACCOUNT', 'MWK_ACCOUNT', 'ZMW_ACCOUNT',
'CNY_ACCOUNT', 'HKD_ACCOUNT', 'IDR_ACCOUNT', 'KRW_ACCOUNT', 'MYR_ACCOUNT',
'THB_ACCOUNT', 'VND_ACCOUNT', 'LKR_ACCOUNT', 'CRC_ACCOUNT', 'CDF_ACCOUNT',
].map((type) => [
type,
{
accountType: type,
fields: [
{ name: 'accountNumber', example: '0123456789' },
{ name: 'bankName', example: 'Local Bank' },
],
beneficiaryRequired: true,
} satisfies AccountTypeSpec,
]),
),
};
Loading