Alpha — Data requirements

What a bank data team must upload for one book at one as-of date. Parquet (preferred) or CSV only. JSON / JSONL is not an accepted bank input.

Canonical spec: Doc 51. Header-only templates: templates/ (Excel = input header + structure field list; CSV = header only). Field list, keys, and M/O/C: the Structure tab on this page. Print this page for a PDF.

1. Audience and purpose

You are assembling one book (one restatement of the bank’s credit-risk stock) at one as-of date. Alpha loads that book once, checks it, and calculates capital on it.

Send tabular files only: Parquet (preferred) or CSV. JSON and JSONL are not accepted bank inputs.

This page specifies reference data (product types, customer types, counterparty types, FX, legal entities, banking groups, solo / group perimeters) and volume data (customers, exposures, facilities, CRM, netting, ratings). Supervisor grids are not book files — see §11.

2. How to send a book

2.1 Folder

…/t=YYYY-MM-DD/<stock_id>/input/<stem>.parquet
# or the same stem with .csv
PieceMeaning
t=YYYY-MM-DDAs-of date of the book. Date only, no time-of-day.
<stock_id>Your restatement name (pilot-2026q2, …).
input/Every bank table lives here.
<stem>Table name (customers, exposures, products, …).

The folder path is the as-of and stock identity. Do not send manifest.json or bank_trees.json. Alpha writes envelope.json (file hashes and counts) after it reads your tables.

One extension per stem. If both .parquet and .csv exist for the same stem, Parquet wins.

2.2 Minimum files

bank_entities
Legal / booking entities
customers
Who owes or guarantees
exposures
The deals

Send with them whenever they apply: banking_groups, consol_scopes (named solo / group views), fx_rates (any non-base currency), products (if product_id is used), customer_types (CIF class).

Strongly expected for a complete credit book: facilities, ratings, CRM files, and netting files when you have derivatives or SFTs.

3. Formats

Bank upload = Parquet or CSV only. JSON is not an accepted bank input (no .json, no .jsonl). Git fixtures inside Alpha may still use JSONL; that is internal only.

RuleValue
EncodingUTF-8
CSVRFC 4180; header = snake_case column names; comma separator; " quoting
Decimal. (period). No thousands separators.
Booleantrue / false. Empty = null.
DatesYYYY-MM-DD only. No time-of-day.
Amounts64-bit float; at most 4 decimal places.
Percentages / ratios0–1, not 0–100. CCF, LTV, consol_pct, PD, LGD.
CurrencyISO 4217 (EUR, USD).
StringsLatin + Western European accents.
Empty cellNull. Do not send NA or - for missing.
Many identifiersOne relationship is one row (§3.2). A list cell is still read for the columns held there: JSON array ["Loan","Revolver"], comma-separated Loan,Revolver, or a JSON array of objects. That cell is interchange.

M Mandatory · O Optional · C Conditional (see Notes).

3.2 One relationship, one row

Source systems store a parent identifier and each related identifier as separate records. A cell that holds a JSON array, or a comma-separated list of identifiers, is that relationship folded into one field. The upload model is the records: the header keeps the parent, and each related identifier is one row on an association table.

mitigants.provider_id is already one foreign key to customers.id. It stays one column.

banking_group_supervisors is read. Its rows compile into the supervisor list already on the banking group. The other tables in this section are not read yet. Calculate still sees their list cell. Those templates keep the cell until the row file is loaded. Send the list cell until then.

3.2.1 List columns on the current templates

TemplateColumnCell type todayOne elementTarget table
facilitieseligible_product_idslist of product_idOne drawable productfacility_products
facilitieseligible_product_weightslist of floatWeight lined up with the product listweight on that product row
crm_scopesexposure_keyslist of deal keysOne exposurecrm_scope_members
crm_scopescustomer_idslist of stringOne customer, no descendantscrm_scope_members (expand_descendants empty)
crm_scopestree_node_idslist of stringOne customer plus descendantscrm_scope_members (expand_descendants true)
crm_scopesfacility_idslist of facility keysOne facility rootcrm_scope_members
exposure_poolsproduct_idslist of product_idOne product in the poolexposure_pool_products
input_setsmemberslist of deal keysOne exposure in the setinput_set_members
input_setsmember_prefixeslist of stringsOne deal-id prefix (a match rule)input_set_prefixes

