{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Modify data after LOC migration","siteUrl":"https://docs.peachfinance.com","description":"API and product documentation for Peach Finance, a lending-as-a-service platform.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"modify-data-after-loc-migration","__idx":0},"children":["Modify data after LOC migration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After migration succeeds, you may need to correct data or handle borrower disputes. Peach supports a specific set of post-migration modifications, with constraints that reflect the migration draw's read-only nature and the system's data integrity rules."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"supported-modifications","__idx":1},"children":["Supported modifications"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Action"},"children":["Action"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"How"},"children":["How"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Notes"},"children":["Notes"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Dispute a historical purchase"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST .../draws/{drawId}/purchases/{purchaseId}/disputes"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Creates a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type: \"refund\""]}," purchase with an effective date after the cutoff. Lowers draw balance using standard refund functionality."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Waive or cancel a historical fee"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT .../fees/{feeId}/cancel"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Changes fee status to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["canceled"]}," and depletes the fee balance. If fee balance is already zero, depletes draw principal instead."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Change a past transaction's status"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT .../migration/past-transaction/{txnId}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Allowed transitions: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},". For transitions to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},", the system uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," from the original transaction to increase draw balances."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reverse a historical transaction"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST .../transactions/{txnId}/reverse"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Creates a reversal transaction. For each entry in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]},", increases the corresponding draw's non-due principal balance."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Correct and re-create with same external ID"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Clear the external ID on the original object, then create a new one"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["For purchases: update with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalId: null"]},". For transactions: cancel with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clearExternalId: true"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Apply balance adjustments"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Service credits (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST .../transactions"]},") or adjustment fees (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST .../fees"]},")"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Use for post-validation balance discrepancies. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/after-migration#adjust-balances"},"children":["Adjust balances"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following are the API code examples for each supported modification type."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"dispute-historical-purchases","__idx":2},"children":["Dispute historical purchases"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If a borrower disputes a purchase that occurred before the migration cutoff date:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/draws/{drawId}/purchases/{purchaseId}/disputes\nContent-Type: application/json\n\n{\n  \"reason\": \"unauthorized\",\n  \"amount\": 249.99\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"waive-or-cancel-historical-fees","__idx":3},"children":["Waive or cancel historical fees"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Cancel a fee that was charged before the migration cutoff date:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"PUT /api/people/{personId}/loans/{loanId}/fees/{feeId}/cancel\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"change-historical-transaction-status","__idx":4},"children":["Change historical transaction status"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Update the status of a past transaction (e.g., marking a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}," payment as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},"):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"PUT /api/people/{personId}/loans/{loanId}/migration/past-transaction/{transactionId}\nContent-Type: application/json\n\n{\n  \"status\": \"failed\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"danger"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For transitions to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},", the system requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," from the original transaction to know which draw balances to increase. These details are only available via the migration-specific endpoint (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET .../migration/past-transaction"]},"), not the standard transactions endpoint. If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," is null, the status change to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}," will be rejected."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"reverse-historical-transactions","__idx":5},"children":["Reverse historical transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Reverse a past transaction to undo its effect:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/transactions/{transactionId}/reverse\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"correct-and-re-create-purchases-or-transactions","__idx":6},"children":["Correct and re-create purchases or transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you need to delete and re-create a purchase or transaction with the same external ID:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Purchases:"]}," Update the purchase with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalId: null"]}," to release the external ID, then create a new purchase with the original external ID."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transactions:"]}," Cancel the transaction with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clearExternalId: true"]}," to release the external ID, then create a new transaction with the original external ID."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"constraints-on-modifications","__idx":7},"children":["Constraints on modifications"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These constraints exist because of how the migration draw and historical data are stored:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Migration draw is disabled after migration."]}," You cannot post new purchases, transactions, or fees to the static draw. All new activity must target actual draws."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," required for past-transaction status changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},"."]}," When marking a past transaction as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},", the system needs to know which draws to increase balances for. If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," is null (which can happen for transactions that pre-date the migration cutoff), the status change to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}," will be rejected."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," only available via migration endpoint."]}," Past-transaction ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," are returned by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET .../migration/past-transaction"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," by the standard ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET .../transactions"]}," endpoint. If you need draw allocation details for a historical transaction, always use the migration-specific endpoint."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Past periods are read-only."]}," Statement-cycle snapshots created via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST .../migration/past-periods"]}," cannot be modified after migration succeeds. If you need to correct a past period, you would need to cancel and re-migrate the loan."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cannot reverse acceleration or charge-off for loans migrated with a non-null ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["postMigrationLoanStatus"]},"."]}," If a loan was created with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["postMigrationLoanStatus: \"accelerated\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["postMigrationLoanStatus: \"chargedOff\""]}," (meaning it was in that state before the cutoff date), the system blocks reverse-acceleration and reverse-charge-off operations. Loans that are accelerated or charged off ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["after"]}," migration (through normal DLM processing) can be reversed normally."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cannot add new past periods after migration."]}," The past-periods endpoints are only available while the loan is in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prepMigration"]}," status."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-the-system-wont-let-you-do","__idx":8},"children":["What the system won't let you do"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Action"},"children":["Action"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Why"},"children":["Why"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Post new activity to the migration draw"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Static draws are disabled after migration"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Modify past period data"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Past periods are read-only snapshots"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Change ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," back to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prepMigration"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Migration status can only move forward in the lifecycle"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Reverse accel/charge-off for loans created with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["postMigrationLoanStatus"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["These status changes preceded the migration cutoff; the system considers them historical"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Mark a past transaction as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}," without ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The system needs draw allocation data to reverse the transaction's balance impact"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"see-also","__idx":9},"children":["See also"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/after-migration"},"children":["After LOC migration"]}," — Validate balances and post-migration system behavior."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/migration-procedure"},"children":["LOC migration procedure"]}," — Create the historical data these modifications act on."]}]}]},"headings":[{"value":"Modify data after LOC migration","id":"modify-data-after-loc-migration","depth":1},{"value":"Supported modifications","id":"supported-modifications","depth":2},{"value":"Dispute historical purchases","id":"dispute-historical-purchases","depth":3},{"value":"Waive or cancel historical fees","id":"waive-or-cancel-historical-fees","depth":3},{"value":"Change historical transaction status","id":"change-historical-transaction-status","depth":3},{"value":"Reverse historical transactions","id":"reverse-historical-transactions","depth":3},{"value":"Correct and re-create purchases or transactions","id":"correct-and-re-create-purchases-or-transactions","depth":3},{"value":"Constraints on modifications","id":"constraints-on-modifications","depth":2},{"value":"What the system won't let you do","id":"what-the-system-wont-let-you-do","depth":2},{"value":"See also","id":"see-also","depth":2}],"frontmatter":{"title":"Modify data after LOC migration","description":"Dispute purchases, cancel fees, and change or reverse past transactions after migration, plus the constraints on modifying migrated LOC data.","verifiedDate":"2026-06-10T00:00:00.000Z","verifiedSpec":"loc-migration.yml","verifiedRef":"peach@41d1f8a","seo":{"title":"Modify data after LOC migration"}},"lastModified":"2026-06-10T22:51:20.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/loan-lifecycle/loc-migration/modifying-data-after-migration","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}