{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "transaction_category",
          "type": "string"
        },
        "transactionIds": {
          "type": "array",
          "minItems": 1,
          "maxItems": 100,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "format": "uuid"
          }
        },
        "category": {
          "type": "string",
          "minLength": 2,
          "maxLength": 40
        }
      },
      "required": [
        "type",
        "transactionIds",
        "category"
      ],
      "additionalProperties": false,
      "description": "Change only selected transactions. Does not create a future merchant preference. Review and undo use Geldee's financial category contract."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "asset_create",
          "type": "string"
        },
        "asset": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 2,
              "maxLength": 40,
              "pattern": "^[a-z0-9-]+$"
            },
            "name": {
              "type": "string",
              "minLength": 2,
              "maxLength": 60
            },
            "currency": {
              "type": "string",
              "enum": [
                "EUR",
                "USD",
                "EGP"
              ]
            },
            "valueMinor": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "boughtMinor": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                {
                  "type": "null"
                }
              ]
            },
            "feePct": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 20
                },
                {
                  "type": "null"
                }
              ]
            },
            "acquiredOn": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date",
                  "description": "Actual acquisition date YYYY-MM-DD, no later than today. Null means unknown. Does not backdate the valuation or invent historical values."
                },
                {
                  "type": "null"
                }
              ]
            },
            "kind": {
              "type": "string",
              "enum": [
                "CASH",
                "INVEST",
                "BONDS",
                "PENSION",
                "PROPERTY",
                "BUSINESS",
                "CRYPTO",
                "INSURANCE",
                "VEHICLE",
                "VALUABLES",
                "RECEIVABLE",
                "OTHER"
              ]
            }
          },
          "required": [
            "key",
            "name",
            "kind",
            "currency",
            "valueMinor"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "type",
        "asset"
      ],
      "additionalProperties": false,
      "description": "Add a manually tracked asset. Does not connect or modify a bank account. No automatic undo for creation."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "asset_update",
          "type": "string"
        },
        "key": {
          "type": "string",
          "minLength": 1,
          "maxLength": 40
        },
        "patch": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 2,
              "maxLength": 60
            },
            "currency": {
              "type": "string",
              "enum": [
                "EUR",
                "USD",
                "EGP"
              ]
            },
            "valueMinor": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "boughtMinor": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                {
                  "type": "null"
                }
              ]
            },
            "feePct": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 20
                },
                {
                  "type": "null"
                }
              ]
            },
            "acquiredOn": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date",
                  "description": "Actual acquisition date YYYY-MM-DD, no later than today. Null means unknown. Does not backdate the valuation or invent historical values."
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [],
          "additionalProperties": false,
          "minProperties": 1
        }
      },
      "required": [
        "type",
        "key",
        "patch"
      ],
      "additionalProperties": false,
      "description": "Update a manual asset, preserving valuation history. Cannot modify precious-metal values or change its asset type."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "liability_create",
          "type": "string"
        },
        "liability": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 2,
              "maxLength": 60
            },
            "kind": {
              "type": "string",
              "enum": [
                "MORTGAGE",
                "LOAN",
                "SIMPLE",
                "OTHER"
              ]
            },
            "currency": {
              "type": "string",
              "enum": [
                "EUR",
                "USD",
                "EGP"
              ]
            },
            "balanceMinor": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "originalMinor": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                {
                  "type": "null"
                }
              ]
            },
            "ratePct": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                {
                  "type": "null"
                }
              ]
            },
            "paymentMinor": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 0,
                  "maxLength": 200
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [
            "name",
            "currency",
            "balanceMinor"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "type",
        "liability"
      ],
      "additionalProperties": false,
      "description": "Add a debt record with a positive outstanding balance. No borrowing, bank changes or money movement. No automatic undo for creation."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "liability_update",
          "type": "string"
        },
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "patch": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 2,
              "maxLength": 60
            },
            "kind": {
              "type": "string",
              "enum": [
                "MORTGAGE",
                "LOAN",
                "SIMPLE",
                "OTHER"
              ]
            },
            "currency": {
              "type": "string",
              "enum": [
                "EUR",
                "USD",
                "EGP"
              ]
            },
            "balanceMinor": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "originalMinor": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                {
                  "type": "null"
                }
              ]
            },
            "ratePct": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                {
                  "type": "null"
                }
              ]
            },
            "paymentMinor": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 0,
                  "maxLength": 200
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [],
          "additionalProperties": false,
          "minProperties": 1
        }
      },
      "required": [
        "type",
        "id",
        "patch"
      ],
      "additionalProperties": false,
      "description": "Update a debt record; money amounts use its currency's minor units."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "category_create",
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 2,
          "maxLength": 40
        },
        "kind": {
          "type": "string",
          "enum": [
            "FIXED",
            "VARIABLE",
            "YEARLY"
          ]
        }
      },
      "required": [
        "type",
        "name",
        "kind"
      ],
      "additionalProperties": false,
      "description": "Add a spending category. Does not change existing transaction classifications. No automatic undo for creation."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "category_rename",
          "type": "string"
        },
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "name": {
          "type": "string",
          "minLength": 2,
          "maxLength": 40
        }
      },
      "required": [
        "type",
        "id",
        "name"
      ],
      "additionalProperties": false,
      "description": "Rename an existing category and its saved references. No automatic undo; the owner can edit again in Geldee."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "budget_set",
          "type": "string"
        },
        "plan": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "amountCents": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10000000000,
                  "description": "Minor units, not a decimal money amount."
                },
                "cycle": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "frequency": {
                          "const": "weekly",
                          "type": "string"
                        },
                        "startDay": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 7
                        }
                      },
                      "required": [
                        "frequency",
                        "startDay"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "frequency": {
                          "const": "monthly",
                          "type": "string"
                        },
                        "startDay": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 31
                        }
                      },
                      "required": [
                        "frequency",
                        "startDay"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "allocations": {
                  "type": "object",
                  "maxProperties": 200,
                  "propertyNames": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  },
                  "additionalProperties": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 10000000000,
                    "description": "Minor units, not a decimal money amount."
                  },
                  "description": "Owned spending-category IDs to EUR cents."
                }
              },
              "required": [
                "amountCents",
                "cycle",
                "allocations"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "type",
        "plan"
      ],
      "additionalProperties": false,
      "description": "Replace the complete spending budget. Amount and allocations use EUR cents. Cycle, total and allocations commit together under a checked revision; allocations may not exceed the total."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "goal_upsert",
          "type": "string"
        },
        "goal": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 32
            },
            "name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 40
            },
            "targetCents": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "savedCents": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "by": {
              "type": "string",
              "pattern": "^[1-9][0-9]{3}-(0[1-9]|1[0-2])$"
            },
            "monthlyContributionCents": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "accountKey": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          },
          "required": [
            "id",
            "name",
            "targetCents",
            "savedCents"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "type",
        "goal"
      ],
      "additionalProperties": false,
      "description": "Create or replace one savings goal. Does not move money. One owned EUR account may fund only one goal."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "goal_remove",
          "type": "string"
        },
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 32
        }
      },
      "required": [
        "type",
        "id"
      ],
      "additionalProperties": false,
      "description": "Remove a saved planning goal; no account balance changes. Supports guarded undo."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "rule_set",
          "type": "string"
        },
        "keyword": {
          "type": "string",
          "minLength": 2,
          "maxLength": 60
        },
        "category": {
          "type": "string",
          "minLength": 2,
          "maxLength": 40
        }
      },
      "required": [
        "type",
        "keyword",
        "category"
      ],
      "additionalProperties": false,
      "description": "Create or change a whole-workspace substring rule for future imports. Does not reclassify existing rows; exact merchant preferences retain precedence."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "rule_delete",
          "type": "string"
        },
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        }
      },
      "required": [
        "type",
        "id"
      ],
      "additionalProperties": false,
      "description": "Remove a whole-workspace future-import rule. No transaction deletion. Supports guarded undo."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "rule_apply",
          "type": "string"
        },
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "transactionIds": {
          "type": "array",
          "minItems": 1,
          "maxItems": 100,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "required": [
        "type",
        "id",
        "transactionIds"
      ],
      "additionalProperties": false,
      "description": "Apply one saved rule only to selected matching review payments. Refuses manual entries, previous category decisions and exact merchant preferences."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "manual_transaction",
          "type": "string"
        },
        "date": {
          "type": "string",
          "format": "date",
          "description": "A real calendar date, YYYY-MM-DD."
        },
        "amountCents": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000000000,
          "description": "Minor units, not a decimal money amount."
        },
        "category": {
          "type": "string",
          "minLength": 2,
          "maxLength": 40
        },
        "note": {
          "type": "string",
          "minLength": 0,
          "maxLength": 40
        },
        "income": {
          "type": "boolean"
        }
      },
      "required": [
        "type",
        "date",
        "amountCents",
        "category"
      ],
      "additionalProperties": false,
      "description": "Record a manual income or expense in EUR cents. Does not perform a payment. Category and direction must agree."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "transaction_split",
          "type": "string"
        },
        "transactionId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "parts": {
          "type": "array",
          "minItems": 2,
          "maxItems": 20,
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "category": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 40
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "amountCents": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10000000000,
                "description": "Minor units, not a decimal money amount."
              },
              "excluded": {
                "type": "boolean"
              },
              "linkedTransactionId": {
                "type": "null"
              }
            },
            "required": [
              "category",
              "amountCents",
              "excluded"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "type",
        "transactionId",
        "parts"
      ],
      "additionalProperties": false,
      "description": "Split one eligible EUR payment's reporting. The original bank payment stays intact. Parts must total the original amount and include at least one spending part. Keep existing part IDs when editing. Linked transaction portions are unavailable."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "bill_create",
          "type": "string"
        },
        "bill": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "minLength": 1,
              "maxLength": 40
            },
            "category": {
              "type": "string",
              "minLength": 2,
              "maxLength": 40
            },
            "amountCents": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "cadence": {
              "type": "string",
              "enum": [
                "weekly",
                "biweekly",
                "monthly",
                "quarterly",
                "semiannual",
                "annual"
              ]
            },
            "dueDay": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 31
                },
                {
                  "type": "null"
                }
              ]
            },
            "contractStart": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^[1-9][0-9]{3}-(0[1-9]|1[0-2])$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "contractYears": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 50
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [
            "description",
            "category",
            "amountCents"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "type",
        "bill"
      ],
      "additionalProperties": false,
      "description": "Add a saved recurring bill, not a recorded payment. Uses EUR cents and Geldee's bill identity checks. No automatic undo for creation."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "bill_update",
          "type": "string"
        },
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "patch": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "minLength": 1,
              "maxLength": 40
            },
            "category": {
              "type": "string",
              "minLength": 2,
              "maxLength": 40
            },
            "amountCents": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000000000,
              "description": "Minor units, not a decimal money amount."
            },
            "cadence": {
              "type": "string",
              "enum": [
                "weekly",
                "biweekly",
                "monthly",
                "quarterly",
                "semiannual",
                "annual"
              ]
            },
            "dueDay": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 31
                },
                {
                  "type": "null"
                }
              ]
            },
            "contractStart": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^[1-9][0-9]{3}-(0[1-9]|1[0-2])$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "contractYears": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 50
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [],
          "additionalProperties": false,
          "minProperties": 1
        }
      },
      "required": [
        "type",
        "id",
        "patch"
      ],
      "additionalProperties": false,
      "description": "Patch only the selected saved bill; preserve linked payments and history. Supports guarded undo."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "context_upsert"
        },
        "note": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "format": "uuid"
            },
            "title": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            },
            "body": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            },
            "kind": {
              "type": "string",
              "enum": [
                "note",
                "decision"
              ]
            },
            "state": {
              "type": "string",
              "enum": [
                "active",
                "resolved"
              ]
            }
          },
          "required": [
            "id",
            "title",
            "body",
            "kind",
            "state"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "type",
        "note"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "context_resolve"
        },
        "id": {
          "type": "string",
          "format": "uuid"
        }
      },
      "required": [
        "type",
        "id"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "type",
        "source",
        "rows"
      ],
      "description": "Preview up to 100 additive EUR statement rows and 500 KiB total UTF-8 JSON for existing EUR accounts; split larger statements into batches within a ten-year date range. Existing fingerprint duplicates are explicitly skipped. Uses Geldee's canonical categorization and transfer guards. Never changes existing payments, account balances, bank credentials or matches. Proposals require separate owner approval; direct editing requires imports:write consent, the required read and account permissions, and a matching signed previewVersion. Guarded undo removes only this import's unchanged, unreferenced new rows. The source SHA-256 is supplied provenance; validated rows are independently hashed by the server.",
      "properties": {
        "type": {
          "type": "string",
          "const": "statement_import"
        },
        "source": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "label",
            "sha256"
          ],
          "properties": {
            "label": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            },
            "sha256": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          }
        },
        "rows": {
          "type": "array",
          "minItems": 1,
          "maxItems": 100,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "date",
              "description",
              "amountCents",
              "accountKey"
            ],
            "properties": {
              "date": {
                "type": "string",
                "format": "date",
                "pattern": "^[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}$"
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "amountCents": {
                "type": "integer",
                "minimum": -10000000000,
                "maximum": 10000000000,
                "not": {
                  "const": 0
                },
                "description": "EUR cents only, matching Geldee's transaction ledger. Positive spending, negative income/refund. Foreign-currency conversion is unavailable."
              },
              "accountKey": {
                "type": "string",
                "minLength": 1,
                "maxLength": 40
              },
              "rawDescription": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 4096
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "counterpartyName": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 512
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "kind": {
                "type": "string",
                "enum": [
                  "transfer",
                  "exchange",
                  "topup",
                  "refund"
                ]
              }
            }
          }
        }
      }
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "const": "trip_create"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        }
      },
      "required": [
        "type",
        "name"
      ],
      "additionalProperties": false,
      "description": "Add an empty trip. Does not change payments. Whole-workspace permission required; no automatic undo."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "const": "trip_update"
        },
        "id": {
          "type": "string",
          "format": "uuid"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        }
      },
      "required": [
        "type",
        "id",
        "name"
      ],
      "additionalProperties": false,
      "description": "Rename one owned trip. Payment history is preserved. Supports guarded undo."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "const": "transaction_trip"
        },
        "transactionIds": {
          "type": "array",
          "minItems": 1,
          "maxItems": 100,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "format": "uuid"
          }
        },
        "tripId": {
          "type": "string",
          "format": "uuid"
        },
        "newTripName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        }
      },
      "required": [
        "type",
        "transactionIds"
      ],
      "additionalProperties": false,
      "description": "Assign one to one hundred explicit, eligible money-out payments to an existing visible trip or one new trip. Read and page the requested date range first, then freeze the exact IDs. No future rule. Protected payments require their dedicated Geldee flow. Supports atomic guarded undo.",
      "oneOf": [
        {
          "required": [
            "tripId"
          ]
        },
        {
          "required": [
            "newTripName"
          ]
        }
      ]
    }
  ]
}