Already one row per relationship: banking_group_supervisors (read), consol_scope_members, customer_links, crm_links, netting_members, exposure_derivative_legs, intragroup_links, customer_aliases. An older banking_groups file may still send a supervisor_set_ids cell. When rows are also present, the rows are kept and the cell is reported.

3.2.2 Suggested tables

Natural key is the pair of identifiers, so the same child is not attached twice. Full columns are in Doc 51 §3.2.

TableReplacesOne row
banking_group_supervisorssupervisor_set_idsgroup_id + supervisor_set_id. reporting_supervisor_set_id stays on the header.
facility_productseligible_product_ids, eligible_product_weightsbooking_entity_code + facility_agreement_id + product_id, optional weight.
crm_scope_membersthe four lists on crm_scopesscope_id plus one target: a deal, a customer (expand_descendants for the group node), or a facility root. crm_links stays mitigant → target.
exposure_pool_productsproduct_idspool_id + product_id.
input_set_membersmembersset_id + booking_entity_code + deal_id.
input_set_prefixesmember_prefixesset_id + deal_id_prefix. A prefix is a match rule, not a foreign key.

4. File catalog

Reference / perimeter

StemNatural keyRole
productsproduct_idProduct catalogue. Volume rows store an index into this list.
customer_typescustomer_type_idBank CIF / CRM class (MassRetail, MidCorporate, …).
fx_ratesccy at this as-ofStock FX observation Calculate should use.
bank_entitiesbank_entity_codeLegal / booking entities. Parent via parent_bank_entity_code.
banking_groupsgroup_idConsolidating group header. Table, not a JSON tree.
banking_group_supervisorsgroup_id + supervisor_set_idOne supervisor the group can be walked under. The reporting pin stays on the header.
consol_scopesscope_idNamed view roots (group / sub-group / solo). Table.
consol_scope_membersscope_id + bank_entity_codePer-view membership override. Send it only when the bank_entities tree cannot say it.

Volume

StemNatural keyRole
customersidObligors, guarantors, issuers. Bank-chosen spelling.
customer_linkschild_idCounterparty hierarchy edges (child → parent).
exposures(booking_entity_code, deal_id)Deals / leaves.
facilities(booking_entity_code, facility_agreement_id)Credit-line tree.
ratingsrating_idGrades on a customer or exposure.
mitigantsmitigant_idGuarantees, CR derivs, financial collateral.
crm_scopesscope_idOptional pool a CRM covers.
crm_linksmitigant + targetMitigant → exposure or scope.
security_positionsposition_idCollateral lots.
netting_setsnetting_set_idClose-out netting / SFT header.
netting_membersset + dealSet membership.
exposure_derivativessame as exposureThin CCR extension.
exposure_sftssame as exposureRepo / reverse-repo / SBL.
exposure_poolspool_idModeling-team PD/LGD pools.
intragroup_linkslink_idMatched pairs for elimination.
input_setsset_idSoft membership. Not the legal-entity tree.
consolidation_measuressubject + measureObligor sales / assets for SME tests.

5. Names that look similar and are not

WordWhat you sendNot
Customer typeBank CIF / CRM class in customer_typesBasel / CRE20 class
Supervisor class / CRE20 classMapped Basel class for one pack run. Pack customer_class_map, not a book field.A column on customer_types or on the customer
Legal entitybank_entities — who booksA customer (obligor)
CustomerWho owes or guaranteesA booking company
Banking groupbanking_groups headerA login organisation
Consol scopeNamed perimeter (solo / group)Trading-book vs banking-book
Book / stockThe whole folder at as-of tA trading book; a desk blotter

Bank side ≠ obligor side. A legal entity may also appear as a customer via optional customer_id on bank_entities. That is a pointer, not a second tree.

6. Reference data the bank supplies

Alpha will not invent product types, CIF classes, FX, or legal-entity perimeters from deals alone.

6.1 Product types — products

A product is a type of exposure the bank books (CreditCard, ResidentialMortgage, LetterOfCredit, Repo, …). It is a catalogue. Volume exposures store an index into this list, not a per-row CCF string.

