{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"LOC migration procedure","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":"loc-migration-procedure","__idx":0},"children":["LOC migration procedure"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"assumed-knowledge","__idx":1},"children":["Assumed knowledge"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/how-loc-billing-cycles-work"},"children":["How LOC billing cycles work"]}," — required to understand the balance breakdowns in Step 3."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/how-grace-periods-work"},"children":["How grace periods work for lines of credit"]}," — grace eligibility seeded in the migration period data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/how-loc-draws-work"},"children":["How LOC draws work"]}," — the migration draw and the active draws used throughout."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-create-the-borrower-and-payment-methods","__idx":2},"children":["Step 1: Create the borrower and payment methods"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Establish the borrower's identity and payment capabilities in Peach."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-borrower","__idx":3},"children":["Create borrower"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create a borrower record with personal information. You'll use the returned ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["personId"]}," in all subsequent API calls."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people\nContent-Type: application/json\n\n{\n  \"status\": \"active\",\n  \"externalId\": \"your-borrower-id-123\",\n  \"name\": {\n    \"firstName\": \"Jane\",\n    \"middleName\": \"A\",\n    \"lastName\": \"Smith\"\n  },\n  \"dateOfBirth\": \"1985-03-15\",\n  \"identity\": {\n    \"identityType\": \"SSN\",\n    \"value\": \"123456789\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response"]}," (abbreviated):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": {\n    \"id\": \"BO-1234-ABCD\",\n    \"externalId\": \"your-borrower-id-123\",\n    \"status\": \"active\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-contact-records","__idx":4},"children":["Create contact records"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create separate contact records for each piece of contact information. This separation enables contact-level management and history tracking."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/contacts\nContent-Type: application/json\n\n{\n  \"contactType\": \"address\",\n  \"label\": \"home\",\n  \"affiliation\": \"self\",\n  \"status\": \"primary\",\n  \"address\": {\n    \"addressLine1\": \"742 Evergreen Terrace\",\n    \"city\": \"San Francisco\",\n    \"state\": \"CA\",\n    \"postalCode\": \"94105\",\n    \"country\": \"US\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Repeat for each email address, phone number, and additional address. Each contact record includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["contactType"]}," (address, email, phone), a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["label"]}," (home, work, mobile), and an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["affiliation"]}," (self, spouse, etc.)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-payment-instruments","__idx":5},"children":["Create payment instruments"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create payment instruments for both active and historical payment methods. Active methods will be used for future payments; historical methods are needed for accurate transaction records."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Active payment instrument"]}," (full account details):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/payment-instruments\nContent-Type: application/json\n\n{\n  \"status\": \"active\",\n  \"verified\": true,\n  \"nickname\": \"Primary Checking\",\n  \"instrumentType\": \"bankAccount\",\n  \"accountNumber\": \"9876543210\",\n  \"routingNumber\": \"021000021\",\n  \"accountType\": \"checking\",\n  \"accountHolderType\": \"personal\",\n  \"accountHolderName\": \"Jane A Smith\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Historical payment instrument"]}," (last four digits only):"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For payment methods no longer in use, set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isExternal: true"]},". This requires only the last four digits of the account number."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/payment-instruments\nContent-Type: application/json\n\n{\n  \"status\": \"active\",\n  \"verified\": true,\n  \"isExternal\": true,\n  \"nickname\": \"Old Checking (closed)\",\n  \"instrumentType\": \"bankAccount\",\n  \"accountNumberLastFour\": \"5678\",\n  \"accountType\": \"checking\",\n  \"accountHolderType\": \"personal\",\n  \"accountHolderName\": \"Jane A Smith\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can also provide inline payment instrument details directly on migration transactions using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentInstrumentDetails"]},", which accepts the following types: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bankAccount"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["creditCard"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debitCard"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["check"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payroll"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["moneyOrder"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wire"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["custom"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Only payment instruments with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"active\""]}," can be used for future payments. Historical instruments created with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isExternal: true"]}," are for record-keeping only."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-create-and-configure-the-line-of-credit","__idx":6},"children":["Step 2: Create and configure the line of credit"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create the loan object, retrieve the auto-generated migration draw, create any additional active draws, and upload loan documents."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-the-loan","__idx":7},"children":["Create the loan"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create the line of credit with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"pending\""]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.migrationStatus: \"prepMigration\""]},". The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["atOrigination"]}," object defines the loan's terms; the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration"]}," object tells Peach this loan is being migrated."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans\nContent-Type: application/json\n\n{\n  \"externalId\": \"your-loc-id-789\",\n  \"loanTypeId\": \"LT-LOC-ABCD\",\n  \"type\": \"lineOfCredit\",\n  \"servicedBy\": \"creditor\",\n  \"status\": \"pending\",\n  \"muteLoanNotices\": true,\n  \"atOrigination\": {\n    \"paymentFrequency\": \"monthly\",\n    \"specificDays\": [22],\n    \"interestRates\": [\n      { \"days\": null, \"rate\": 0.1999 }\n    ],\n    \"promoRates\": [],\n    \"aprEffective\": 0.2149,\n    \"aprNominal\": 0.1999,\n    \"creditLimitAmount\": 10000.00,\n    \"gracePeriod\": {\n      \"enabled\": true,\n      \"numDays\": 25,\n      \"numPeriodsToRestoreGrace\": 1\n    },\n    \"minPaymentCalculation\": {\n      \"percentageOfPrincipal\": 0.02,\n      \"minAmount\": 25.00,\n      \"includeFeesInCalculation\": true,\n      \"includeInterestInCalculation\": true\n    },\n    \"personAddressId\": \"CT-ADDR-ABCD\",\n    \"skipCreditReporting\": false\n  },\n  \"migration\": {\n    \"migrationStatus\": \"prepMigration\",\n    \"activatedDate\": \"2023-06-15\",\n    \"activatedTimeOfDay\": {\n      \"hour\": 10,\n      \"minute\": 0,\n      \"second\": 0\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response"]}," (abbreviated):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": {\n    \"id\": \"LN-1234-ABCD\",\n    \"type\": \"lineOfCredit\",\n    \"status\": \"pending\",\n    \"migrationStatus\": \"prepMigration\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Setting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["muteLoanNotices: true"]}," is not strictly required — Peach will not send borrower notifications during the migration process. However, setting it to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," provides an extra safeguard and gives you explicit control over when communications resume after migration. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/after-migration#re-enable-borrower-communications"},"children":["Borrower communications during migration"]}," for details."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key fields in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["atOrigination"]},":"]}]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentFrequency"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["specificDays"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Current billing frequency and due date day(s) of month. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["specificDays"]}," must align with the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dueDate"]}," in the migration period data — e.g., if ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dueDate"]}," is the 22nd, set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["specificDays: [22]"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["interestRates"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Interest rate schedule. Set from the migration cutoff date. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["days: null"]}," for an indefinite rate."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["promoRates"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Promotional rate schedule, if applicable"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["creditLimitAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Credit limit at origination"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gracePeriod"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Grace period configuration. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["numDays"]}," is the number of days after the statement date during which no interest accrues if the full balance is paid."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["minPaymentCalculation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Rules for calculating the minimum payment each cycle"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipCreditReporting"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," if you do not report this loan to credit bureaus"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key fields in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration"]},":"]}]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Must be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"prepMigration\""]}," to begin the process"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["activatedDate"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The original date the line of credit was opened in your legacy system"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["activatedTimeOfDay"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Time of activation (hour, minute, second in product timezone)"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"retrieve-the-migration-draw","__idx":8},"children":["Retrieve the migration draw"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you create a loan with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus: \"prepMigration\""]},", Peach automatically creates the migration draw. Retrieve it to get its ID — you'll need this when posting historical purchases and fees."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"GET /api/people/{personId}/loans/{loanId}/draws\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response"]}," (abbreviated):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": [\n    {\n      \"id\": \"DR-MIGR-ABCD\",\n      \"nickname\": \"Migration Draw\",\n      \"drawType\": \"static\",\n      \"status\": \"pending\"\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The migration draw has ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawType: \"static\""]},". Save this ID for Step 4."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-active-draws","__idx":9},"children":["Create active draws"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create any draws that should exist after the migration cutoff date. These are the \"real\" draws that will be active post-migration — they accrue interest, accept new purchases, and participate in billing."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Only create draws that should be live after the cutoff date. Historical draws that have been closed or fully paid off don't need to be created as separate draws — their activity goes to the migration draw."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/draws\nContent-Type: application/json\n\n{\n  \"externalId\": \"your-draw-id-001\",\n  \"nickname\": \"Primary Draw\",\n  \"status\": \"pending\",\n  \"atOrigination\": {\n    \"interestRates\": [\n      { \"days\": null, \"rate\": 0.1999 }\n    ],\n    \"creditLimitAmount\": 8000.00,\n    \"minPaymentCalculation\": {\n      \"percentageOfPrincipal\": 0.02,\n      \"minAmount\": 25.00\n    },\n    \"gracePeriod\": {\n      \"enabled\": true,\n      \"numDays\": 25,\n      \"numPeriodsToRestoreGrace\": 1\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response"]}," (abbreviated):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": {\n    \"id\": \"DR-0001-ABCD\",\n    \"externalId\": \"your-draw-id-001\",\n    \"status\": \"pending\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Repeat for each active draw. Save each draw's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," — you'll need them for migration period data and live activities."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"upload-loan-documents","__idx":10},"children":["Upload loan documents"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Upload loan agreements, historical statements, and any other relevant documents. Create a document descriptor first, then upload the file content."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/documents\nContent-Type: application/json\n\n{\n  \"type\": \"loanAgreement\",\n  \"description\": \"Original LOC Agreement\",\n  \"status\": \"accepted\",\n  \"loanId\": \"LN-1234-ABCD\",\n  \"sensitiveData\": false\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/documents/{documentDescriptorId}/content\nContent-Type: multipart/form-data\n\nfile=@/path/to/agreement.pdf\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you're providing historical statements for past periods (Step 3), save each document descriptor ID — you'll reference it when creating past period data."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-populate-historical-data","__idx":11},"children":["Step 3: Populate historical data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Provide Peach with the borrower's historical billing cycles and set up the migration period with current balances. This step has three parts: past periods, migration period LOC data, and migration period draw data."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-past-periods-data","__idx":12},"children":["Create past periods data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Past periods are billing-cycle snapshots from your legacy system covering the borrower's history before the migration cutoff date. They appear in the borrower's statement history but are not replayed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Period date rules:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Periods must be contiguous — no gaps between them. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startDate"]}," of each period must equal the day after the previous period's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["endDate"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["statementDate"]}," for each period must equal the day after the period's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["endDate"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dueDate"]}," must fall within the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["following"]}," period's date range."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["No two periods can have overlapping start-end date ranges."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/migration/past-periods\nContent-Type: application/json\n\n[\n  {\n    \"startDate\": \"2024-04-01\",\n    \"endDate\": \"2024-04-30\",\n    \"statementDate\": \"2024-05-01\",\n    \"dueDate\": \"2024-05-22\",\n    \"statement\": {\n      \"documentDescriptorId\": \"DD-APR-ABCD\",\n      \"creditBalanceAmount\": 0.00,\n      \"minimumAmountDue\": 125.00,\n      \"newBalanceAmount\": 3450.75\n    },\n    \"gracePeriod\": {\n      \"fullBalanceAmount\": 3450.75,\n      \"fullBalanceMinusOverdueAmount\": 3450.75,\n      \"isGracePeriodEligible\": true\n    }\n  },\n  {\n    \"startDate\": \"2024-05-01\",\n    \"endDate\": \"2024-05-31\",\n    \"statementDate\": \"2024-06-01\",\n    \"dueDate\": \"2024-06-22\",\n    \"statement\": {\n      \"documentDescriptorId\": \"DD-MAY-ABCD\",\n      \"creditBalanceAmount\": 0.00,\n      \"minimumAmountDue\": 118.50,\n      \"newBalanceAmount\": 3200.00\n    },\n    \"gracePeriod\": {\n      \"fullBalanceAmount\": 3200.00,\n      \"fullBalanceMinusOverdueAmount\": 3200.00,\n      \"isGracePeriodEligible\": true\n    }\n  }\n]\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Include all historical periods from the loan's activation through the period immediately before the migration period. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["statement.documentDescriptorId"]}," is optional — include it if you uploaded the corresponding statement document."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Grace period fields in past periods:"]}]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fullBalanceAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Total balance eligible for grace period evaluation"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fullBalanceMinusOverdueAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Full balance minus any overdue amount"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["totalFulfilledOnDueDateAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Amount paid by the due date. Set this on the period one day after the due date."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isGracePeriodEligible"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Whether the borrower maintained grace eligibility through this period"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-migration-period-loc-data","__idx":13},"children":["Create migration period LOC data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The migration period LOC data represents the line-level state as of the migration cutoff date. This is where you provide the balance snapshot and obligation information that Peach uses as its starting point."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/migration/period\nContent-Type: application/json\n\n{\n  \"startDate\": \"2024-08-01\",\n  \"endDate\": \"2024-08-31\",\n  \"statementDate\": \"2024-09-01\",\n  \"dueDate\": \"2024-09-22\",\n  \"balances\": {\n    \"nonDueBalances\": {\n      \"nonDueOriginationFeesAmount\": 0.00,\n      \"nonDueLateFeesAmount\": 0.00\n    },\n    \"dueBalances\": {\n      \"dueOriginationFeesAmount\": 0.00,\n      \"dueLateFeesAmount\": 0.00\n    },\n    \"overdueBalances\": {\n      \"overdueOriginationFeesAmount\": 0.00,\n      \"overdueLateFeesAmount\": 0.00\n    },\n    \"creditLimitAmount\": 10000.00,\n    \"reimbursementAmount\": 0.00\n  },\n  \"obligation\": {\n    \"obligationAmount\": 125.00,\n    \"migratedDaysOverdue\": 0,\n    \"migratedOverdueFromDate\": null\n  },\n  \"gracePeriod\": {\n    \"isGracePeriodEligible\": true,\n    \"fullBalanceAmount\": 2850.00,\n    \"fullBalanceMinusOverdueAmount\": 2850.00\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Balance fields at the line level"]}," include only origination fees and late fees broken down by non-due, due, and overdue. The line level can only carry fee balances — principal and interest balances are tracked at the draw level, not the line level. Do not post principal or interest balance totals on the line."]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["creditLimitAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Current overall credit limit for the line"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reimbursementAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Amount the lender owes to the borrower (credit balances). Set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0.00"]}," if not applicable."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["obligation.obligationAmount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Remaining amount the borrower must pay by the upcoming due date"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["obligation.migratedDaysOverdue"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Number of days the account was overdue as of the cutoff date. Set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}," if current."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["obligation.migratedOverdueFromDate"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Date from which the account has been overdue. Set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," if the account is current, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["or"]}," if the overdue date is the same as the migration cutoff date. For example, if you are migrating on 2/1, the migration cutoff is 2/1, and the loan is overdue 7 days, you can set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migratedOverdueFromDate"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migratedDaysOverdue"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["7"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All balance amounts must be ≥ 0.00 with a precision of 0.01 (two decimal places)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-migration-period-draw-data","__idx":14},"children":["Create migration period draw data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["each active draw"]}," (not the migration draw), create migration period data with draw-level balances and obligations."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/draws/{drawId}/migration/period\nContent-Type: application/json\n\n{\n  \"balances\": {\n    \"nonDueBalances\": {\n      \"nonDuePrincipalAmount\": 2200.00,\n      \"nonDueInterestAmount\": 0.00,\n      \"nonDueDrawFeesAmount\": 0.00,\n      \"nonDueLateFeesAmount\": 0.00,\n      \"nonDueModificationFeesAmount\": 0.00\n    },\n    \"dueBalances\": {\n      \"duePrincipalAmount\": 50.00,\n      \"dueInterestAmount\": 37.50,\n      \"dueDrawFeesAmount\": 0.00,\n      \"dueLateFeesAmount\": 0.00,\n      \"dueModificationFeesAmount\": 0.00\n    },\n    \"overdueBalances\": {\n      \"overduePrincipalAmount\": 0.00,\n      \"overdueInterestAmount\": 0.00,\n      \"overdueDrawFeesAmount\": 0.00,\n      \"overdueLateFeesAmount\": 0.00,\n      \"overdueModificationFeesAmount\": 0.00\n    },\n    \"creditLimitAmount\": 8000.00\n  },\n  \"obligation\": {\n    \"obligationAmount\": 87.50,\n    \"migratedDaysOverdue\": 0\n  },\n  \"gracePeriod\": {\n    \"isGracePeriodEligible\": true,\n    \"fullBalanceAmount\": 2287.50,\n    \"fullBalanceMinusOverdueAmount\": 2287.50\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Draw-level balances provide a more granular breakdown than line-level balances, including principal, interest, draw fees, late fees, and modification fees for each draw."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Late fees vs. modification fees:"]}," Peach maintains separate ledger buckets for late fees and modification fees. You must specify which fee type each balance belongs to — the system needs to know the correct ledger bucket for each amount. Ensure your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lateFeesAmount"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["modificationFeesAmount"]}," fields accurately reflect the fee type from your legacy system."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Repeat this call for every active draw. Note that line-level and draw-level balances are independent — the line level only carries fee balances (origination fees, late fees), while draws carry principal, interest, and draw-specific fees. Do not attempt to reconcile draw-level totals against line-level totals, as there is validation that prevents the line from having principal or interest balances. Similarly, the sum of draw-level ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["creditLimitAmount"]}," values should not exceed the line-level credit limit."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"change-loan-status-to-originated","__idx":15},"children":["Change loan status to Originated"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After populating all historical data, change the loan status from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["originated"]},". This locks the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["atOrigination"]}," data."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"PUT /api/people/{personId}/loans/{loanId}\nContent-Type: application/json\n\n{\n  \"status\": \"originated\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"danger","name":"Irreversible after origination"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After changing status to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["originated"]},", you cannot modify the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["atOrigination"]}," object. Make sure all loan terms, interest rates, and configuration are correct before this step."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-create-activities","__idx":16},"children":["Step 4: Create activities"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create all purchases, transactions (payments), and fees — both historical and live. The distinction between historical and live determines which endpoint you use and which draw receives the activity."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"historical-purchases-before-the-migration-cutoff-date","__idx":17},"children":["Historical purchases (before the migration cutoff date)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Post historical purchases to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["migration draw"]},", not to the actual draws. Use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.originalDrawId"]}," field to record which legacy draw the purchase originally belonged to. This enables proper balance adjustments if the purchase is later disputed."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/draws/{migrationDrawId}/purchases\nContent-Type: application/json\n\n{\n  \"externalId\": \"your-purchase-id-001\",\n  \"type\": \"regular\",\n  \"status\": \"settled\",\n  \"amount\": 249.99,\n  \"purchaseDate\": \"2024-07-10\",\n  \"purchaseDetails\": {\n    \"description\": \"Electronics Store\",\n    \"pointOfSaleType\": \"inStore\",\n    \"merchantName\": \"Best Buy #1234\",\n    \"merchantNumber\": \"MRC-9876\"\n  },\n  \"migration\": {\n    \"originalDrawId\": \"your-legacy-draw-id-001\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Purchases in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["authorized"]}," status are not allowed in past periods (before the migration cutoff date). All historical purchases must have a terminal status such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settled"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["canceled"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returned"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"live-purchases-on-or-after-the-migration-cutoff-date","__idx":18},"children":["Live purchases (on or after the migration cutoff date)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Post live purchases to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["actual draw"]}," they belong to. Do not include the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration"]}," object."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/draws/{drawId}/purchases\nContent-Type: application/json\n\n{\n  \"externalId\": \"your-purchase-id-042\",\n  \"type\": \"regular\",\n  \"status\": \"settled\",\n  \"amount\": 75.50,\n  \"purchaseDate\": \"2024-08-05\",\n  \"purchaseDetails\": {\n    \"description\": \"Grocery Store\",\n    \"pointOfSaleType\": \"inStore\",\n    \"merchantName\": \"Whole Foods #567\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"historical-transactions-before-the-migration-cutoff-date","__idx":19},"children":["Historical transactions (before the migration cutoff date)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["migration-specific past-transaction endpoint"]}," for payments that occurred before the cutoff date. Include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," to record how the payment was allocated across draws — this is essential for handling reversals or status changes after migration."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/migration/past-transaction\nContent-Type: application/json\n\n{\n  \"externalId\": \"your-payment-id-001\",\n  \"amount\": 200.00,\n  \"type\": \"oneTimePayment\",\n  \"status\": \"succeeded\",\n  \"effectiveDate\": \"2024-07-22\",\n  \"effectiveTimeOfDay\": {\n    \"hour\": 14,\n    \"minute\": 30,\n    \"second\": 0\n  },\n  \"paymentInstrumentId\": \"PI-1234-ABCD\",\n  \"migration\": {\n    \"drawSplitDetails\": [\n      {\n        \"originalDrawId\": \"your-legacy-draw-id-001\",\n        \"drawAllocatedAmount\": 200.00\n      }\n    ]\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transaction types supported:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["oneTimePayment"]}," — Standard payment"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["serviceCredit"]}," — Credit applied to the account (note: you cannot pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," for service credits — the system automatically sets it to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["downPayment"]}," — Down payment"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status options"]}," (for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["oneTimePayment"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["downPayment"]},"): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initiated"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["canceled"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inDispute"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["chargeback"]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"danger"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," are critical for post-migration modifications."]}," If you need to change a historical transaction's status after migration (e.g., from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},"), Peach uses the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," to determine which draw balances to adjust. If you omit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]},", post-migration status changes on that transaction will fail."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Important constraints:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Only reference ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["active draw IDs"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," — do ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," use the migration draw ID."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawSplitDetails"]}," are only returned by the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET .../migration/past-transaction"]}," endpoint, not the standard ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET .../transactions"]}," endpoint."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inline payment instrument details:"]}," If you don't want to create a separate payment instrument record for a historical transaction, you can provide details inline:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"paymentInstrumentDetails\": {\n    \"type\": \"bankAccount\",\n    \"accountLastFour\": \"5678\",\n    \"customDisplayName\": \"Legacy Checking\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"live-transactions-on-or-after-the-migration-cutoff-date","__idx":20},"children":["Live transactions (on or after the migration cutoff date)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["standard transaction endpoint"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isExternal: true"]}," for payments processed by your legacy system after the cutoff date."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/transactions\nContent-Type: application/json\n\n{\n  \"externalId\": \"your-payment-id-042\",\n  \"paymentInstrumentId\": \"PI-1234-ABCD\",\n  \"amount\": 150.00,\n  \"type\": \"oneTime\",\n  \"status\": \"succeeded\",\n  \"isExternal\": true,\n  \"effectiveDate\": \"2024-08-15\",\n  \"effectiveTimeOfDay\": {\n    \"hour\": 10,\n    \"minute\": 0,\n    \"second\": 0\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," field differs between endpoints: the past-transaction endpoint uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["oneTimePayment"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["serviceCredit"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["downPayment"]},", while the standard transaction endpoint uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["oneTime"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["serviceCredit"]},", etc. Use the correct type value for the endpoint you're calling."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," must be after 2:00 AM in the product timezone. Transactions with earlier times will fail validation."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"historical-fees-before-the-migration-cutoff-date","__idx":21},"children":["Historical fees (before the migration cutoff date)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create fees using the standard fee endpoint, but include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.originalDrawId"]}," to associate the fee with the correct legacy draw. For purchase-related fees (e.g., foreign transaction fees), also include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.originalPurchaseId"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/fees\nContent-Type: application/json\n\n{\n  \"feeTypeId\": \"FT-LATE-ABCD\",\n  \"amount\": 29.00,\n  \"chargeDate\": \"2024-07-25\",\n  \"chargeTimeOfDay\": {\n    \"hour\": 10,\n    \"minute\": 0,\n    \"second\": 0\n  },\n  \"migration\": {\n    \"originalDrawId\": \"your-legacy-draw-id-001\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Fee types with special migration fields:"]}]},{"$$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":"Fee type"},"children":["Fee type"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Additional migration field"},"children":["Additional migration field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Late fees, annual fees"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.originalDrawId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Associates with a legacy draw. Omit for line-level fees."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["NSF fees"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.originalTransactionId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Associates with the failed transaction"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Foreign transaction fees"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration.originalPurchaseId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Associates with the purchase that triggered the fee"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"live-fees-on-or-after-the-migration-cutoff-date","__idx":22},"children":["Live fees (on or after the migration cutoff date)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create live fees normally, without the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migration"]}," object."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/fees\nContent-Type: application/json\n\n{\n  \"feeTypeId\": \"FT-LATE-ABCD\",\n  \"amount\": 29.00,\n  \"chargeDate\": \"2024-08-25\",\n  \"chargeTimeOfDay\": {\n    \"hour\": 10,\n    \"minute\": 0,\n    \"second\": 0\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-execute-migration","__idx":23},"children":["Step 5: Execute migration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["With all data in place, trigger the migration process. Peach validates the prepared data, replays live activities, and activates the loan."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"call-the-migrate-endpoint","__idx":24},"children":["Call the migrate endpoint"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /api/people/{personId}/loans/{loanId}/migrate\nContent-Type: application/json\n\n{\n  \"sync\": false\n}\n","lang":"json"},"children":[]},{"$$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":"Parameter"},"children":["Parameter"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync: true"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Synchronous — the API call blocks until migration completes or fails. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Timeout: 60 seconds."]}," If migration takes longer, the call returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["408 Request Timeout"]}," but migration continues in the background. Use for single-loan testing only."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync: false"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Asynchronous — the API call returns immediately and migration runs in the background. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Recommended for production and bulk migrations."]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"monitor-migration-status","__idx":25},"children":["Monitor migration status"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For asynchronous migrations, poll the loan endpoint to check progress:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"GET /api/people/{personId}/loans/{loanId}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Watch the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," field:"]},{"$$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":"Status"},"children":["Status"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prepMigration"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Data preparation phase (pre-migrate call)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrating"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Migration in progress — Peach is replaying live events"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["completed"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Migration completed successfully"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Migration failed — data has been rolled back"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-happens-during-migration","__idx":26},"children":["What happens during migration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you call the migrate endpoint, Peach performs the following sequence:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Validates"]}," all migration data (periods, balances, transactions, draws)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Locks"]}," the loan to prevent concurrent modifications."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Originates"]}," the loan if it's in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}," status."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sets"]}," line-level grace period information from the migration period data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Activates"]}," the LOC and updates draw information for the migration period."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Generates"]}," daily ledger management events."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Replays"]}," all live activities (purchases, transactions, fees) in chronological order."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sets"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["completed"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Fires"]}," a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loan.migration.succeeded"]}," webhook event."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Fires"]}," webhooks for all events created for live activities."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"if-migration-succeeds","__idx":27},"children":["If migration succeeds"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The loan status progresses from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["originated"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["completed"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loan.migration.succeeded"]}," event is created and a webhook fires."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["All live activities are replayed and reflected in the loan's balance."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The loan begins accruing interest and generating billing events according to its configuration."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"if-migration-fails","__idx":28},"children":["If migration fails"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The system rolls back the ledger — no partial state is left."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The loan status reverts to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loan.migration.failed"]}," event is created and a webhook fires."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["To retry after a failure:"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Review the error details in the migration event."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Correct the issue (fix data, adjust balances, etc.)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reset ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prepMigration"]},":"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"PUT /api/people/{personId}/loans/{loanId}\nContent-Type: application/json\n\n{\n  \"migration\": {\n    \"migrationStatus\": \"prepMigration\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":4},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Make any necessary data corrections."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Call the migrate endpoint again."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["migrationStatus"]}," shows ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}," but you don't see specific errors, contact Peach Support for investigation."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"see-also","__idx":29},"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, configure autopay and credit reporting, and post-migration behavior."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/validation-and-troubleshooting"},"children":["LOC migration validation and troubleshooting"]}," — Validation rules and a troubleshooting FAQ."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/api-and-webhooks-reference"},"children":["LOC migration API and webhooks reference"]}," — The endpoints used across this procedure."]}]}]},"headings":[{"value":"LOC migration procedure","id":"loc-migration-procedure","depth":1},{"value":"Assumed knowledge","id":"assumed-knowledge","depth":2},{"value":"Step 1: Create the borrower and payment methods","id":"step-1-create-the-borrower-and-payment-methods","depth":2},{"value":"Create borrower","id":"create-borrower","depth":3},{"value":"Create contact records","id":"create-contact-records","depth":3},{"value":"Create payment instruments","id":"create-payment-instruments","depth":3},{"value":"Step 2: Create and configure the line of credit","id":"step-2-create-and-configure-the-line-of-credit","depth":2},{"value":"Create the loan","id":"create-the-loan","depth":3},{"value":"Retrieve the migration draw","id":"retrieve-the-migration-draw","depth":3},{"value":"Create active draws","id":"create-active-draws","depth":3},{"value":"Upload loan documents","id":"upload-loan-documents","depth":3},{"value":"Step 3: Populate historical data","id":"step-3-populate-historical-data","depth":2},{"value":"Create past periods data","id":"create-past-periods-data","depth":3},{"value":"Create migration period LOC data","id":"create-migration-period-loc-data","depth":3},{"value":"Create migration period draw data","id":"create-migration-period-draw-data","depth":3},{"value":"Change loan status to Originated","id":"change-loan-status-to-originated","depth":3},{"value":"Step 4: Create activities","id":"step-4-create-activities","depth":2},{"value":"Historical purchases (before the migration cutoff date)","id":"historical-purchases-before-the-migration-cutoff-date","depth":3},{"value":"Live purchases (on or after the migration cutoff date)","id":"live-purchases-on-or-after-the-migration-cutoff-date","depth":3},{"value":"Historical transactions (before the migration cutoff date)","id":"historical-transactions-before-the-migration-cutoff-date","depth":3},{"value":"Live transactions (on or after the migration cutoff date)","id":"live-transactions-on-or-after-the-migration-cutoff-date","depth":3},{"value":"Historical fees (before the migration cutoff date)","id":"historical-fees-before-the-migration-cutoff-date","depth":3},{"value":"Live fees (on or after the migration cutoff date)","id":"live-fees-on-or-after-the-migration-cutoff-date","depth":3},{"value":"Step 5: Execute migration","id":"step-5-execute-migration","depth":2},{"value":"Call the migrate endpoint","id":"call-the-migrate-endpoint","depth":3},{"value":"Monitor migration status","id":"monitor-migration-status","depth":3},{"value":"What happens during migration","id":"what-happens-during-migration","depth":3},{"value":"If migration succeeds","id":"if-migration-succeeds","depth":3},{"value":"If migration fails","id":"if-migration-fails","depth":3},{"value":"See also","id":"see-also","depth":2}],"frontmatter":{"title":"LOC migration procedure","description":"Step-by-step LOC portfolio migration: create the borrower and loan, populate historical data, create activities, and execute the migration.","verifiedDate":"2026-06-10T00:00:00.000Z","verifiedSpec":"loc-migration.yml","verifiedRef":"peach@41d1f8a","seo":{"title":"LOC migration procedure"}},"lastModified":"2026-06-10T22:51:20.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/loan-lifecycle/loc-migration/migration-procedure","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}