FieldM/O/CTypeNotes
product_idMstring, uniqueNatural key.
labelOstringDisplay name. Defaults to product_id.
default_exposure_typeOenumDefault ONBS.
facility_drawableObooltrue ⇒ may appear on facilities.eligible_product_ids.
ccf_advOratio 0–1Bank own CCF estimate. Read only when the approach is AIRB (IRBA). STD and FIRB never use it.
lgd_advOratio 0–1Bank own LGD. Priority when the approach is AIRB and the row is not on a retail pool.
ofb_classOstringOff-balance class. Supervisor CcfGrid OFB_CLASS key.

exposures.product_id → this list. STD and FIRB read the credit conversion factor from the supervisor grid keyed by ofb_class. A product with no class takes the pack fallback row, and the run logs it. STD and FIRB never read ccf_adv. AIRB takes ccf_adv first. AIRB also takes lgd_adv when the row is not on a retail pool. Do not paste a CCF onto every loan row.

6.2 Customer types

Customer type = the bank’s own CIF / CRM commercial class. Catalogue file customer_types. Examples: MassRetail, MassAffluent, MidCorporate, LargeCorporate, CorrespondentBank.

Supervisor class / CRE20 class is not a book field. At Calculate the supervisor pack customer_class_map maps the customer’s CIF code onto a CRE20 class and stores it on the result plane. Do not send a family or a Basel hint on customer_types.

customer_types

FieldM/O/CTypeNotes
customer_type_idMstringNatural key.
labelOstringDisplay name.

On the customer: customer_type (FK to this catalogue). Calculate looks that code up in the pack map.

6.3 Exchange rates — fx_rates

Send the stock observation at as-of t: the rates you want this book calculated with.

FieldM/O/CTypeNotes
ccyMISO 4217Natural key at this as-of.
rate_to_baseMfloatUnits of base per 1 unit of ccy. Base itself is 1.0.
base_ccyOISO 4217Reporting / group currency (often EUR).
as_ofOdateShould match the folder t=.
versionOstringOptional restatement label.

Convert path: (1) stock fx_rates you upload here → (2) Market pack published FX (Doc 23) if the stock has no row. A currency in neither is DQ_FX_MISSING; the supervisor pack carries no FX. Do not mix these. Duplicate ccy at the same as-of → DQ_REF_DUP; consumers block.

If every amount is already in the base currency you may omit this file. Otherwise send a row for each used code and the base.

6.4 Legal entities — bank_entities

A legal entity is a booking / consolidating node on the bank side. It is not a Customer. Parent tree: parent_bank_entity_code on the same table. There is no bank_trees.json for the bank to send.

FieldM/O/CTypeNotes
bank_entity_codeMstringNatural key (BE-PARIS).
group_idMstring FK→ banking_groups.
nameMstringLegal name.
leiOstring
jurisdictionMISO country
institution_kindMenumbank insurance investment_firm holding other.
entity_roleMenumparent sub branch booking_entity.
parent_bank_entity_codeCstring FKEmpty on the group root. Must exist otherwise. No cycles.
consol_methodMenumfull proportional not_consolidated.
consol_pctCratio 0–1Mandatory when consol_method = proportional.
customer_idOstring FKIf this LE also appears as a party (customers.id).

Every exposure must have booking_entity_code pointing here (BookedOn). Missing booking entity is blocking.

6.5 Sets for conso vs solo — banking_groups + consol_scopes

These are perimeters, not a trading-book vs banking-book split. Send them as tables (Parquet or CSV). A CalculationSet pins a ConsolScope, a solo legal entity, or a group root. It does not copy the book.

banking_groups

FieldM/O/CTypeNotes
group_idMstringNatural key.
nameMstring
reporting_supervisor_set_idOstringDefault supervisor pin. Not a grid file.

Supervisors the same stock can be walked under are banking_group_supervisors, one row each. An older file may still carry a supervisor_set_ids list cell. Ingest still reads that cell. When the association file also names supervisors for that group, the rows are kept and the cell is reported.

banking_group_supervisors

One supervisor the group can be walked under is one row. reporting_supervisor_set_id stays on the header.

FieldM/O/CTypeNotes
group_idMstring FK→ banking_groups.group_id.
supervisor_set_idMstringSupervisor pack id. Not a grid file.

Natural key (group_id, supervisor_set_id). A second row for the same pair, an empty key, or a group_id that is not on banking_groups is rejected with its reason and reported in Data Quality. The rows compile into the supervisor list already on the group.

consol_scopes

FieldM/O/CTypeNotes
scope_idMstringVIEW-GROUP, VIEW-SOLO-FR.
group_idMstring FK→ banking_groups.
root_bank_entity_codeMstring FKWalk starts here.
labelMstringGroup consolidated, Solo France.
supervisor_set_idOstringOptional override for this view.

Group view — root = holdco; children enter by consol_method (full weight 1, proportional × consol_pct, not_consolidated stay in the tree but out of the view). Solo — root = that booking entity. Do not invent synthetic legal entities to mean “this calculation”.

BankingGroup AURELIA-GROUP
  └── BE-HOLDCO     parent, holding
        ├── BE-FR             booking entity (books deals)
        └── BE-NL             booking entity
consol_scopes: VIEW-GROUP (BE-HOLDCO), VIEW-SOLO-FR, VIEW-SOLO-NL

consol_scope_members

Send this only when you need it. consol_method / consol_pct on bank_entities give one tree and one weight per entity, which is enough whenever every view weights an entity the same way. It is not enough when the same entity is full in one view, proportional in a second and out of a third — a joint venture at 50 % for the group and 100 % in a national sub-consolidation, or an entity a second regulatory perimeter draws outside the line.

FieldM/O/CTypeNotes
scope_idMstring FK→ consol_scopes.
bank_entity_codeMstring FK→ bank_entities. Must belong to the scope's group_id.
consol_methodMenumfull · proportional · not_consolidated.
consol_pctCdecimal 0–1Required when consol_method = proportional.

The tree under the scope's root still generates the membership; each row overrides the one entity it names and leaves the rest of the walk alone. not_consolidated takes that entity out of this view only, so taking an entity out is always written down and a short list never narrows a view by omission. One row per (scope_id, bank_entity_code): a second row, a row naming an entity of another banking group, or a row naming an entity or scope that does not exist is rejected with its reason and reported in Data Quality.

consol_scope_members:   # only where a view differs from the tree
  VIEW-GROUP  BE-JV50  proportional 0.50
  VIEW-NAT    BE-JV50  full

7. Volume tables

7.1 customers

FieldM/O/CTypeNotes
idMstringNatural key. Bank-chosen spelling (an LEI may sit inside id; Calculate does not require LEI).
legal_nameMstring
customer_typeCstring FK→ customer_types. Calculate maps this through the pack.
countryMISO countryImmediate party country.
sectorOstring

7.1a customer_links

FieldM/O/CTypeNotes
child_idMstring FK→ customers.id. One parent per child.
parent_idMstring FK→ customers.id. Immediate parent.

Hierarchy is not on the customer row. No tree_id: one forest via these links. A CRM group cover targets a parent id and expands descendants.

7.2 exposures

FieldM/O/CTypeNotes
booking_entity_codeMstring FKBookedOn. Blocking if missing.
deal_idMstringUnique with booking entity.
customer_idMstring FKObligor → customers.id. Missing → reject.
facility_agreement_idOstringWith booking entity → facilities.
drawn_amountMamountInstrument currency.
currencyMISO 4217
exposure_type_srcMenum
product_idCstring FK→ products.
exposure_pool_idCstring FKRetail book → modeling-team pool.
intragroup_candidateOboolDefault false.
related_bank_entity_codeOstring FK
elimination_classOstring
sl_subtypeCenumAlias sl_type. Required for SL.
sl_treatmentOenumSL_SLOTTING SL_IRB SL_STD.
slot_gradeOstringAlias sl_slot_grade.
residual_maturity_yearsOfloat
ltvOratio 0–1Not percent.
preferentialOboolAlias sl_preferential.
re_bucketOenumrre cre adc other_re.
adc_flagObool
specific_provisionOamountEmpty ≠ 0.
write_offOamount
value_adjustmentOamount

7.3 facilities

FieldM/O/CTypeNotes
booking_entity_codeMstring FK
facility_agreement_idMstring
parent_facility_agreement_idOstringNo cycles.
facility_styleMenumnone committed revolving.
limit_amountMamount
currencyMISO 4217
eligible_product_idsClistRequired when residual undrawn > 0. Target rows: facility_products (§3.2).
eligible_product_weightsOlistParallel to ids. Target: weight on that product row.
undrawn_product_idOstring FK
undrawn_product_policyOenum
ead_roleOenumleaf aggregate.

7.4 ratings

FieldM/O/CTypeNotes
rating_idMstring
subject_typeMenumcustomer exposure security.
subject_idMstringLEI:… or SCHEME:code or BE-PARIS/LN-1 or SEC-OAT-2031.
sourceMenumexternal internal.
agencyOstring
system_idMstring
grade_rawMstring
grade_normalisedOstring
pd_impliedOratio 0–1
valid_from / valid_toOdate

7.5 CRM

mitigants

FieldM/O/CTypeNotes
mitigant_idMstring
typeMenumguarantee cr_deriv financial_collateral sft_collateral onbs_netting. Alias mitigant_type.
provider_idCFK → customers.idRequired for guarantee and cr_deriv. Guarantor must be a Customer. Legacy provider_lei / party pair still accepted on ingest.
scope_idOstring FK
position_idOstring FKCollateral lot.
amount_or_valueMamount
currencyMISO 4217
priorityOintegerDefault 0.
collateral_classOstring

crm_links

FieldM/O/CTypeNotes
mitigant_idMstring FK
scope_idCstring FKEither a scope or a deal.
booking_entity_code + deal_idCstringOne exposure.

security_positions

FieldM/O/CTypeNotes
position_idMstring
isinMstring
market_valueMamount
currencyMISO 4217
mitigant_idMstring FK→ mitigants.

7.6 Netting

netting_sets

FieldM/O/CTypeNotes
netting_set_idMstring
customer LEI / partyCFKCounterparty.
booking_entity_codeMstring FK
agreement_typeOenumISDA GMRA GMSLA CSA OTHER.
set_typeOenumderiv sft mixed.
formula_idOenumCEM SA_CCR.
legal_netting_flag / close_out_nettingObool
set_ccy / CSA / haircut fieldsOsee Doc 51Do not send hedging-set master data.

netting_members

FieldM/O/CTypeNotes
netting_set_idMstring FKSource of truth for membership.
booking_entity_codeMstring
deal_idMstringMust exist on exposures.

exposure_derivatives

FieldM/O/CTypeNotes
booking_entity_code + deal_idMsame as exposure
netting_set_idOstring FKAlso seeds a member if missing.
cem_asset_class / asset_classOenumIR FX GOLD EQUITY PRECIOUS_METAL OTHER_COMM CREDIT.
notional / current_mvMamount
residual_maturity_yearsMfloat
currency / quote_currency / issuer / reference_name / commodity_groupO
written_offObool
directionOenumpay receive buy sell buy_protection sell_protection. Which side of the trade you are on; on an option send buy / sell. SA-CCR signs the effective notional with it, so two offsetting trades in one hedging set cancel; without it they add.
start_dateOdateStart of the trade's risk period — SA-CCR S, and the exercise date on an option. A trade already running sends its original start. Empty = no supervisory duration.
option_type / strike / underlying_price / implied_volCenum · numberOption terms, on this same file. call or put plus all three numbers — a supervisory delta cannot be formed from a subset. Empty on a linear trade.

Frozen target columns and tables

Some columns, and the securities and customer_aliases tables, are in this contract ahead of the calculation that reads them. They are accepted, stored and link-checked today, and they move no number in this release. Mapping a column is the slow part of onboarding, not storing it — sending them now means your book already carries what the calculation will need, with no second mapping exercise. The engine-side register is Doc 65.

WhatWhereWhat is still owed
drawn_amount_basisexposures / manifest.csvWhether your balance already includes accrued interest or fees. Until Alpha reads it, it cannot catch an EAD formula that counts them twice — check the basis yourself before asking for an additive formula.
start_date / trade_dateexposuresVintage / cohort reporting; original-maturity CCF variants.
security_id / quantitysecurity_positions, exposure_sftsThe supervisory haircut keyed on issuer class × residual maturity × credit quality. Today Alpha uses the haircut you send.
securitiestableThe security catalogue those keys point at. Loaded and shown in the Browser; no calculation reads it.
customer_aliasestableMerging two spellings of one obligor. Loaded and not applied: two ids stay two customers.

exposure_derivative_legs

Only for a trade with more than one leg — a cross-currency swap, a multi-leg structure. A single-leg trade sends nothing here: its exposure_derivatives row already is its leg. A leg is not a second deal: the trade stays one row in the results, with one obligor, one netting-set membership and one market value.

FieldM/O/CTypeNotes
booking_entity_code + deal_idMsame as exposureThe deal must also carry an exposure_derivatives row.
leg_noMintegerUnique inside the deal. A repeat is reported and the first wins.
leg_typeOenumfixed float. Describes the leg; it does not pick the hedging set.
directionOenumThis leg's side. Empty takes the trade's.
asset_classOenumThe leg's own class when it differs from the trade's — the FX leg of a cross-currency swap. Empty takes the trade's.
currency / notionalMISO 4217 · amountThis leg's own currency and notional. The currency pair is read from the other leg.
start_date / maturity_date / residual_maturity_yearsOdate · floatThis leg's own S and E. Empty takes the trade's.

Each leg becomes one effective notional in its own hedging set; the trade's market value is counted once. Alpha does not invent a contribution you did not send — a cross-currency swap that should carry two interest-rate legs and an FX pair sends three legs, and a trade whose legs span two currencies with no FX leg is reported rather than silently given one.

exposure_sfts

FieldM/O/CTypeNotes
booking_entity_code + deal_idM
directionOstringrepo …
cash_leg / security_valueMamount
haircut_e haircut_c haircut_fxOratio
residual_maturity_years / currency / netting_set_idO

7.7 exposure_pools

FieldM/O/CTypeNotes
pool_idMstring
descriptionMstring
pd / lgdMratio 0–1
retail_product_hintOenumqrre mortgage student_loan tax_loan other.
product_idsOlistTarget rows: exposure_pool_products (§3.2).

7.8 intragroup_links

FieldM/O/CTypeNotes
link_idMstring
booking_entity_code_a + deal_id_aMLeg A.
booking_entity_code_b + deal_id_bOLeg B.
link_roleMstringloan_deposit …
match_statusMstringmatched …

7.9 input_sets

Soft membership only (portfolio, IRB permission). Not the legal-entity tree and not trading-book vs banking-book.

FieldM/O/CTypeNotes
set_idMstring
set_typeMenumportfolio book irb_permission …
nameMstring
methodOenumSTD FIRB AIRB …
members / member_prefixesOlistTarget rows: input_set_members and input_set_prefixes (§3.2).

7.10 consolidation_measures

FieldM/O/CTypeNotes
subject_idMstringCustomer key spelling.
measureMenumsales total_assets.
amountMamount
currencyMISO 4217
scopeOstring

8. Relationships / entity diagram

Typed links after ingest. An edge is not a fourth file you send — it is implied by the columns. This page draws the diagram. Boxes show the natural key (PK) and the columns that make the edges (FK). Lines carry crow’s-foot marks and (1,1) (1,n) (0,1) (0,n). Drag a box to rearrange. − and + change the drawing sheet (A4 through A0). The rotate glyph switches portrait and landscape. The expand glyph fills the browser with the diagram and scales it to that space; the same glyph, or Escape, returns the size the diagram had on the page. Zoom changes how large the ink looks. Show / hide tables. Save my view keeps this browser’s layout, including the sheet. Download my view writes a .drawio of that layout. The full field list is Structure. It is a picture of your files, not a second copy of the book in memory.

Download published file Published landscape Same file in diagrams.net (draw.io) — open source, Apache 2.0, free desktop or VS Code. No extra origin.

Show / hide tables

Banking groups and legal entities book the deals; customers owe. Products, customer types, and FX rates are catalogues the volume rows point at. consol_scopes name a view root on the legal-entity tree — they are not extra companies.

RelationFrom → ToCardinalityYour column
BookedOnBankEntity → Exposure(1,1) — (1,n)exposures.booking_entity_code (required)
ObligorOfCustomer → Exposure(1,1) — (1,n)customer LEI / party
ChildOfFacilityFacility → Exposure(1,1) — (0,n)facility_agreement_id
ParentOfFacilityFacility → Facility(1,1) — (0,n)parent_facility_agreement_id
ChildOfBankEntityBankEntity → parent(1,1) — (0,n)parent_bank_entity_code
ConsolScope rootConsolScope → BankEntity(0,n) — (1,1)root_bank_entity_code
Product indexProduct → Exposure(1,1) — (0,n)product_id
MemberOfExposurePoolExposurePool → Exposure(1,1) — (0,n)exposure_pool_id
ProvidedByCustomer → Mitigant(1,1) — (0,n)provider LEI / party
MemberOfNettingExposure → NettingSet(0,n) — (0,n)netting_members

9. Constraints

RuleEffect
Unique natural keys in a table at this as-ofDuplicate → reject sibling + DQ_REF_DUP
booking_entity_code on every exposureMissing → block
Obligor on every exposureMissing → reject missing_obligor
FKs must resolveDQ_BROKEN_LINK
No parent cycles (LE / facility)Reject / DQ
consol_pct in 0–1 when proportionalElse DQ
Guarantor / CR-deriv provider is a CustomerDQ_REQUIRED / DQ_BROKEN_LINK
Facility with residual undrawn has eligible productsDQ_FACILITY_NO_PRODUCT
Enumerations in §10Unknown → DQ_ENUM
One FX row per currency at tDuplicate → consumers block
Percentages 0–1; amounts ≤ 4 dpOut of range / rounded at ingest

Alpha never overwrites your input files.

10. Enumerations

ListValues
Counterparty typeBANK CORP SME GOV PSE RETAIL NBFI MULTILATERAL INDIVIDUAL
Exposure typeONBS OFFBS DERIV SFT RRE CRE SL EQUITY SECURITISATION OTHER
SL subtypeSL_PF SL_OF SL_CF SL_IPRE SL_HVCRE
SL treatmentSL_SLOTTING SL_IRB SL_STD
MethodSTD FIRB AIRB SL_SLOTTING SL_STD
Facility stylenone committed revolving
Institution kindbank insurance investment_firm holding other
Entity roleparent sub branch booking_entity
Consol methodfull proportional not_consolidated
CRM typeguarantee cr_deriv financial_collateral sft_collateral onbs_netting
RE bucketrre cre adc other_re
CEM asset classIR FX GOLD EQUITY PRECIOUS_METAL OTHER_COMM CREDIT
Trade directionpay receive buy sell buy_protection sell_protection
Option typecall put
Leg typefixed float
Netting agreementISDA GMRA GMSLA CSA OTHER
CCR formulaCEM SA_CCR

11. What Alpha does not take from the bank as book files

You might think to sendActually
SupervisorSet grids (RW, CCF, haircut, CEM add-on, …)Explorer → Supervisor. Not input/.
Market pack (published FX)Explorer → Market. Distinct from stock fx_rates.
Hedging-set registerSA-CCR computes hedging sets.
CalculationSet recipeChosen at Calculate. Not a book table.
manifest.json / envelope.jsonFolder path carries as-of and stock_id. Alpha writes the envelope.
Nested JSON treesParent columns on tables. Consol views are consol_scopes tables.
Trading-book vs banking-book flagOut of engine scope.

12. Templates (Excel + CSV)

Header-only files — not example rows. Fill them; save as CSV (UTF-8) or convert to Parquet. Do not rename columns. Dashboard Data → Structure shows each table’s natural key, field list, and constraints.

Download Excel template is a workbook with two sheets: input (the upload header) and structure (the same field dictionary as this page — role, natural key, when to send, constraints, M/O/C, Field / Key / Type / Notes). The workbook is a fill-in aid. Do not upload it — bank send is still Parquet or CSV.

These files are already on this server (same copy as git). Open a name to see its fields, keys, and M/O/C on the Structure tab. CSV saves the header to Downloads — copy it into the book’s input/. You do not pull from git first.

Index: templates/.

Appendix A — Relationships

Picture of your files, not a second copy of the book in memory.

Bank side (who books / consolidates)          Obligor side (who owes)
  banking_groups                             customers
       │                                      │
  bank_entities ──parent──► bank_entities     customer_types (CIF class)
       │                                      │
       │ BookedOn                             │ ObligorOf
       ▼                                      │
  exposures ◄──────── facility ───────────────┘
       │
       ├─ product_id → products
       ├─ exposure_pool_id → exposure_pools
       ├─ CRM ProvidedBy → customers (guarantor)
       └─ netting_members → netting_sets

consol_scopes name a root on the bank-entity tree (solo / sub / group). They are not extra companies.

RegistryNatural key
BankEntitybank_entity_code
BankingGroupgroup_id
ConsolScopescope_id
Customerid (bank-chosen spelling)
CustomerTypecustomer_type_id
Productproduct_id
Facility(booking_entity_code, facility_agreement_id)
Exposure(booking_entity_code, deal_id)
FxRateccy at this as-of