{
  "info": {
    "name": "ConnectedFI Public API",
    "description": "Generated from the same allowlisted OpenAPI document as https://docs.cfi.ag.\n\nImport the companion environment, set apiKey locally, and start with Retailer integration workflows.\n\nNo credentials are included. Postman generates language-specific code from every populated request.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "apikey",
    "apikey": [
      {
        "key": "key",
        "value": "X-API-Key",
        "type": "string"
      },
      {
        "key": "value",
        "value": "{{apiKey}}",
        "type": "string"
      },
      {
        "key": "in",
        "value": "header",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://dev.connected.financial/api/orpc",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "secret"
    },
    {
      "key": "submissionUuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "financingUuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "mainApplicantPersonUuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "organizationUuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "loanUuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "drawUuid",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotencyKey",
      "value": "",
      "type": "string"
    },
    {
      "key": "amountMinor",
      "value": "10000",
      "type": "string"
    },
    {
      "key": "trancheId",
      "value": "",
      "type": "string"
    },
    {
      "key": "invoiceRef",
      "value": "ORDER-1001",
      "type": "string"
    },
    {
      "key": "cursor",
      "value": "",
      "type": "string"
    }
  ],
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "['submissionUuid', 'idempotencyKey'].forEach((key) => {",
          "  if (!pm.collectionVariables.get(key)) {",
          "    pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
          "  }",
          "});"
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "pm.test('CFI did not return a server error', () => {",
          "  pm.expect(pm.response.code).to.be.below(500);",
          "});"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "Retailer integration workflows",
      "description": "Runnable requests and TypeScript patterns adapted from the Seed World retailer demo.\n\nThe app-local database and Sentry code are omitted. Identifiers use collection variables.\n\nPostman can generate cURL, Fetch, Axios, Python, Go, Java, and other snippets from each populated request.",
      "item": [
        {
          "name": "01 — Verify API key",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "me"
              ]
            },
            "description": "Confirm the selected environment and API key before running a workflow."
          }
        },
        {
          "name": "02 — Submit an application",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"{{submissionUuid}}\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "submitApplication"
              ]
            },
            "description": "Creates or safely replays one application. Clear submissionUuid only when starting a different application.\n\n```ts\n// The public interface keeps the primary applicant explicit.\nconst result = await submitV2Application({\n  submissionUuid,\n  mainApplicant,\n  coApplicants,\n  organization,\n  financeAmountCents,\n});\nreturn {\n  replayed: result.replayed,\n  financingUuid: result.financingLine.financingUuid,\n  personUuid: result.financingLine.mainApplicant.personUuid,\n};\n```"
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "  const result = pm.response.json();",
                  "  pm.collectionVariables.set('financingUuid', result.financingLine.financingUuid);",
                  "  pm.collectionVariables.set('mainApplicantPersonUuid', result.financingLine.mainApplicant.personUuid);",
                  "  if (result.financingLine.organizationUuid) pm.collectionVariables.set('organizationUuid', result.financingLine.organizationUuid);",
                  "  if (result.financingLine.loan) pm.collectionVariables.set('loanUuid', result.financingLine.loan.loanUuid);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "03 — Scan financing lines",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"limit\": 100\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "financingLines"
              ]
            },
            "description": "Use deterministic cursor pages for bootstrap or repair. Absence from a scan is not a deletion signal.\n\n```ts\n// Adapted from the Seed World retailer demo's server-side CFI client.\nexport async function fetchAllV2FinancingLines(filters = {}) {\n  const items = [];\n  let cursor;\n  do {\n    const page = await fetchV2FinancingLinesPage({ ...filters, cursor, limit: 100 });\n    items.push(...page.items);\n    cursor = page.nextCursor ?? undefined;\n  } while (cursor);\n  return items;\n}\n```"
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "  const page = pm.response.json();",
                  "  if (page.nextCursor) pm.collectionVariables.set('cursor', page.nextCursor);",
                  "  else pm.collectionVariables.unset('cursor');",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "04 — Hydrate one financing line",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"{{financingUuid}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "financingLine"
              ]
            },
            "description": "Use targeted hydration after writes and for checkout. The returned mainApplicant and coApplicants relationship is authoritative."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "  const line = pm.response.json();",
                  "  pm.collectionVariables.set('mainApplicantPersonUuid', line.mainApplicant.personUuid);",
                  "  if (line.loan) pm.collectionVariables.set('loanUuid', line.loan.loanUuid);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "05 — Check checkout eligibility",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"{{financingUuid}}\",\n  \"loanRef\": \"{{loanUuid}}\",\n  \"expectedMainApplicantPersonUuid\": \"{{mainApplicantPersonUuid}}\",\n  \"amountMinor\": \"{{amountMinor}}\",\n  \"trancheId\": \"{{trancheId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "drawEligibility"
              ]
            },
            "description": "Select the main applicant from financingLine.mainApplicant, never from coApplicants. Choose a returned tranche deliberately; this collection does not auto-select one.\n\n```ts\n// Adapted from the Seed World order draw server action.\nconst expectedMainApplicantPersonUuid = line.mainApplicant.personUuid;\nconst eligibility = await fetchDrawEligibility({\n  financingUuid: line.financingUuid,\n  loanRef: line.loan.loanUuid,\n  expectedMainApplicantPersonUuid,\n  amountMinor: order.totalCents,\n  trancheId,\n});\nconst result = await createCfiDraw({\n  financingUuid: line.financingUuid,\n  idempotencyKey: `seedworld-${order.orderUuid}-draw-1`,\n  loanRef: line.loan.loanUuid,\n  expectedMainApplicantPersonUuid,\n  amountMinor: order.totalCents,\n  description: `Seed World order ${order.invoiceRef}`,\n  trancheId,\n  invoiceRef: order.invoiceRef,\n});\n```"
          }
        },
        {
          "name": "06 — Create or replay a draw",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"{{financingUuid}}\",\n  \"idempotencyKey\": \"{{idempotencyKey}}\",\n  \"loanRef\": \"{{loanUuid}}\",\n  \"expectedMainApplicantPersonUuid\": \"{{mainApplicantPersonUuid}}\",\n  \"amountMinor\": \"{{amountMinor}}\",\n  \"description\": \"Retailer order {{invoiceRef}}\",\n  \"trancheId\": \"{{trancheId}}\",\n  \"invoiceRef\": \"{{invoiceRef}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "createDraw"
              ]
            },
            "description": "Persist the retailer order as draw_processing and save this complete canonical request before calling CFI. Every durable outcome returns HTTP 200 with a drawUuid. If the response is lost, resend this exact body with the same idempotencyKey; never generate a replacement key."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 200) {",
                  "  const result = pm.response.json();",
                  "  pm.collectionVariables.set('drawUuid', result.draw.drawUuid);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "07 — Retrieve durable draw outcome",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"drawUuid\": \"{{drawUuid}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/draw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "draw"
              ]
            },
            "description": "Refresh a known draw by its durable identity. If drawUuid was never saved, replay the exact createDraw request first to recover it.\n\n```ts\n// Persist the complete canonical request before the first CFI call.\nconst draw = order.cfiDrawUuid\n  ? await fetchCfiDraw(order.cfiDrawUuid)\n  : (await createCfiDraw(order.cfiCanonicalDrawRequest)).draw;\nawait projectDurableDrawOutcome(order.orderUuid, draw);\n```"
          }
        },
        {
          "name": "08 — Approve, decline or cancel an application",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"{{financingUuid}}\",\n  \"decision\": \"approve\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "decideApplication"
              ]
            },
            "description": "Offer only the actions financingLine.availableActions marks allowed. Send customerProgramStatus (EXISTING or NEW) with an approve when that action lists it under requires. A decision already reflected in the line's status returns replayed: true; a refusal carries reason and details.rawStatus."
          }
        }
      ]
    },
    {
      "name": "crmFinancing",
      "description": "Generated from the public OpenAPI contract. Request and response examples come from the endpoint schemas and metadata.",
      "item": [
        {
          "name": "List the dealer's submitted applicants",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/listApplicants",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "listApplicants"
              ]
            },
            "description": "Cold-start person import: returns the distinct MAIN APPLICANT on every\n**submitted** financing line in the calling dealer's book. Takes no\nparameters — the scope comes from the authenticated caller, so a foreign\ndealer's applicants can never appear.\n\n**Identity and contact only.** No KYC ever crosses this wire (no SSN /\ngovernment id, date of birth, marital status, credit or financials).\n`farmName` is the attached operation's name and is absent for a personal\napplication with no organization on any of the person's lines.\n\n**Deduped by `personUuid`** — a person appearing on several lines is\nreturned once. `personUuid` is the stable key to pass to the lookup and\nsubmit operations."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/listApplicants",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "listApplicants"
                  ]
                },
                "description": "Cold-start person import: returns the distinct MAIN APPLICANT on every\n**submitted** financing line in the calling dealer's book. Takes no\nparameters — the scope comes from the authenticated caller, so a foreign\ndealer's applicants can never appear.\n\n**Identity and contact only.** No KYC ever crosses this wire (no SSN /\ngovernment id, date of birth, marital status, credit or financials).\n`farmName` is the attached operation's name and is absent for a personal\napplication with no organization on any of the person's lines.\n\n**Deduped by `personUuid`** — a person appearing on several lines is\nreturned once. `personUuid` is the stable key to pass to the lookup and\nsubmit operations."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"firstName\": \"Jordan\",\n    \"lastName\": \"Miller\",\n    \"email\": \"applicant@example.com\",\n    \"phone\": \"5155550142\",\n    \"address\": {\n      \"street\": \"1450 Prairie View Road\",\n      \"city\": \"Ames\",\n      \"state\": \"IA\",\n      \"zip\": \"50010\",\n      \"country\": \"US\"\n    },\n    \"farmName\": \"Miller Family Farms\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Get an applicant's financing lines by email",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"applicant@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/profile",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "profile"
              ]
            },
            "description": "Returns the financing lines currently visible in the caller's book for\none applicant email, matched case-insensitively.\n\nOne line spans the application-to-loan lifecycle. `financingUuid` remains\nstable; `loan` is `null` before a loan exists and populated afterwards.\n`status` is the six-value coarse lifecycle and `rawStatus` preserves the\nfull CFI deal status.\n\n## Synchronization contract\n\nA successful `200` is a **complete snapshot of the financing lines that\ncurrently match the requested email, the authenticated dealer's current\naccess scope, USD currency, and the endpoint's lifecycle filters**. It is\nnot a complete historical ledger. `profiles` applies that same contract\nindependently to every returned email group. These reads use stored CFI\nstate; the server does not return a partial-success snapshot. A failed\nrequest is not a snapshot and must not participate in reconciliation.\n\nUse `personUuid` to upsert the applicant and `financingUuid` to upsert the\nfinancing line. Treat `personUuid`, `financingUuid`,\n`status`, `rawStatus`, `requestedCents`, and `loan` as CFI-owned values. Preserve\nCRM-owned fields such as notes, tags, assignments, and workflow state when\nupdating them. Cent amounts are decimal strings on the JSON wire, for\nexample `\"6000000\"`.\n\nRecord a local `lastSeenAt` only when a line is actually returned. When\nsplitting a sync into batches, apply returned updates from each\nsuccessful batch independently; do not mark anything missing for a failed\nbatch.\n\n### Empty results, disappearance, and retention\n\nAn empty `lines` array means the successful query found zero lines matching\nthe current filters for that email. It does **not** say whether the applicant\nor a previously returned line exists elsewhere, was removed, or is merely no\nlonger visible. An empty result for a new email and a previously stored line\nthat is absent from a later response are therefore different local\nobservations, but neither is a deletion signal.\n\nA previously returned line can later be absent in these implemented cases:\n\n- A cancelled or declined deal **without a loan** is outside the live\n  submitted-onward allow-list. A line with a loan remains returned regardless\n  of deal status, while the other filters still apply.\n- A deal whose CFI `disabledAt` value is set (the soft-delete/archive\n  mechanism) is filtered out. No tombstone is returned.\n- A dealer that no longer has access to the deal no longer sees it. Absence\n  does not distinguish revoked access from the other cases.\n- The lookup follows the applicant's current email case-insensitively. After\n  an email change, the old email can be empty and the line can appear under\n  the new email.\n- The applicant's attached organization does not itself select these rows,\n  but changes to dealer/company/franchise access relationships can change\n  visibility.\n- A request or server failure produces a non-200 response rather than an\n  intentionally incomplete 200. Retain all existing records after that\n  failure.\n\n**Absence is not safe for reconciliation by deletion.** The API currently\nhas no deletion, archival, or access-revocation signal. Retain the local\nrecord, leave its previous CFI values intact, and optionally mark it stale or\nneeds-review according to CRM policy. Hard deletion is not recommended. CFI\ndoes not currently guarantee that every line remains queryable forever:\nfunded lines with a loan remain eligible across later statuses, but disabled\nrows, access changes, currency, and email matching can still remove them from\nthis view.\n\n## Example CRM synchronization\n\nCall `profiles` with batches of at most 50 emails:\n\n```ts\nconst applicants = await listApplicants();\nfor (const applicant of applicants) {\n  await crm.upsertApplicant(applicant.personUuid, {\n    cfi: applicant,\n    preserve: [\"notes\", \"tags\", \"ownerId\"],\n  });\n}\n\nfor (const emailBatch of chunks(applicants.map((a) => a.email), 50)) {\n  let groups;\n  try {\n    groups = await profiles({ emails: emailBatch });\n  } catch (error) {\n    await crm.recordSyncFailure(emailBatch, error);\n    continue; // no absence reconciliation for a failed batch\n  }\n\n  const observedAt = new Date().toISOString();\n  for (const group of groups) {\n    if (group.lines.length === 0) {\n      await crm.recordEmptyProfile(group.email, observedAt);\n      continue; // an empty result is not permission to delete\n    }\n\n    for (const line of group.lines) {\n      await crm.upsertFinancingLine(line.financingUuid, {\n        personUuid: line.personUuid,\n        cfi: line, // includes decimal-string cents such as \"6000000\"\n        lastSeenAt: observedAt,\n        preserve: [\"notes\", \"tags\", \"ownerId\"],\n      });\n    }\n\n    await crm.retainUnseenLines(group.email, { mark: \"stale\" });\n  }\n}\n```"
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"applicant@example.com\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/profile",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "profile"
                  ]
                },
                "description": "Returns the financing lines currently visible in the caller's book for\none applicant email, matched case-insensitively.\n\nOne line spans the application-to-loan lifecycle. `financingUuid` remains\nstable; `loan` is `null` before a loan exists and populated afterwards.\n`status` is the six-value coarse lifecycle and `rawStatus` preserves the\nfull CFI deal status.\n\n## Synchronization contract\n\nA successful `200` is a **complete snapshot of the financing lines that\ncurrently match the requested email, the authenticated dealer's current\naccess scope, USD currency, and the endpoint's lifecycle filters**. It is\nnot a complete historical ledger. `profiles` applies that same contract\nindependently to every returned email group. These reads use stored CFI\nstate; the server does not return a partial-success snapshot. A failed\nrequest is not a snapshot and must not participate in reconciliation.\n\nUse `personUuid` to upsert the applicant and `financingUuid` to upsert the\nfinancing line. Treat `personUuid`, `financingUuid`,\n`status`, `rawStatus`, `requestedCents`, and `loan` as CFI-owned values. Preserve\nCRM-owned fields such as notes, tags, assignments, and workflow state when\nupdating them. Cent amounts are decimal strings on the JSON wire, for\nexample `\"6000000\"`.\n\nRecord a local `lastSeenAt` only when a line is actually returned. When\nsplitting a sync into batches, apply returned updates from each\nsuccessful batch independently; do not mark anything missing for a failed\nbatch.\n\n### Empty results, disappearance, and retention\n\nAn empty `lines` array means the successful query found zero lines matching\nthe current filters for that email. It does **not** say whether the applicant\nor a previously returned line exists elsewhere, was removed, or is merely no\nlonger visible. An empty result for a new email and a previously stored line\nthat is absent from a later response are therefore different local\nobservations, but neither is a deletion signal.\n\nA previously returned line can later be absent in these implemented cases:\n\n- A cancelled or declined deal **without a loan** is outside the live\n  submitted-onward allow-list. A line with a loan remains returned regardless\n  of deal status, while the other filters still apply.\n- A deal whose CFI `disabledAt` value is set (the soft-delete/archive\n  mechanism) is filtered out. No tombstone is returned.\n- A dealer that no longer has access to the deal no longer sees it. Absence\n  does not distinguish revoked access from the other cases.\n- The lookup follows the applicant's current email case-insensitively. After\n  an email change, the old email can be empty and the line can appear under\n  the new email.\n- The applicant's attached organization does not itself select these rows,\n  but changes to dealer/company/franchise access relationships can change\n  visibility.\n- A request or server failure produces a non-200 response rather than an\n  intentionally incomplete 200. Retain all existing records after that\n  failure.\n\n**Absence is not safe for reconciliation by deletion.** The API currently\nhas no deletion, archival, or access-revocation signal. Retain the local\nrecord, leave its previous CFI values intact, and optionally mark it stale or\nneeds-review according to CRM policy. Hard deletion is not recommended. CFI\ndoes not currently guarantee that every line remains queryable forever:\nfunded lines with a loan remain eligible across later statuses, but disabled\nrows, access changes, currency, and email matching can still remove them from\nthis view.\n\n## Example CRM synchronization\n\nCall `profiles` with batches of at most 50 emails:\n\n```ts\nconst applicants = await listApplicants();\nfor (const applicant of applicants) {\n  await crm.upsertApplicant(applicant.personUuid, {\n    cfi: applicant,\n    preserve: [\"notes\", \"tags\", \"ownerId\"],\n  });\n}\n\nfor (const emailBatch of chunks(applicants.map((a) => a.email), 50)) {\n  let groups;\n  try {\n    groups = await profiles({ emails: emailBatch });\n  } catch (error) {\n    await crm.recordSyncFailure(emailBatch, error);\n    continue; // no absence reconciliation for a failed batch\n  }\n\n  const observedAt = new Date().toISOString();\n  for (const group of groups) {\n    if (group.lines.length === 0) {\n      await crm.recordEmptyProfile(group.email, observedAt);\n      continue; // an empty result is not permission to delete\n    }\n\n    for (const line of group.lines) {\n      await crm.upsertFinancingLine(line.financingUuid, {\n        personUuid: line.personUuid,\n        cfi: line, // includes decimal-string cents such as \"6000000\"\n        lastSeenAt: observedAt,\n        preserve: [\"notes\", \"tags\", \"ownerId\"],\n      });\n    }\n\n    await crm.retainUnseenLines(group.email, { mark: \"stale\" });\n  }\n}\n```"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"status\": \"funded\",\n    \"rawStatus\": \"funded\",\n    \"requestedCents\": \"6000000\",\n    \"loan\": {\n      \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n      \"cropYear\": 2026,\n      \"approvedCents\": \"6000000\",\n      \"availableCents\": \"5000000\",\n      \"availablePendingCents\": \"6000000\",\n      \"drawnCents\": \"1000000\",\n      \"reservedCents\": \"0\",\n      \"estimatedPayoffCents\": \"1000000\"\n    },\n    \"webhookActive\": true\n  }\n]"
            }
          ]
        },
        {
          "name": "Get financing lines for several applicant emails",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"emails\": [\n    \"applicant@example.com\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/profiles",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "profiles"
              ]
            },
            "description": "Batch form of `crmFinancing.profile`. Send 1-50 emails. The response has\none group per unique input email in first-occurrence order; duplicate\nemails collapse and a matched email with no visible lines receives\n`lines: []` rather than being omitted.\n\nLine data and snapshot semantics are identical to\n`crmFinancing.profile`.\n\n## Synchronization contract\n\nA successful `200` is a **complete snapshot of the financing lines that\ncurrently match the requested email, the authenticated dealer's current\naccess scope, USD currency, and the endpoint's lifecycle filters**. It is\nnot a complete historical ledger. `profiles` applies that same contract\nindependently to every returned email group. These reads use stored CFI\nstate; the server does not return a partial-success snapshot. A failed\nrequest is not a snapshot and must not participate in reconciliation.\n\nUse `personUuid` to upsert the applicant and `financingUuid` to upsert the\nfinancing line. Treat `personUuid`, `financingUuid`,\n`status`, `rawStatus`, `requestedCents`, and `loan` as CFI-owned values. Preserve\nCRM-owned fields such as notes, tags, assignments, and workflow state when\nupdating them. Cent amounts are decimal strings on the JSON wire, for\nexample `\"6000000\"`.\n\nRecord a local `lastSeenAt` only when a line is actually returned. When\nsplitting a sync into batches, apply returned updates from each\nsuccessful batch independently; do not mark anything missing for a failed\nbatch.\n\n### Empty results, disappearance, and retention\n\nAn empty `lines` array means the successful query found zero lines matching\nthe current filters for that email. It does **not** say whether the applicant\nor a previously returned line exists elsewhere, was removed, or is merely no\nlonger visible. An empty result for a new email and a previously stored line\nthat is absent from a later response are therefore different local\nobservations, but neither is a deletion signal.\n\nA previously returned line can later be absent in these implemented cases:\n\n- A cancelled or declined deal **without a loan** is outside the live\n  submitted-onward allow-list. A line with a loan remains returned regardless\n  of deal status, while the other filters still apply.\n- A deal whose CFI `disabledAt` value is set (the soft-delete/archive\n  mechanism) is filtered out. No tombstone is returned.\n- A dealer that no longer has access to the deal no longer sees it. Absence\n  does not distinguish revoked access from the other cases.\n- The lookup follows the applicant's current email case-insensitively. After\n  an email change, the old email can be empty and the line can appear under\n  the new email.\n- The applicant's attached organization does not itself select these rows,\n  but changes to dealer/company/franchise access relationships can change\n  visibility.\n- A request or server failure produces a non-200 response rather than an\n  intentionally incomplete 200. Retain all existing records after that\n  failure.\n\n**Absence is not safe for reconciliation by deletion.** The API currently\nhas no deletion, archival, or access-revocation signal. Retain the local\nrecord, leave its previous CFI values intact, and optionally mark it stale or\nneeds-review according to CRM policy. Hard deletion is not recommended. CFI\ndoes not currently guarantee that every line remains queryable forever:\nfunded lines with a loan remain eligible across later statuses, but disabled\nrows, access changes, currency, and email matching can still remove them from\nthis view.\n\n## Example CRM synchronization\n\nCall `profiles` with batches of at most 50 emails:\n\n```ts\nconst applicants = await listApplicants();\nfor (const applicant of applicants) {\n  await crm.upsertApplicant(applicant.personUuid, {\n    cfi: applicant,\n    preserve: [\"notes\", \"tags\", \"ownerId\"],\n  });\n}\n\nfor (const emailBatch of chunks(applicants.map((a) => a.email), 50)) {\n  let groups;\n  try {\n    groups = await profiles({ emails: emailBatch });\n  } catch (error) {\n    await crm.recordSyncFailure(emailBatch, error);\n    continue; // no absence reconciliation for a failed batch\n  }\n\n  const observedAt = new Date().toISOString();\n  for (const group of groups) {\n    if (group.lines.length === 0) {\n      await crm.recordEmptyProfile(group.email, observedAt);\n      continue; // an empty result is not permission to delete\n    }\n\n    for (const line of group.lines) {\n      await crm.upsertFinancingLine(line.financingUuid, {\n        personUuid: line.personUuid,\n        cfi: line, // includes decimal-string cents such as \"6000000\"\n        lastSeenAt: observedAt,\n        preserve: [\"notes\", \"tags\", \"ownerId\"],\n      });\n    }\n\n    await crm.retainUnseenLines(group.email, { mark: \"stale\" });\n  }\n}\n```"
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"emails\": [\n    \"applicant@example.com\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/profiles",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "profiles"
                  ]
                },
                "description": "Batch form of `crmFinancing.profile`. Send 1-50 emails. The response has\none group per unique input email in first-occurrence order; duplicate\nemails collapse and a matched email with no visible lines receives\n`lines: []` rather than being omitted.\n\nLine data and snapshot semantics are identical to\n`crmFinancing.profile`.\n\n## Synchronization contract\n\nA successful `200` is a **complete snapshot of the financing lines that\ncurrently match the requested email, the authenticated dealer's current\naccess scope, USD currency, and the endpoint's lifecycle filters**. It is\nnot a complete historical ledger. `profiles` applies that same contract\nindependently to every returned email group. These reads use stored CFI\nstate; the server does not return a partial-success snapshot. A failed\nrequest is not a snapshot and must not participate in reconciliation.\n\nUse `personUuid` to upsert the applicant and `financingUuid` to upsert the\nfinancing line. Treat `personUuid`, `financingUuid`,\n`status`, `rawStatus`, `requestedCents`, and `loan` as CFI-owned values. Preserve\nCRM-owned fields such as notes, tags, assignments, and workflow state when\nupdating them. Cent amounts are decimal strings on the JSON wire, for\nexample `\"6000000\"`.\n\nRecord a local `lastSeenAt` only when a line is actually returned. When\nsplitting a sync into batches, apply returned updates from each\nsuccessful batch independently; do not mark anything missing for a failed\nbatch.\n\n### Empty results, disappearance, and retention\n\nAn empty `lines` array means the successful query found zero lines matching\nthe current filters for that email. It does **not** say whether the applicant\nor a previously returned line exists elsewhere, was removed, or is merely no\nlonger visible. An empty result for a new email and a previously stored line\nthat is absent from a later response are therefore different local\nobservations, but neither is a deletion signal.\n\nA previously returned line can later be absent in these implemented cases:\n\n- A cancelled or declined deal **without a loan** is outside the live\n  submitted-onward allow-list. A line with a loan remains returned regardless\n  of deal status, while the other filters still apply.\n- A deal whose CFI `disabledAt` value is set (the soft-delete/archive\n  mechanism) is filtered out. No tombstone is returned.\n- A dealer that no longer has access to the deal no longer sees it. Absence\n  does not distinguish revoked access from the other cases.\n- The lookup follows the applicant's current email case-insensitively. After\n  an email change, the old email can be empty and the line can appear under\n  the new email.\n- The applicant's attached organization does not itself select these rows,\n  but changes to dealer/company/franchise access relationships can change\n  visibility.\n- A request or server failure produces a non-200 response rather than an\n  intentionally incomplete 200. Retain all existing records after that\n  failure.\n\n**Absence is not safe for reconciliation by deletion.** The API currently\nhas no deletion, archival, or access-revocation signal. Retain the local\nrecord, leave its previous CFI values intact, and optionally mark it stale or\nneeds-review according to CRM policy. Hard deletion is not recommended. CFI\ndoes not currently guarantee that every line remains queryable forever:\nfunded lines with a loan remain eligible across later statuses, but disabled\nrows, access changes, currency, and email matching can still remove them from\nthis view.\n\n## Example CRM synchronization\n\nCall `profiles` with batches of at most 50 emails:\n\n```ts\nconst applicants = await listApplicants();\nfor (const applicant of applicants) {\n  await crm.upsertApplicant(applicant.personUuid, {\n    cfi: applicant,\n    preserve: [\"notes\", \"tags\", \"ownerId\"],\n  });\n}\n\nfor (const emailBatch of chunks(applicants.map((a) => a.email), 50)) {\n  let groups;\n  try {\n    groups = await profiles({ emails: emailBatch });\n  } catch (error) {\n    await crm.recordSyncFailure(emailBatch, error);\n    continue; // no absence reconciliation for a failed batch\n  }\n\n  const observedAt = new Date().toISOString();\n  for (const group of groups) {\n    if (group.lines.length === 0) {\n      await crm.recordEmptyProfile(group.email, observedAt);\n      continue; // an empty result is not permission to delete\n    }\n\n    for (const line of group.lines) {\n      await crm.upsertFinancingLine(line.financingUuid, {\n        personUuid: line.personUuid,\n        cfi: line, // includes decimal-string cents such as \"6000000\"\n        lastSeenAt: observedAt,\n        preserve: [\"notes\", \"tags\", \"ownerId\"],\n      });\n    }\n\n    await crm.retainUnseenLines(group.email, { mark: \"stale\" });\n  }\n}\n```"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"email\": \"applicant@example.com\",\n    \"lines\": [\n      {\n        \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n        \"status\": \"funded\",\n        \"rawStatus\": \"funded\",\n        \"requestedCents\": \"6000000\",\n        \"loan\": {\n          \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n          \"cropYear\": 2026,\n          \"approvedCents\": \"6000000\",\n          \"availableCents\": \"5000000\",\n          \"availablePendingCents\": \"6000000\",\n          \"drawnCents\": \"1000000\",\n          \"reservedCents\": \"0\",\n          \"estimatedPayoffCents\": \"1000000\"\n        },\n        \"webhookActive\": true\n      }\n    ]\n  }\n]"
            }
          ]
        },
        {
          "name": "Draw funds on a loan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"amount\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/createDraw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "createDraw"
              ]
            },
            "description": "Draws against a funded loan — the money leg. `loanRef` is the `loanUuid`\nfrom `crmFinancing.getAccountFinancing`, and `trancheId` must be one of the\nids `crmFinancing.getDrawEligibility` returned in `tranches`.\n\n**`amount` is a decimal string of CENTS**, not dollars (`\"150000\"` is\n$1,500.00). Optional `invoiceRef` records the caller's own charge id\nalongside the draw.\n\n**Idempotency is single-use, not retry-until-success.** `idempotencyKey`\nidentifies one draw attempt whose outcome is immutable: a durable request\nrow commits before the funder is called, so at most one draw ever happens\nper key. Re-sending the same key reads back that attempt's outcome — it\nnever re-executes. Use a fresh key only for a genuinely new draw.\n\n**Refusals** carry a machine code in `message` and a payload in `data`:\n`insufficient_credit` (`400`, with `requested` / `available` cents strings),\n`ineligible` (`403`), `not_found` (`404`) and `draw_in_progress` (`409`).\n`data.retriable` is the cue to act on: `true` means a later retry can succeed\n(headroom frees up, a restriction clears); `false` means this loan or key\nwill never draw as sent.\n\nFor `ineligible`, `data.reason` is EITHER a verbatim gate message (surface it\nas-is) OR a machine code. Codes: `not_cfa_funded`, `dealer_admin_required`,\nand `tranche_locked` — the dealer's tranche is chosen automatically, so\n`data.trancheId` is the one tranche this loan may draw on; retry with it\n(`retriable: false` for the tranche you sent). A draw that leaves the tranche\nbelow its manufacturer's minimum is refused with `retriable: false`: `reason`\nis the human sentence, and `data.minimum` / `data.shortfall` are cents strings."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"amount\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "createDraw"
                  ]
                },
                "description": "Draws against a funded loan — the money leg. `loanRef` is the `loanUuid`\nfrom `crmFinancing.getAccountFinancing`, and `trancheId` must be one of the\nids `crmFinancing.getDrawEligibility` returned in `tranches`.\n\n**`amount` is a decimal string of CENTS**, not dollars (`\"150000\"` is\n$1,500.00). Optional `invoiceRef` records the caller's own charge id\nalongside the draw.\n\n**Idempotency is single-use, not retry-until-success.** `idempotencyKey`\nidentifies one draw attempt whose outcome is immutable: a durable request\nrow commits before the funder is called, so at most one draw ever happens\nper key. Re-sending the same key reads back that attempt's outcome — it\nnever re-executes. Use a fresh key only for a genuinely new draw.\n\n**Refusals** carry a machine code in `message` and a payload in `data`:\n`insufficient_credit` (`400`, with `requested` / `available` cents strings),\n`ineligible` (`403`), `not_found` (`404`) and `draw_in_progress` (`409`).\n`data.retriable` is the cue to act on: `true` means a later retry can succeed\n(headroom frees up, a restriction clears); `false` means this loan or key\nwill never draw as sent.\n\nFor `ineligible`, `data.reason` is EITHER a verbatim gate message (surface it\nas-is) OR a machine code. Codes: `not_cfa_funded`, `dealer_admin_required`,\nand `tranche_locked` — the dealer's tranche is chosen automatically, so\n`data.trancheId` is the one tranche this loan may draw on; retry with it\n(`retriable: false` for the tranche you sent). A draw that leaves the tranche\nbelow its manufacturer's minimum is refused with `retriable: false`: `reason`\nis the human sentence, and `data.minimum` / `data.shortfall` are cents strings."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"transactionUuid\": \"80000000-0000-4000-8000-000000000001\"\n}"
            }
          ]
        },
        {
          "name": "Check whether a loan can be drawn on",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/getDrawEligibility",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "getDrawEligibility"
              ]
            },
            "description": "Forward-looking pre-check for `crmFinancing.createDraw`, keyed by the\n`loanUuid` from `crmFinancing.getAccountFinancing`. Intended for UX — it\ndoes not reserve anything, and `createDraw` remains the authoritative gate.\n\n`drawable` is `true` only when no blocker applies. When it is `false`,\n`reason` names the first blocker — a verbatim gate message (surface it\nas-is) or a machine code such as `not_cfa_funded` or `loan_closed`.\n`available` is the loan's headroom in USD cents.\n\n**`tranches`** lists the draw targets `createDraw` will accept: pass one of\nthese `trancheId` values as the request's `trancheId`. When the dealer's\ntranche is chosen automatically, only that one tranche is listed.\n`reference` is the funder's own loan-number string, shown for operator\ndisplay only. If automatic tranche selection is blocked for the dealer,\n`tranches` is empty. Eligibility does not check the manufacturer minimum (it\nhas no amount); `createDraw` does.\n\nAn unknown or other-dealer `loanRef` returns `404`."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/getDrawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "getDrawEligibility"
                  ]
                },
                "description": "Forward-looking pre-check for `crmFinancing.createDraw`, keyed by the\n`loanUuid` from `crmFinancing.getAccountFinancing`. Intended for UX — it\ndoes not reserve anything, and `createDraw` remains the authoritative gate.\n\n`drawable` is `true` only when no blocker applies. When it is `false`,\n`reason` names the first blocker — a verbatim gate message (surface it\nas-is) or a machine code such as `not_cfa_funded` or `loan_closed`.\n`available` is the loan's headroom in USD cents.\n\n**`tranches`** lists the draw targets `createDraw` will accept: pass one of\nthese `trancheId` values as the request's `trancheId`. When the dealer's\ntranche is chosen automatically, only that one tranche is listed.\n`reference` is the funder's own loan-number string, shown for operator\ndisplay only. If automatic tranche selection is blocked for the dealer,\n`tranches` is empty. Eligibility does not check the manufacturer minimum (it\nhas no amount); `createDraw` does.\n\nAn unknown or other-dealer `loanRef` returns `404`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawable\": true,\n  \"available\": \"5000000\",\n  \"reason\": null,\n  \"tranches\": [\n    {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\",\n      \"description\": \"0% 12 Month Carbon Program\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "List an applicant's credit lines",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"applicantEmail\": \"applicant@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/getAccountFinancing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "getAccountFinancing"
              ]
            },
            "description": "Returns the applicant's **funded** crop-year loans — the draw surface. Use\nthis to find the `loanUuid` that `crmFinancing.getDrawEligibility` and\n`crmFinancing.createDraw` take as `loanRef`.\n\n`available` is the real headroom a draw is gated on (not outstanding debt);\n`approved` is the loan amount and `drawn` is the amount drawn to date. All\nthree are USD cents as decimal strings. `status` is the raw loan status.\n\nScoped to the calling dealer's book by the authenticated caller."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"applicantEmail\": \"applicant@example.com\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/getAccountFinancing",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "getAccountFinancing"
                  ]
                },
                "description": "Returns the applicant's **funded** crop-year loans — the draw surface. Use\nthis to find the `loanUuid` that `crmFinancing.getDrawEligibility` and\n`crmFinancing.createDraw` take as `loanRef`.\n\n`available` is the real headroom a draw is gated on (not outstanding debt);\n`approved` is the loan amount and `drawn` is the amount drawn to date. All\nthree are USD cents as decimal strings. `status` is the raw loan status.\n\nScoped to the calling dealer's book by the authenticated caller."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"status\": \"active\",\n    \"approved\": \"6000000\",\n    \"drawn\": \"1000000\",\n    \"available\": \"5000000\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Resolve a known person to a uuid — Example 1",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"by\": \"email\",\n  \"email\": \"applicant@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "lookupPerson"
              ]
            },
            "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"by\": \"email\",\n  \"email\": \"applicant@example.com\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupPerson"
                  ]
                },
                "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"found\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"firstName\": \"Jordan\",\n  \"lastName\": \"Miller\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"by\": \"email\",\n  \"email\": \"applicant@example.com\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupPerson"
                  ]
                },
                "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"not_found\"\n}"
            },
            {
              "name": "200 — Example 3",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"by\": \"email\",\n  \"email\": \"applicant@example.com\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupPerson"
                  ]
                },
                "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"ambiguous\"\n}"
            }
          ]
        },
        {
          "name": "Resolve a known person to a uuid — Example 2",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"by\": \"identity\",\n  \"firstName\": \"Jordan\",\n  \"lastName\": \"Miller\",\n  \"birthDate\": \"1988-07-15T00:00:00.000Z\",\n  \"ssnLast4\": \"4321\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "lookupPerson"
              ]
            },
            "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"by\": \"identity\",\n  \"firstName\": \"Jordan\",\n  \"lastName\": \"Miller\",\n  \"birthDate\": \"1988-07-15T00:00:00.000Z\",\n  \"ssnLast4\": \"4321\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupPerson"
                  ]
                },
                "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"found\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"firstName\": \"Jordan\",\n  \"lastName\": \"Miller\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"by\": \"identity\",\n  \"firstName\": \"Jordan\",\n  \"lastName\": \"Miller\",\n  \"birthDate\": \"1988-07-15T00:00:00.000Z\",\n  \"ssnLast4\": \"4321\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupPerson"
                  ]
                },
                "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"not_found\"\n}"
            },
            {
              "name": "200 — Example 3",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"by\": \"identity\",\n  \"firstName\": \"Jordan\",\n  \"lastName\": \"Miller\",\n  \"birthDate\": \"1988-07-15T00:00:00.000Z\",\n  \"ssnLast4\": \"4321\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupPerson",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupPerson"
                  ]
                },
                "description": "Resolves a person already present on the caller's submitted book to a\n`personUuid`, so `crmFinancing.submitNewApplication` can reference them\ninstead of re-creating the record.\n\n**Two ways to look up**, selected by `by`: `email` (exact, case-insensitive)\nor `identity` (`firstName` + `lastName` + `birthDate` + `ssnLast4`).\n`ssnLast4` is used only for the last-four comparison — it is never stored\nand never echoed back.\n\n**Three outcomes.** `found` returns the `personUuid` and name only — no KYC\ncomes back. `not_found` means no match in your book. `ambiguous` means more\nthan one person matched and carries no details, so a lookup can't be used to\nenumerate records; disambiguate with the `identity` form or submit a full\nrecord instead.\n\nRead-only: nothing is created, updated or subscribed."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"ambiguous\"\n}"
            }
          ]
        },
        {
          "name": "Resolve a known organization to a uuid",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fein\": \"12-3456789\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/lookupOrganization",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "lookupOrganization"
              ]
            },
            "description": "FEIN counterpart to `crmFinancing.lookupPerson`: resolves an organization\nalready present on the caller's submitted book to an `organizationUuid` for\n`crmFinancing.submitNewApplication` to reference.\n\n`fein` is normalized before matching, so `\"12-3456789\"`, `\"12 3456789\"` and\n`\"123456789\"` are the same input; the normalized value must be exactly nine\ncharacters. It is the same FEIN/EIN supplied as `organization.registrationNumber`\nwhen creating an organization. The normalized nine-character value is used for\nduplicate detection and stored on a newly created organization.\n\n**Three outcomes**, same contract as `lookupPerson`: `found` echoes the\n`organizationUuid` and name, `not_found` means no match in your book, and\n`ambiguous` carries no details. Read-only."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"fein\": \"12-3456789\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupOrganization",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupOrganization"
                  ]
                },
                "description": "FEIN counterpart to `crmFinancing.lookupPerson`: resolves an organization\nalready present on the caller's submitted book to an `organizationUuid` for\n`crmFinancing.submitNewApplication` to reference.\n\n`fein` is normalized before matching, so `\"12-3456789\"`, `\"12 3456789\"` and\n`\"123456789\"` are the same input; the normalized value must be exactly nine\ncharacters. It is the same FEIN/EIN supplied as `organization.registrationNumber`\nwhen creating an organization. The normalized nine-character value is used for\nduplicate detection and stored on a newly created organization.\n\n**Three outcomes**, same contract as `lookupPerson`: `found` echoes the\n`organizationUuid` and name, `not_found` means no match in your book, and\n`ambiguous` carries no details. Read-only."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"found\",\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n  \"name\": \"Miller Family Farms LLC\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"fein\": \"12-3456789\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupOrganization",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupOrganization"
                  ]
                },
                "description": "FEIN counterpart to `crmFinancing.lookupPerson`: resolves an organization\nalready present on the caller's submitted book to an `organizationUuid` for\n`crmFinancing.submitNewApplication` to reference.\n\n`fein` is normalized before matching, so `\"12-3456789\"`, `\"12 3456789\"` and\n`\"123456789\"` are the same input; the normalized value must be exactly nine\ncharacters. It is the same FEIN/EIN supplied as `organization.registrationNumber`\nwhen creating an organization. The normalized nine-character value is used for\nduplicate detection and stored on a newly created organization.\n\n**Three outcomes**, same contract as `lookupPerson`: `found` echoes the\n`organizationUuid` and name, `not_found` means no match in your book, and\n`ambiguous` carries no details. Read-only."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"not_found\"\n}"
            },
            {
              "name": "200 — Example 3",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"fein\": \"12-3456789\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/lookupOrganization",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "lookupOrganization"
                  ]
                },
                "description": "FEIN counterpart to `crmFinancing.lookupPerson`: resolves an organization\nalready present on the caller's submitted book to an `organizationUuid` for\n`crmFinancing.submitNewApplication` to reference.\n\n`fein` is normalized before matching, so `\"12-3456789\"`, `\"12 3456789\"` and\n`\"123456789\"` are the same input; the normalized value must be exactly nine\ncharacters. It is the same FEIN/EIN supplied as `organization.registrationNumber`\nwhen creating an organization. The normalized nine-character value is used for\nduplicate detection and stored on a newly created organization.\n\n**Three outcomes**, same contract as `lookupPerson`: `found` echoes the\n`organizationUuid` and name, `not_found` means no match in your book, and\n`ambiguous` carries no details. Read-only."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"outcome\": \"ambiguous\"\n}"
            }
          ]
        },
        {
          "name": "Submit a new financing application — Existing person, no organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "submitNewApplication"
              ]
            },
            "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"rawStatus\": \"funded\",\n  \"requestedCents\": \"6000000\",\n  \"loan\": {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"approvedCents\": \"6000000\",\n    \"availableCents\": \"5000000\",\n    \"availablePendingCents\": \"6000000\",\n    \"drawnCents\": \"1000000\",\n    \"reservedCents\": \"0\",\n    \"estimatedPayoffCents\": \"1000000\"\n  },\n  \"webhookActive\": true,\n  \"ok\": true,\n  \"persons\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"ok\": false,\n  \"entities\": [\n    {\n      \"kind\": \"person\",\n      \"ref\": \"30000000-0000-4000-8000-000000000001\",\n      \"errors\": [\n        \"govID: required\"\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "409 — Idempotent replay",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"submission_key_used\",\n  \"data\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"persons\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": null\n  }\n}"
            },
            {
              "name": "409 — Duplicate applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_applicant_email\",\n  \"data\": {\n    \"email\": \"applicant@example.com\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"firstName\": \"Jordan\",\n    \"lastName\": \"Miller\"\n  }\n}"
            },
            {
              "name": "409 — Duplicate organization FEIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_organization_fein\",\n  \"data\": {\n    \"fein\": \"123456789\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Miller Family Farms LLC\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a new financing application — Existing person and organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "submitNewApplication"
              ]
            },
            "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks both existing records without updating either stored record."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks both existing records without updating either stored record."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"rawStatus\": \"funded\",\n  \"requestedCents\": \"6000000\",\n  \"loan\": {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"approvedCents\": \"6000000\",\n    \"availableCents\": \"5000000\",\n    \"availablePendingCents\": \"6000000\",\n    \"drawnCents\": \"1000000\",\n    \"reservedCents\": \"0\",\n    \"estimatedPayoffCents\": \"1000000\"\n  },\n  \"webhookActive\": true,\n  \"ok\": true,\n  \"persons\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks both existing records without updating either stored record."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"ok\": false,\n  \"entities\": [\n    {\n      \"kind\": \"person\",\n      \"ref\": \"30000000-0000-4000-8000-000000000001\",\n      \"errors\": [\n        \"govID: required\"\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "409 — Idempotent replay",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks both existing records without updating either stored record."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"submission_key_used\",\n  \"data\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"persons\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": null\n  }\n}"
            },
            {
              "name": "409 — Duplicate applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks both existing records without updating either stored record."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_applicant_email\",\n  \"data\": {\n    \"email\": \"applicant@example.com\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"firstName\": \"Jordan\",\n    \"lastName\": \"Miller\"\n  }\n}"
            },
            {
              "name": "409 — Duplicate organization FEIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nLinks both existing records without updating either stored record."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_organization_fein\",\n  \"data\": {\n    \"fein\": \"123456789\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Miller Family Farms LLC\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a new financing application — New person, no organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "submitNewApplication"
              ]
            },
            "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"rawStatus\": \"funded\",\n  \"requestedCents\": \"6000000\",\n  \"loan\": {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"approvedCents\": \"6000000\",\n    \"availableCents\": \"5000000\",\n    \"availablePendingCents\": \"6000000\",\n    \"drawnCents\": \"1000000\",\n    \"reservedCents\": \"0\",\n    \"estimatedPayoffCents\": \"1000000\"\n  },\n  \"webhookActive\": true,\n  \"ok\": true,\n  \"persons\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"ok\": false,\n  \"entities\": [\n    {\n      \"kind\": \"person\",\n      \"ref\": \"30000000-0000-4000-8000-000000000001\",\n      \"errors\": [\n        \"govID: required\"\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "409 — Idempotent replay",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"submission_key_used\",\n  \"data\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"persons\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": null\n  }\n}"
            },
            {
              "name": "409 — Duplicate applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_applicant_email\",\n  \"data\": {\n    \"email\": \"applicant@example.com\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"firstName\": \"Jordan\",\n    \"lastName\": \"Miller\"\n  }\n}"
            },
            {
              "name": "409 — Duplicate organization FEIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_organization_fein\",\n  \"data\": {\n    \"fein\": \"123456789\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Miller Family Farms LLC\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a new financing application — New person and organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"record\",\n    \"name\": \"Record Farms LLC\",\n    \"registrationNumber\": \"12-3456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedDate\": \"2000-01-01T00:00:00.000Z\",\n    \"incorporatedLocation\": \"NY\",\n    \"totalAssets\": 1500000,\n    \"totalLiabilities\": 400000,\n    \"grossFarmIncome\": 900000,\n    \"nonFarmIncome\": 25000,\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ]\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "submitNewApplication"
              ]
            },
            "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates full person and organization records, including a formatted FEIN/EIN and supported organization type."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"record\",\n    \"name\": \"Record Farms LLC\",\n    \"registrationNumber\": \"12-3456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedDate\": \"2000-01-01T00:00:00.000Z\",\n    \"incorporatedLocation\": \"NY\",\n    \"totalAssets\": 1500000,\n    \"totalLiabilities\": 400000,\n    \"grossFarmIncome\": 900000,\n    \"nonFarmIncome\": 25000,\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ]\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates full person and organization records, including a formatted FEIN/EIN and supported organization type."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"rawStatus\": \"funded\",\n  \"requestedCents\": \"6000000\",\n  \"loan\": {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"approvedCents\": \"6000000\",\n    \"availableCents\": \"5000000\",\n    \"availablePendingCents\": \"6000000\",\n    \"drawnCents\": \"1000000\",\n    \"reservedCents\": \"0\",\n    \"estimatedPayoffCents\": \"1000000\"\n  },\n  \"webhookActive\": true,\n  \"ok\": true,\n  \"persons\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"record\",\n    \"name\": \"Record Farms LLC\",\n    \"registrationNumber\": \"12-3456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedDate\": \"2000-01-01T00:00:00.000Z\",\n    \"incorporatedLocation\": \"NY\",\n    \"totalAssets\": 1500000,\n    \"totalLiabilities\": 400000,\n    \"grossFarmIncome\": 900000,\n    \"nonFarmIncome\": 25000,\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ]\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates full person and organization records, including a formatted FEIN/EIN and supported organization type."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"ok\": false,\n  \"entities\": [\n    {\n      \"kind\": \"person\",\n      \"ref\": \"30000000-0000-4000-8000-000000000001\",\n      \"errors\": [\n        \"govID: required\"\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "409 — Idempotent replay",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"record\",\n    \"name\": \"Record Farms LLC\",\n    \"registrationNumber\": \"12-3456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedDate\": \"2000-01-01T00:00:00.000Z\",\n    \"incorporatedLocation\": \"NY\",\n    \"totalAssets\": 1500000,\n    \"totalLiabilities\": 400000,\n    \"grossFarmIncome\": 900000,\n    \"nonFarmIncome\": 25000,\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ]\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates full person and organization records, including a formatted FEIN/EIN and supported organization type."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"submission_key_used\",\n  \"data\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"persons\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": null\n  }\n}"
            },
            {
              "name": "409 — Duplicate applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"record\",\n    \"name\": \"Record Farms LLC\",\n    \"registrationNumber\": \"12-3456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedDate\": \"2000-01-01T00:00:00.000Z\",\n    \"incorporatedLocation\": \"NY\",\n    \"totalAssets\": 1500000,\n    \"totalLiabilities\": 400000,\n    \"grossFarmIncome\": 900000,\n    \"nonFarmIncome\": 25000,\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ]\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates full person and organization records, including a formatted FEIN/EIN and supported organization type."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_applicant_email\",\n  \"data\": {\n    \"email\": \"applicant@example.com\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"firstName\": \"Jordan\",\n    \"lastName\": \"Miller\"\n  }\n}"
            },
            {
              "name": "409 — Duplicate organization FEIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"persons\": [\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Ray\",\n      \"last_name\": \"Record\",\n      \"email\": \"ray.record@example.com\",\n      \"phone\": \"8015551234\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"987654321\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 100,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"123 Main St\",\n          \"city\": \"New York\",\n          \"state\": \"NY\",\n          \"zip\": \"10001\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"record\",\n    \"name\": \"Record Farms LLC\",\n    \"registrationNumber\": \"12-3456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedDate\": \"2000-01-01T00:00:00.000Z\",\n    \"incorporatedLocation\": \"NY\",\n    \"totalAssets\": 1500000,\n    \"totalLiabilities\": 400000,\n    \"grossFarmIncome\": 900000,\n    \"nonFarmIncome\": 25000,\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ]\n  },\n  \"financeAmountCents\": \"6000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\nCreates full person and organization records, including a formatted FEIN/EIN and supported organization type."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_organization_fein\",\n  \"data\": {\n    \"fein\": \"123456789\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Miller Family Farms LLC\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a new financing application — Main applicant with a co-applicant",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"5155550188\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"246813579\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancing",
                "submitNewApplication"
              ]
            },
            "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"5155550188\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"246813579\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"rawStatus\": \"funded\",\n  \"requestedCents\": \"6000000\",\n  \"loan\": {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"approvedCents\": \"6000000\",\n    \"availableCents\": \"5000000\",\n    \"availablePendingCents\": \"6000000\",\n    \"drawnCents\": \"1000000\",\n    \"reservedCents\": \"0\",\n    \"estimatedPayoffCents\": \"1000000\"\n  },\n  \"webhookActive\": true,\n  \"ok\": true,\n  \"persons\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"5155550188\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"246813579\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"ok\": false,\n  \"entities\": [\n    {\n      \"kind\": \"person\",\n      \"ref\": \"30000000-0000-4000-8000-000000000001\",\n      \"errors\": [\n        \"govID: required\"\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "409 — Idempotent replay",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"5155550188\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"246813579\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"submission_key_used\",\n  \"data\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"persons\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": null\n  }\n}"
            },
            {
              "name": "409 — Duplicate applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"5155550188\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"246813579\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_applicant_email\",\n  \"data\": {\n    \"email\": \"applicant@example.com\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n    \"firstName\": \"Jordan\",\n    \"lastName\": \"Miller\"\n  }\n}"
            },
            {
              "name": "409 — Duplicate organization FEIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"persons\": [\n    {\n      \"kind\": \"reference\",\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"kind\": \"record\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"5155550188\",\n      \"communication_preference\": \"Email\",\n      \"birth_date\": \"1988-07-15T00:00:00.000Z\",\n      \"marital_status\": \"Single\",\n      \"govID\": \"246813579\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"totalAssets\": 450000,\n      \"totalLiabilities\": 125000,\n      \"grossFarmIncome\": 350000,\n      \"nonFarmIncome\": 75000,\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ]\n    }\n  ],\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancing/submitNewApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancing",
                    "submitNewApplication"
                  ]
                },
                "description": "Creates and submits a whole application in one atomic call: every party is\ncreated or linked, the financing line is created, and it is submitted to the\nfunder — or nothing is persisted at all.\n\n**Entity slots.** Each entry in `persons`, and the\noptional `organization` are\neither `{ kind: \"reference\", … }` with a uuid from\n`crmFinancing.lookupPerson` / `lookupOrganization`, or\n`{ kind: \"record\", … }` with the full details to create. A `reference` only\nlinks — it never updates the record on file. `persons[0]` identifies the\nprimary applicant; later entries are additional applicants in request order.\n\n**Full records.** `year_began_farming` is a legacy name for whole years of\nfarming experience (1–99), not a calendar year. Person and organization\n`totalAssets`, `totalLiabilities`, `grossFarmIncome`, and `nonFarmIncome`\nare whole USD dollars, not cents. Totals must be positive whole dollars;\nincome may be zero and defaults to zero when omitted. New organizations use\na CFA-supported `type` and supply their FEIN/EIN as `registrationNumber`;\nformatted FEINs are accepted and normalized before matching and persistence.\n\n**`financeAmountCents`** is USD cents (a decimal string on the wire) and must\nbe positive. `inputFinance` carries the optional farm block (states, crop\ntypes, acreage, and `expectedRevenueCents`, which is also decimal-string\nUSD cents).\n\n**Request examples.** The five published examples cover an existing person\nwithout an organization; an existing person with an existing organization;\na new person without an organization; a new person with a new organization;\nand an application with multiple people.\n\n**Two success shapes, discriminated on `ok`.** `ok: false` is a completeness\nreport — `entities` lists each incomplete person / organization / loan with\nits `ref` and field-level `errors`, and **nothing was persisted**; fix and\nresend. `ok: true` is the committed, submitted financing line (same shape as\n`crmFinancing.profile`) plus `persons` — every party in request order — and\n`organizationUuid`.\n\n**Idempotency.** `submissionUuid` is your key for this application. Re-using\none that already committed returns `409` with `message: \"submission_key_used\"`.\nTreat this legacy branch as a successful\nreplay: reuse its original `financingUuid`, every `personUuid` in request\norder, and nullable `organizationUuid`. Do not submit again with a newly\ngenerated idempotency key. V1 retains its original error shape; new\nintegrations should use `crmFinancingV2`, whose conflict data includes a\nmachine-readable `reason` discriminator.\n\n**Other conflicts** (`409`) are genuine failures requiring user action.\n`message` is either `\"duplicate_applicant_email\"` (an email already on\nfile, or repeated across two `record` slots — reference the existing person\ninstead) or `\"duplicate_organization_fein\"`. A `reference` to\na uuid outside your book returns `404 person_reference_not_found` /\n`organization_reference_not_found`.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "409",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"CONFLICT\",\n  \"status\": 409,\n  \"message\": \"duplicate_organization_fein\",\n  \"data\": {\n    \"fein\": \"123456789\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Miller Family Farms LLC\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "crmFinancingV2",
      "description": "Generated from the public OpenAPI contract. Request and response examples come from the endpoint schemas and metadata.",
      "item": [
        {
          "name": "Create or replay a draw",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "createDraw"
              ]
            },
            "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
          },
          "response": [
            {
              "name": "200 — A new draw succeeded",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"draw\": {\n    \"drawUuid\": \"80000000-0000-4000-8000-000000000001\",\n    \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"status\": \"succeeded\",\n    \"amountCents\": \"150000\",\n    \"currency\": \"USD\",\n    \"description\": \"Seed invoice INV-2026-0042\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"INV-2026-0042\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 40\",\n        \"amountCents\": \"120000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"description\": \"Freight\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": null\n      }\n    ],\n    \"failure\": null,\n    \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:02.000Z\",\n    \"completedAt\": \"2026-06-15T18:30:02.000Z\"\n  }\n}"
            },
            {
              "name": "200 — A new draw has an uncertain provider outcome",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"draw\": {\n    \"drawUuid\": \"80000000-0000-4000-8000-000000000002\",\n    \"idempotencyKey\": \"invoice-inv-2026-0043-draw-1\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"status\": \"in_progress\",\n    \"amountCents\": \"150000\",\n    \"currency\": \"USD\",\n    \"description\": \"Seed invoice INV-2026-0043 awaiting provider reconciliation\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"INV-2026-0043\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 40\",\n        \"amountCents\": \"120000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"description\": \"Freight\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": null\n      }\n    ],\n    \"failure\": null,\n    \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:01.000Z\",\n    \"completedAt\": null\n  }\n}"
            },
            {
              "name": "200 — An exact retry returned the durable in-progress request",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": true,\n  \"draw\": {\n    \"drawUuid\": \"80000000-0000-4000-8000-000000000002\",\n    \"idempotencyKey\": \"invoice-inv-2026-0043-draw-1\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"status\": \"in_progress\",\n    \"amountCents\": \"150000\",\n    \"currency\": \"USD\",\n    \"description\": \"Seed invoice INV-2026-0043 awaiting provider reconciliation\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"INV-2026-0043\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 40\",\n        \"amountCents\": \"120000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"description\": \"Freight\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": null\n      }\n    ],\n    \"failure\": null,\n    \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:01.000Z\",\n    \"completedAt\": null\n  }\n}"
            },
            {
              "name": "200 — A new draw was rejected",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"draw\": {\n    \"drawUuid\": \"80000000-0000-4000-8000-000000000003\",\n    \"idempotencyKey\": \"invoice-inv-2026-0044-draw-1\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"status\": \"rejected\",\n    \"amountCents\": \"150000\",\n    \"currency\": \"USD\",\n    \"description\": \"Seed invoice INV-2026-0044\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"INV-2026-0044\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 40\",\n        \"amountCents\": \"120000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"description\": \"Freight\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": null\n      }\n    ],\n    \"failure\": {\n      \"reason\": \"insufficient_credit\",\n      \"retriable\": true,\n      \"message\": \"Amount requested exceeds what is currently available.\"\n    },\n    \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:02.000Z\",\n    \"completedAt\": \"2026-06-15T18:30:02.000Z\"\n  }\n}"
            },
            {
              "name": "200 — An exact retry returned the durable rejection",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": true,\n  \"draw\": {\n    \"drawUuid\": \"80000000-0000-4000-8000-000000000003\",\n    \"idempotencyKey\": \"invoice-inv-2026-0044-draw-1\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"status\": \"rejected\",\n    \"amountCents\": \"150000\",\n    \"currency\": \"USD\",\n    \"description\": \"Seed invoice INV-2026-0044\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"INV-2026-0044\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 40\",\n        \"amountCents\": \"120000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      },\n      {\n        \"description\": \"Freight\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": null\n      }\n    ],\n    \"failure\": {\n      \"reason\": \"insufficient_credit\",\n      \"retriable\": true,\n      \"message\": \"Amount requested exceeds what is currently available.\"\n    },\n    \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:02.000Z\",\n    \"completedAt\": \"2026-06-15T18:30:02.000Z\"\n  }\n}"
            },
            {
              "name": "400 — Missing draw context",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"financingUuid is required.\"\n      },\n      {\n        \"path\": [\n          \"loanRef\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"loanRef is required.\"\n      },\n      {\n        \"path\": [\n          \"expectedMainApplicantPersonUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"expectedMainApplicantPersonUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing idempotency key",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"idempotencyKey\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"idempotencyKey is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid loan UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"loanRef\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid main-applicant UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"expectedMainApplicantPersonUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"amountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"amountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing description",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"description\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"description is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid tranche UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"trancheId\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing tranche UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"trancheId\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"trancheId is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createDraw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createDraw"
                  ]
                },
                "description": "Executes a draw with authoritative eligibility revalidation. The earlier eligibility check is advisory and does not reserve funds. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nSend the selected line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies this three-part context before executing or replaying a draw. `applicant_context_mismatch` commonly indicates that a co-applicant, stale customer mapping, or cached applicant was treated as the main applicant.\n\n`idempotencyKey` is scoped to the authenticated dealer and the createDraw operation; application submission keys use a separate namespace. It must contain 8 through 128 characters. Reusing the same key and normalized payload replays the permanent durable succeeded, rejected, or in-progress outcome without another CFA wire call, including when concurrent callers race for the key.\n\nReusing the key with a different loan, amount, description, tranche, or invoice reference returns `idempotency_key_reused_with_different_request` and never repeats the draw.\n\nA draw refused before any durable request is recorded returns HTTP 403 with `data.reason: ineligible` and `data.retriable`; `data.details` carries the underlying refusal. `details.reason` is either a verbatim gate message (surface it as-is) or a machine code. `tranche_locked` means the dealer's tranche is chosen automatically: `details.trancheId` is the one tranche this loan may draw on, so retry with it. A draw that leaves its tranche below the manufacturer's minimum is refused with `details.retriable: false`, `details.reason` as the human sentence, and `details.minimum` / `details.shortfall` as cents strings.\n\nOnce CFI durably records a draw request, `createDraw` returns HTTP 200 for every durable outcome: `succeeded`, `rejected`, or `in_progress`. A rejected draw includes its stable `drawUuid` and structured `failure`; it is not a transport or validation error.\n\nAn uncertain provider outcome returns HTTP 200 with `draw.status: \"in_progress\"`, a durable `drawUuid`, `completedAt: null`, and `failure: null`. This state means CFI recorded the request but cannot yet determine whether the provider completed it; it is neither a success nor a rejection.\n\nIf the client loses any durable `createDraw` response, resend the exact request with the same idempotency key. The replay returns the same `drawUuid`, the current durable status, and `replayed: true` without contacting the provider again. Then use `draw` for targeted status refreshes.\n\nDo not create a new idempotency key for an in-progress draw. An exact retry is safe, returns the same `drawUuid` with `replayed: true`, and does not contact the provider again. Persist the returned `drawUuid` and use `draw` to retrieve the current durable state. If the response was lost, retry this operation with the exact same key and normalized payload.\n\nAn in-progress or rejected request does not change public availability. A succeeded request creates the durable local ACH transaction, but provider-reported availability may remain unchanged until the best-effort provider synchronization completes.\n\nAutomatic provider reconciliation is not currently implemented. An indefinitely in-progress draw requires CFI support to reconcile; clients should retain their local order in a processing state until the draw becomes succeeded or rejected.\n\nHTTP 409 is reserved for genuine request conflicts such as applicant or loan context mismatch and reuse of an idempotency key with a different request."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"currency\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Approve, decline or cancel an application — Example 1",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "decideApplication"
              ]
            },
            "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n    \"status\": \"approved\",\n    \"rawStatus\": \"funder_offer_pending\",\n    \"requestedCents\": \"5000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000005\"\n    },\n    \"coApplicants\": [],\n    \"organizationUuid\": null,\n    \"loan\": null,\n    \"createdAt\": \"2026-06-01T13:00:00.000Z\",\n    \"updatedAt\": \"2026-06-28T17:15:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": true,\n        \"requires\": []\n      }\n    }\n  },\n  \"replayed\": false\n}"
            },
            {
              "name": "400 — Missing financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"financingUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid decision",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"decision\"\n        ],\n        \"code\": \"invalid_value\",\n        \"message\": \"Invalid enum value. Expected \\\"approve\\\" | \\\"decline\\\" | \\\"cancel\\\".\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"dealUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Approve, decline or cancel an application — Example 2",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\",\n  \"customerProgramStatus\": \"EXISTING\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "decideApplication"
              ]
            },
            "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\",\n  \"customerProgramStatus\": \"EXISTING\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n    \"status\": \"approved\",\n    \"rawStatus\": \"funder_offer_pending\",\n    \"requestedCents\": \"5000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000005\"\n    },\n    \"coApplicants\": [],\n    \"organizationUuid\": null,\n    \"loan\": null,\n    \"createdAt\": \"2026-06-01T13:00:00.000Z\",\n    \"updatedAt\": \"2026-06-28T17:15:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": true,\n        \"requires\": []\n      }\n    }\n  },\n  \"replayed\": false\n}"
            },
            {
              "name": "400 — Missing financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\",\n  \"customerProgramStatus\": \"EXISTING\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"financingUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid decision",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\",\n  \"customerProgramStatus\": \"EXISTING\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"decision\"\n        ],\n        \"code\": \"invalid_value\",\n        \"message\": \"Invalid enum value. Expected \\\"approve\\\" | \\\"decline\\\" | \\\"cancel\\\".\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"decision\": \"approve\",\n  \"customerProgramStatus\": \"EXISTING\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/decideApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "decideApplication"
                  ]
                },
                "description": "Takes one dealer decision on a financing line the authenticated dealer can access, using the same rules as the Applications page. Drive buttons from the line's `availableActions` (returned by `financingLines` and `financingLine`) rather than re-deriving them from `status`.\n\n`approve` accepts the funder's offer: the line must be `awaiting_approval` (`rawStatus: funder_offer`) and moves to `funder_offer_pending` (`status: approved`). `decline` declines that offer (`dealer_declined`). `cancel` withdraws any application that has not funded or already been declined (`cancelled`). The caller must hold the DEALER_ADMIN policy for every decision, cancel included; without it the call is refused with HTTP 403 before anything is read.\n\nApproving may also be blocked by the line's risk or limits (`high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`). For a gated dealer, send `customerProgramStatus` (`EXISTING` or `NEW`) with the approve; without it the call is refused with `customer_program_status_required`. The classification is stored with the approval.\n\nDecisions are idempotent by outcome. Repeating a decision the line already reflects (approve on `funder_offer_pending`, decline on `dealer_declined`, cancel on `cancelled`) succeeds with `replayed: true` and changes nothing. A gated approve re-sent with a different classification than the stored one is refused with `customer_program_status_conflict`.\n\nA success returns the fresh `financingLine` (including `availableActions`) and `replayed`.\n\nRefusals use `data.reason`. HTTP 403 means this caller or this line's risk or limits do not allow the action: `forbidden_role`, `high_credit_risk`, `tier2_restricted`, `tier_limit_exceeded`, `customer_program_status_required`. HTTP 409 means the line's status does not allow it, or conflicts with what was already decided: `not_awaiting_approval`, `not_cancellable`, `customer_program_status_conflict`. `data.details.rawStatus` is the line's current exact status and `data.guidance` the human-readable explanation. All refusals are non-retriable until the line changes.\n\nAn unknown or inaccessible `financingUuid` returns HTTP 404 with `data.reason: financing_line_not_found`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"dealUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a durable draw request",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/draw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "draw"
              ]
            },
            "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
          },
          "response": [
            {
              "name": "200 — Draw succeeded",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/draw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "draw"
                  ]
                },
                "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\",\n  \"idempotencyKey\": \"invoice-inv-2026-0042-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n  \"status\": \"succeeded\",\n  \"amountCents\": \"150000\",\n  \"currency\": \"USD\",\n  \"description\": \"Seed invoice INV-2026-0042\",\n  \"tranche\": {\n    \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n    \"reference\": \"348613002-A\"\n  },\n  \"invoiceRef\": \"INV-2026-0042\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": null\n    }\n  ],\n  \"failure\": null,\n  \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n  \"updatedAt\": \"2026-06-15T18:30:02.000Z\",\n  \"completedAt\": \"2026-06-15T18:30:02.000Z\"\n}"
            },
            {
              "name": "200 — Provider outcome is still unknown",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/draw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "draw"
                  ]
                },
                "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000002\",\n  \"idempotencyKey\": \"invoice-inv-2026-0043-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n  \"status\": \"in_progress\",\n  \"amountCents\": \"150000\",\n  \"currency\": \"USD\",\n  \"description\": \"Seed invoice INV-2026-0043 awaiting provider reconciliation\",\n  \"tranche\": {\n    \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n    \"reference\": \"348613002-A\"\n  },\n  \"invoiceRef\": \"INV-2026-0043\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": null\n    }\n  ],\n  \"failure\": null,\n  \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n  \"updatedAt\": \"2026-06-15T18:30:01.000Z\",\n  \"completedAt\": null\n}"
            },
            {
              "name": "200 — Draw rejected",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/draw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "draw"
                  ]
                },
                "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000003\",\n  \"idempotencyKey\": \"invoice-inv-2026-0044-draw-1\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n  \"status\": \"rejected\",\n  \"amountCents\": \"150000\",\n  \"currency\": \"USD\",\n  \"description\": \"Seed invoice INV-2026-0044\",\n  \"tranche\": {\n    \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n    \"reference\": \"348613002-A\"\n  },\n  \"invoiceRef\": \"INV-2026-0044\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 40\",\n      \"amountCents\": \"120000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    },\n    {\n      \"description\": \"Freight\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": null\n    }\n  ],\n  \"failure\": {\n    \"reason\": \"insufficient_credit\",\n    \"retriable\": true,\n    \"message\": \"Amount requested exceeds what is currently available.\"\n  },\n  \"createdAt\": \"2026-06-15T18:30:00.000Z\",\n  \"updatedAt\": \"2026-06-15T18:30:02.000Z\",\n  \"completedAt\": \"2026-06-15T18:30:02.000Z\"\n}"
            },
            {
              "name": "400 — Missing draw UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/draw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "draw"
                  ]
                },
                "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"drawUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"drawUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid draw UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/draw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "draw"
                  ]
                },
                "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"drawUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"drawUuid\": \"80000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/draw",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "draw"
                  ]
                },
                "description": "Returns the current durable outcome for the stable `drawUuid`, including its tenant-scoped idempotency key, financing line, loan, tranche, amount, lifecycle, and any persisted rejection.\n\nLookup is tenant- and financing-book-scoped. A nonexistent draw and a draw outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: draw_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"transactionUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Create or replay a product return",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "createProductReturn"
              ]
            },
            "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
          },
          "response": [
            {
              "name": "200 — Return posted instantly",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createProductReturn"
                  ]
                },
                "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"productReturn\": {\n    \"returnUuid\": \"90000000-0000-4000-8000-000000000001\",\n    \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"route\": \"instant\",\n    \"status\": \"succeeded\",\n    \"amountCents\": \"30000\",\n    \"currency\": \"USD\",\n    \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"CM-2026-0007\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 10\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      }\n    ],\n    \"failure\": null,\n    \"createdAt\": \"2026-10-06T18:30:00.000Z\",\n    \"updatedAt\": \"2026-10-06T18:30:02.000Z\",\n    \"completedAt\": \"2026-10-06T18:30:02.000Z\"\n  }\n}"
            },
            {
              "name": "200 — Return queued for manual entry",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createProductReturn"
                  ]
                },
                "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"productReturn\": {\n    \"returnUuid\": \"90000000-0000-4000-8000-000000000002\",\n    \"idempotencyKey\": \"credit-memo-cm-2026-0008\",\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"route\": \"queued\",\n    \"status\": \"queued\",\n    \"amountCents\": \"30000\",\n    \"currency\": \"USD\",\n    \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n    \"tranche\": {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\"\n    },\n    \"invoiceRef\": \"CM-2026-0007\",\n    \"lineItems\": [\n      {\n        \"description\": \"Seed Treatment 2.5 gal x 10\",\n        \"amountCents\": \"30000\",\n        \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n      }\n    ],\n    \"failure\": null,\n    \"createdAt\": \"2026-10-06T18:30:00.000Z\",\n    \"updatedAt\": \"2026-10-06T18:30:02.000Z\",\n    \"completedAt\": null\n  }\n}"
            },
            {
              "name": "400 — Missing idempotency key",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createProductReturn"
                  ]
                },
                "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"idempotencyKey\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"idempotencyKey is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid tranche UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createProductReturn"
                  ]
                },
                "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"trancheId\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Line items do not add up",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createProductReturn"
                  ]
                },
                "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"lineItems\"\n        ],\n        \"code\": \"invalid_value\",\n        \"message\": \"Line item amounts must add up to amountCents.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"30000\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/createProductReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "createProductReturn"
                  ]
                },
                "description": "Records a product return against one of the dealer's tranches, routed by CFI exactly as the dealer's return dialog: a return that fits the tranche's unposted draws goes to the provider immediately (`route: instant`); a larger one, or one the provider refuses at its cut-off, is queued for CFI to enter manually (`route: queued`).\n\n`trancheId` must be one of the dealer's tranches for the loan's crop year, in any status. An unknown tranche, another dealer's tranche, or one with no reference on the loan returns HTTP 400 with `data.reason: tranche_not_found`. A return larger than the tranche can take returns HTTP 400 with `data.reason: exceeds_cap` (or `no_principal_advanced`) and writes nothing. The one exception: a return the provider first refused at its cut-off and that CFI then cannot queue (the cap is used up) is recorded as `rejected` and answered HTTP 200 like any durable outcome.\n\nOptional `lineItems` must add up exactly to `amountCents`. A `productUuid` must be enrolled on the tranche (see `drawEligibility` → `tranches[].products`), else HTTP 400 `invalid_request` with an `invalid_value` issue at `lineItems[i].productUuid`.\n\nEvery durable outcome is HTTP 200: `succeeded`, `in_progress`, `rejected`, `queued`, `processed` or `cancelled`. `idempotencyKey` is single-use per return: re-sending it with the same payload replays the stored outcome (`replayed: true`) without contacting the provider; a different payload returns HTTP 409 `idempotency_key_reused_with_different_request`.\n\nThe caller must hold the DEALER_ADMIN policy, on create and on replay; without it the call is refused with HTTP 403 before anything is read."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"quantity\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a durable product return",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/productReturn",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "productReturn"
              ]
            },
            "description": "Returns the current durable state of a return by its stable `returnUuid`: `succeeded`, `in_progress`, `rejected`, or, for a queued return, `queued` / `processed` / `cancelled` as CFI works it. A processed return is reported as `processed`, not `succeeded`.\n\nLookup is tenant- and financing-book-scoped. An unknown uuid, another dealer's return and the uuid of a draw all return HTTP 404 with `data.reason: product_return_not_found`."
          },
          "response": [
            {
              "name": "200 — Return posted instantly",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/productReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "productReturn"
                  ]
                },
                "description": "Returns the current durable state of a return by its stable `returnUuid`: `succeeded`, `in_progress`, `rejected`, or, for a queued return, `queued` / `processed` / `cancelled` as CFI works it. A processed return is reported as `processed`, not `succeeded`.\n\nLookup is tenant- and financing-book-scoped. An unknown uuid, another dealer's return and the uuid of a draw all return HTTP 404 with `data.reason: product_return_not_found`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\",\n  \"idempotencyKey\": \"credit-memo-cm-2026-0007\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n  \"route\": \"instant\",\n  \"status\": \"succeeded\",\n  \"amountCents\": \"30000\",\n  \"currency\": \"USD\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"tranche\": {\n    \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n    \"reference\": \"348613002-A\"\n  },\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"failure\": null,\n  \"createdAt\": \"2026-10-06T18:30:00.000Z\",\n  \"updatedAt\": \"2026-10-06T18:30:02.000Z\",\n  \"completedAt\": \"2026-10-06T18:30:02.000Z\"\n}"
            },
            {
              "name": "200 — Return queued for manual entry",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/productReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "productReturn"
                  ]
                },
                "description": "Returns the current durable state of a return by its stable `returnUuid`: `succeeded`, `in_progress`, `rejected`, or, for a queued return, `queued` / `processed` / `cancelled` as CFI works it. A processed return is reported as `processed`, not `succeeded`.\n\nLookup is tenant- and financing-book-scoped. An unknown uuid, another dealer's return and the uuid of a draw all return HTTP 404 with `data.reason: product_return_not_found`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000002\",\n  \"idempotencyKey\": \"credit-memo-cm-2026-0008\",\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n  \"route\": \"queued\",\n  \"status\": \"queued\",\n  \"amountCents\": \"30000\",\n  \"currency\": \"USD\",\n  \"description\": \"Returned 10 x Seed Treatment 2.5 gal\",\n  \"tranche\": {\n    \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n    \"reference\": \"348613002-A\"\n  },\n  \"invoiceRef\": \"CM-2026-0007\",\n  \"lineItems\": [\n    {\n      \"description\": \"Seed Treatment 2.5 gal x 10\",\n      \"amountCents\": \"30000\",\n      \"productUuid\": \"a1000000-0000-4000-8000-000000000001\"\n    }\n  ],\n  \"failure\": null,\n  \"createdAt\": \"2026-10-06T18:30:00.000Z\",\n  \"updatedAt\": \"2026-10-06T18:30:02.000Z\",\n  \"completedAt\": null\n}"
            },
            {
              "name": "400 — Missing return UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/productReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "productReturn"
                  ]
                },
                "description": "Returns the current durable state of a return by its stable `returnUuid`: `succeeded`, `in_progress`, `rejected`, or, for a queued return, `queued` / `processed` / `cancelled` as CFI works it. A processed return is reported as `processed`, not `succeeded`.\n\nLookup is tenant- and financing-book-scoped. An unknown uuid, another dealer's return and the uuid of a draw all return HTTP 404 with `data.reason: product_return_not_found`."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"returnUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"returnUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid return UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/productReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "productReturn"
                  ]
                },
                "description": "Returns the current durable state of a return by its stable `returnUuid`: `succeeded`, `in_progress`, `rejected`, or, for a queued return, `queued` / `processed` / `cancelled` as CFI works it. A processed return is reported as `processed`, not `succeeded`.\n\nLookup is tenant- and financing-book-scoped. An unknown uuid, another dealer's return and the uuid of a draw all return HTTP 404 with `data.reason: product_return_not_found`."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"returnUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"returnUuid\": \"90000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/productReturn",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "productReturn"
                  ]
                },
                "description": "Returns the current durable state of a return by its stable `returnUuid`: `succeeded`, `in_progress`, `rejected`, or, for a queued return, `queued` / `processed` / `cancelled` as CFI works it. A processed return is reported as `processed`, not `succeeded`.\n\nLookup is tenant- and financing-book-scoped. An unknown uuid, another dealer's return and the uuid of a draw all return HTTP 404 with `data.reason: product_return_not_found`."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"drawUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Attach the CRM's invoice document to a draw or a return",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/attachTransactionDocument",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "attachTransactionDocument"
              ]
            },
            "description": "Attaches a PDF, PNG or JPEG (at most 15 MB) to the draw or return `transactionUuid` (a `drawUuid` or `returnUuid`). Send it as `multipart/form-data` with the fields `transactionUuid` and `file`. Call it after the money call: money and documents fail separately, and the money call's replay contract does not include the file.\n\nThe document is stored like every invoice: CFI creates the request's invoice on the first attach (its total is the request's amount) and adds every later file to that same invoice. It is accepted while the request is in progress, queued or settled; if it is attached before the request settles, the settled transaction links to it. The response `key` is the file's stable name, the same `key` the `transactions` list reports.\n\nThe stored `key` is a short hash of the file name you sent, then the sanitized name (path separators and unsafe characters removed), so two different names never share a key. Uploading the same file name again replaces the stored file and still returns HTTP 200.\n\nA rejected request, and a queued return CFI cancelled, no longer accept documents: HTTP 409 with `data.reason: transaction_closed` and nothing is stored. An unknown `transactionUuid` and another dealer's `transactionUuid` both return HTTP 404 with `data.reason: transaction_not_found`. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nIf the upload fails after CFI has linked the invoice, the call returns HTTP 500; retry it, and the retry reuses the same invoice."
          },
          "response": [
            {
              "name": "400 — Missing file",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/attachTransactionDocument",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "attachTransactionDocument"
                  ]
                },
                "description": "Attaches a PDF, PNG or JPEG (at most 15 MB) to the draw or return `transactionUuid` (a `drawUuid` or `returnUuid`). Send it as `multipart/form-data` with the fields `transactionUuid` and `file`. Call it after the money call: money and documents fail separately, and the money call's replay contract does not include the file.\n\nThe document is stored like every invoice: CFI creates the request's invoice on the first attach (its total is the request's amount) and adds every later file to that same invoice. It is accepted while the request is in progress, queued or settled; if it is attached before the request settles, the settled transaction links to it. The response `key` is the file's stable name, the same `key` the `transactions` list reports.\n\nThe stored `key` is a short hash of the file name you sent, then the sanitized name (path separators and unsafe characters removed), so two different names never share a key. Uploading the same file name again replaces the stored file and still returns HTTP 200.\n\nA rejected request, and a queued return CFI cancelled, no longer accept documents: HTTP 409 with `data.reason: transaction_closed` and nothing is stored. An unknown `transactionUuid` and another dealer's `transactionUuid` both return HTTP 404 with `data.reason: transaction_not_found`. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nIf the upload fails after CFI has linked the invoice, the call returns HTTP 500; retry it, and the retry reuses the same invoice."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"file\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"file is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid transaction UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/attachTransactionDocument",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "attachTransactionDocument"
                  ]
                },
                "description": "Attaches a PDF, PNG or JPEG (at most 15 MB) to the draw or return `transactionUuid` (a `drawUuid` or `returnUuid`). Send it as `multipart/form-data` with the fields `transactionUuid` and `file`. Call it after the money call: money and documents fail separately, and the money call's replay contract does not include the file.\n\nThe document is stored like every invoice: CFI creates the request's invoice on the first attach (its total is the request's amount) and adds every later file to that same invoice. It is accepted while the request is in progress, queued or settled; if it is attached before the request settles, the settled transaction links to it. The response `key` is the file's stable name, the same `key` the `transactions` list reports.\n\nThe stored `key` is a short hash of the file name you sent, then the sanitized name (path separators and unsafe characters removed), so two different names never share a key. Uploading the same file name again replaces the stored file and still returns HTTP 200.\n\nA rejected request, and a queued return CFI cancelled, no longer accept documents: HTTP 409 with `data.reason: transaction_closed` and nothing is stored. An unknown `transactionUuid` and another dealer's `transactionUuid` both return HTTP 404 with `data.reason: transaction_not_found`. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nIf the upload fails after CFI has linked the invoice, the call returns HTTP 500; retry it, and the retry reuses the same invoice."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"transactionUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unsupported file type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/attachTransactionDocument",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "attachTransactionDocument"
                  ]
                },
                "description": "Attaches a PDF, PNG or JPEG (at most 15 MB) to the draw or return `transactionUuid` (a `drawUuid` or `returnUuid`). Send it as `multipart/form-data` with the fields `transactionUuid` and `file`. Call it after the money call: money and documents fail separately, and the money call's replay contract does not include the file.\n\nThe document is stored like every invoice: CFI creates the request's invoice on the first attach (its total is the request's amount) and adds every later file to that same invoice. It is accepted while the request is in progress, queued or settled; if it is attached before the request settles, the settled transaction links to it. The response `key` is the file's stable name, the same `key` the `transactions` list reports.\n\nThe stored `key` is a short hash of the file name you sent, then the sanitized name (path separators and unsafe characters removed), so two different names never share a key. Uploading the same file name again replaces the stored file and still returns HTTP 200.\n\nA rejected request, and a queued return CFI cancelled, no longer accept documents: HTTP 409 with `data.reason: transaction_closed` and nothing is stored. An unknown `transactionUuid` and another dealer's `transactionUuid` both return HTTP 404 with `data.reason: transaction_not_found`. The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nIf the upload fails after CFI has linked the invoice, the call returns HTTP 500; retry it, and the retry reuses the same invoice."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"file\"\n        ],\n        \"code\": \"invalid_value\",\n        \"message\": \"File must be a PDF, PNG or JPEG.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Check draw eligibility",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "drawEligibility"
              ]
            },
            "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
          },
          "response": [
            {
              "name": "200 — Draw is currently eligible",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawable\": true,\n  \"requestedAmountEligible\": true,\n  \"availableCreditCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"reason\": null,\n  \"tranches\": [\n    {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\",\n      \"description\": \"0% 12 Month Carbon Program\",\n      \"products\": [\n        {\n          \"productUuid\": \"a1000000-0000-4000-8000-000000000001\",\n          \"name\": \"Seed Treatment 2.5 gal\"\n        }\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "200 — Requested amount exceeds current availability",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawable\": true,\n  \"requestedAmountEligible\": false,\n  \"availableCreditCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"reason\": {\n    \"code\": \"insufficient_credit\",\n    \"message\": \"Available credit does not cover the requested amount.\"\n  },\n  \"tranches\": [\n    {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\",\n      \"description\": \"0% 12 Month Carbon Program\",\n      \"products\": [\n        {\n          \"productUuid\": \"a1000000-0000-4000-8000-000000000001\",\n          \"name\": \"Seed Treatment 2.5 gal\"\n        }\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "200 — Requested tranche is not the loan's locked tranche",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawable\": true,\n  \"requestedAmountEligible\": false,\n  \"availableCreditCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"reason\": {\n    \"code\": \"tranche_locked\",\n    \"message\": \"This loan is locked to a different tranche\"\n  },\n  \"tranches\": [\n    {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\",\n      \"description\": \"0% 12 Month Carbon Program\",\n      \"products\": [\n        {\n          \"productUuid\": \"a1000000-0000-4000-8000-000000000001\",\n          \"name\": \"Seed Treatment 2.5 gal\"\n        }\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "200 — Requested amount is below the manufacturer's tranche minimum",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"drawable\": true,\n  \"requestedAmountEligible\": false,\n  \"availableCreditCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"reason\": {\n    \"code\": \"below_tranche_minimum\",\n    \"message\": \"Total tranche amount ($200.00) is below Acme minimum requirement ($500.00). Need $300.00 more.\"\n  },\n  \"tranches\": [\n    {\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"reference\": \"348613002-A\",\n      \"description\": \"0% 12 Month Carbon Program\",\n      \"products\": [\n        {\n          \"productUuid\": \"a1000000-0000-4000-8000-000000000001\",\n          \"name\": \"Seed Treatment 2.5 gal\"\n        }\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "400 — Missing draw context",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"financingUuid is required.\"\n      },\n      {\n        \"path\": [\n          \"loanRef\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"loanRef is required.\"\n      },\n      {\n        \"path\": [\n          \"expectedMainApplicantPersonUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"expectedMainApplicantPersonUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"financingUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid loan UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"loanRef\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid main-applicant UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"expectedMainApplicantPersonUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"amountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"amountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid tranche UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"trancheId\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"expectedMainApplicantPersonUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"amountCents\": \"150000\",\n  \"trancheId\": \"70000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/drawEligibility",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "drawEligibility"
                  ]
                },
                "description": "Call this endpoint only after `financingLines` returns a non-null `loan`. Send that line's `financingUuid`, its `loan.loanUuid` as `loanRef`, and `financingLine.mainApplicant.personUuid` as `expectedMainApplicantPersonUuid`.\n\nUse `financingLine.mainApplicant.personUuid`; never use a `coApplicants` entry.\n\nAn unknown or inaccessible financing line returns HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`.\n\nCFI verifies the financing line, loan, and main applicant together before checking eligibility. A mismatch returns a structured conflict without contacting the draw provider; `applicant_context_mismatch` includes guidance for co-applicant or stale client mappings.\n\n`drawable` reports whether the loan passes the general draw gates. When `amountCents` is supplied, `requestedAmountEligible` separately reports whether that amount fits the current nonnegative provider-reported line-wide availability and optional selected tranche; it is `null` when no amount is supplied.\n\nFor a checkout decision, supply the intended `amountCents` decimal string and selected `trancheId`. Enable Draw only when `drawable` and `requestedAmountEligible` are both `true`.\n\n`availableCreditCents` is current loan-wide provider-reported draw headroom, clamped to zero. `tranches` lists the currently available draw targets; when the dealer's tranche is chosen automatically, only that one tranche is listed. CFI does not expose independent tranche balances because the provider does not supply them. When both `amountCents` and `trancheId` are supplied, eligibility also applies the manufacturer's tranche minimum: a draw that would leave the tranche below it reports `requestedAmountEligible: false` with `reason.code: below_tranche_minimum` and the human sentence in `reason.message`. A tranche other than the one the dealer's automatic selection locks the loan to reports `reason.code: tranche_locked`. A loan whose automatic tranche selection is blocked lists no tranches.\n\nThis check does not reserve funds. `createDraw` remains authoritative and revalidates eligibility when executing the draw, so it can still reject if conditions changed after this response."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"amount\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Get an accessible financing line",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "financingLine"
              ]
            },
            "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"rawStatus\": \"funded\",\n  \"requestedCents\": \"6000000\",\n  \"currency\": \"USD\",\n  \"mainApplicant\": {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n    }\n  ],\n  \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n  \"loan\": {\n    \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n    \"cropYear\": 2026,\n    \"creditLimitCents\": \"6000000\",\n    \"availableCreditCents\": \"5000000\",\n    \"overLimitCents\": \"0\",\n    \"totalDrawnCents\": \"1000000\",\n    \"outstandingPrincipalCents\": \"1000000\",\n    \"reservedCents\": \"0\",\n    \"estimatedPayoffCents\": \"1000000\",\n    \"currency\": \"USD\"\n  },\n  \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n  \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n  \"archivedAt\": null,\n  \"availableActions\": {\n    \"approve\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"decline\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"cancel\": {\n      \"allowed\": false,\n      \"reason\": \"not_cancellable\",\n      \"message\": \"This application can no longer be cancelled.\"\n    }\n  }\n}"
            },
            {
              "name": "200 — Example 2",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000002\",\n  \"status\": \"submitted\",\n  \"rawStatus\": \"submitted\",\n  \"requestedCents\": \"4000000\",\n  \"currency\": \"USD\",\n  \"mainApplicant\": {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000003\"\n  },\n  \"coApplicants\": [],\n  \"organizationUuid\": null,\n  \"loan\": null,\n  \"createdAt\": \"2026-06-20T15:00:00.000Z\",\n  \"updatedAt\": \"2026-06-20T15:00:00.000Z\",\n  \"archivedAt\": null,\n  \"availableActions\": {\n    \"approve\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"decline\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"cancel\": {\n      \"allowed\": true,\n      \"requires\": []\n    }\n  }\n}"
            },
            {
              "name": "200 — Example 3",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000003\",\n  \"status\": \"declined\",\n  \"rawStatus\": \"cancelled\",\n  \"requestedCents\": \"4000000\",\n  \"currency\": \"USD\",\n  \"mainApplicant\": {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000004\"\n  },\n  \"coApplicants\": [],\n  \"organizationUuid\": null,\n  \"loan\": null,\n  \"createdAt\": \"2026-05-12T14:00:00.000Z\",\n  \"updatedAt\": \"2026-06-25T16:30:00.000Z\",\n  \"archivedAt\": null,\n  \"availableActions\": {\n    \"approve\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"decline\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"cancel\": {\n      \"allowed\": false,\n      \"reason\": \"not_cancellable\",\n      \"message\": \"This application can no longer be cancelled.\"\n    }\n  }\n}"
            },
            {
              "name": "200 — Example 4",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000004\",\n  \"status\": \"approved\",\n  \"rawStatus\": \"funder_offer_accepted\",\n  \"requestedCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"mainApplicant\": {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000005\"\n  },\n  \"coApplicants\": [],\n  \"organizationUuid\": null,\n  \"loan\": null,\n  \"createdAt\": \"2026-06-01T13:00:00.000Z\",\n  \"updatedAt\": \"2026-06-28T17:15:00.000Z\",\n  \"archivedAt\": null,\n  \"availableActions\": {\n    \"approve\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"decline\": {\n      \"allowed\": false,\n      \"reason\": \"not_awaiting_approval\",\n      \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n    },\n    \"cancel\": {\n      \"allowed\": true,\n      \"requires\": []\n    }\n  }\n}"
            },
            {
              "name": "200 — Example 5",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n  \"status\": \"awaiting_approval\",\n  \"rawStatus\": \"funder_offer\",\n  \"requestedCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"mainApplicant\": {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000006\"\n  },\n  \"coApplicants\": [],\n  \"organizationUuid\": null,\n  \"loan\": null,\n  \"createdAt\": \"2026-06-29T13:00:00.000Z\",\n  \"updatedAt\": \"2026-07-01T17:15:00.000Z\",\n  \"archivedAt\": null,\n  \"availableActions\": {\n    \"approve\": {\n      \"allowed\": true,\n      \"requires\": [\n        \"customerProgramStatus\"\n      ]\n    },\n    \"decline\": {\n      \"allowed\": true,\n      \"requires\": []\n    },\n    \"cancel\": {\n      \"allowed\": true,\n      \"requires\": []\n    }\n  }\n}"
            },
            {
              "name": "200 — Example 6",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000007\",\n  \"status\": \"awaiting_approval\",\n  \"rawStatus\": \"funder_offer\",\n  \"requestedCents\": \"5000000\",\n  \"currency\": \"USD\",\n  \"mainApplicant\": {\n    \"personUuid\": \"30000000-0000-4000-8000-000000000007\"\n  },\n  \"coApplicants\": [],\n  \"organizationUuid\": null,\n  \"loan\": null,\n  \"createdAt\": \"2026-06-29T13:00:00.000Z\",\n  \"updatedAt\": \"2026-07-01T17:15:00.000Z\",\n  \"archivedAt\": null,\n  \"availableActions\": {\n    \"approve\": {\n      \"allowed\": false,\n      \"reason\": \"high_credit_risk\",\n      \"message\": \"This application is flagged as High Credit Risk — decline only.\"\n    },\n    \"decline\": {\n      \"allowed\": true,\n      \"requires\": []\n    },\n    \"cancel\": {\n      \"allowed\": true,\n      \"requires\": []\n    }\n  }\n}"
            },
            {
              "name": "400 — Missing financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"financingUuid is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid financing UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financingUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"financingUuid\": \"50000000-0000-4000-8000-000000000001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLine",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLine"
                  ]
                },
                "description": "Returns the complete financing-line aggregate for the stable `financingUuid`, including the explicit main applicant, ordered co-applicants, organization, loan amounts, and lifecycle fields.\n\nLookup is tenant-scoped. A nonexistent line and a line outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: financing_line_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"dealUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "List accessible financing lines",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "financingLines"
              ]
            },
            "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"items\": [\n    {\n      \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n      \"status\": \"funded\",\n      \"rawStatus\": \"funded\",\n      \"requestedCents\": \"6000000\",\n      \"currency\": \"USD\",\n      \"mainApplicant\": {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n      },\n      \"coApplicants\": [\n        {\n          \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n        }\n      ],\n      \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n      \"loan\": {\n        \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n        \"cropYear\": 2026,\n        \"creditLimitCents\": \"6000000\",\n        \"availableCreditCents\": \"5000000\",\n        \"overLimitCents\": \"0\",\n        \"totalDrawnCents\": \"1000000\",\n        \"outstandingPrincipalCents\": \"1000000\",\n        \"reservedCents\": \"0\",\n        \"estimatedPayoffCents\": \"1000000\",\n        \"currency\": \"USD\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"availableActions\": {\n        \"approve\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"decline\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"cancel\": {\n          \"allowed\": false,\n          \"reason\": \"not_cancellable\",\n          \"message\": \"This application can no longer be cancelled.\"\n        }\n      }\n    },\n    {\n      \"financingUuid\": \"50000000-0000-4000-8000-000000000002\",\n      \"status\": \"submitted\",\n      \"rawStatus\": \"submitted\",\n      \"requestedCents\": \"4000000\",\n      \"currency\": \"USD\",\n      \"mainApplicant\": {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000003\"\n      },\n      \"coApplicants\": [],\n      \"organizationUuid\": null,\n      \"loan\": null,\n      \"createdAt\": \"2026-06-20T15:00:00.000Z\",\n      \"updatedAt\": \"2026-06-20T15:00:00.000Z\",\n      \"archivedAt\": null,\n      \"availableActions\": {\n        \"approve\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"decline\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"cancel\": {\n          \"allowed\": true,\n          \"requires\": []\n        }\n      }\n    },\n    {\n      \"financingUuid\": \"50000000-0000-4000-8000-000000000003\",\n      \"status\": \"declined\",\n      \"rawStatus\": \"cancelled\",\n      \"requestedCents\": \"4000000\",\n      \"currency\": \"USD\",\n      \"mainApplicant\": {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000004\"\n      },\n      \"coApplicants\": [],\n      \"organizationUuid\": null,\n      \"loan\": null,\n      \"createdAt\": \"2026-05-12T14:00:00.000Z\",\n      \"updatedAt\": \"2026-06-25T16:30:00.000Z\",\n      \"archivedAt\": null,\n      \"availableActions\": {\n        \"approve\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"decline\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"cancel\": {\n          \"allowed\": false,\n          \"reason\": \"not_cancellable\",\n          \"message\": \"This application can no longer be cancelled.\"\n        }\n      }\n    },\n    {\n      \"financingUuid\": \"50000000-0000-4000-8000-000000000004\",\n      \"status\": \"approved\",\n      \"rawStatus\": \"funder_offer_accepted\",\n      \"requestedCents\": \"5000000\",\n      \"currency\": \"USD\",\n      \"mainApplicant\": {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000005\"\n      },\n      \"coApplicants\": [],\n      \"organizationUuid\": null,\n      \"loan\": null,\n      \"createdAt\": \"2026-06-01T13:00:00.000Z\",\n      \"updatedAt\": \"2026-06-28T17:15:00.000Z\",\n      \"archivedAt\": null,\n      \"availableActions\": {\n        \"approve\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"decline\": {\n          \"allowed\": false,\n          \"reason\": \"not_awaiting_approval\",\n          \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n        },\n        \"cancel\": {\n          \"allowed\": true,\n          \"requires\": []\n        }\n      }\n    },\n    {\n      \"financingUuid\": \"50000000-0000-4000-8000-000000000006\",\n      \"status\": \"awaiting_approval\",\n      \"rawStatus\": \"funder_offer\",\n      \"requestedCents\": \"5000000\",\n      \"currency\": \"USD\",\n      \"mainApplicant\": {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000006\"\n      },\n      \"coApplicants\": [],\n      \"organizationUuid\": null,\n      \"loan\": null,\n      \"createdAt\": \"2026-06-29T13:00:00.000Z\",\n      \"updatedAt\": \"2026-07-01T17:15:00.000Z\",\n      \"archivedAt\": null,\n      \"availableActions\": {\n        \"approve\": {\n          \"allowed\": true,\n          \"requires\": [\n            \"customerProgramStatus\"\n          ]\n        },\n        \"decline\": {\n          \"allowed\": true,\n          \"requires\": []\n        },\n        \"cancel\": {\n          \"allowed\": true,\n          \"requires\": []\n        }\n      }\n    },\n    {\n      \"financingUuid\": \"50000000-0000-4000-8000-000000000007\",\n      \"status\": \"awaiting_approval\",\n      \"rawStatus\": \"funder_offer\",\n      \"requestedCents\": \"5000000\",\n      \"currency\": \"USD\",\n      \"mainApplicant\": {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000007\"\n      },\n      \"coApplicants\": [],\n      \"organizationUuid\": null,\n      \"loan\": null,\n      \"createdAt\": \"2026-06-29T13:00:00.000Z\",\n      \"updatedAt\": \"2026-07-01T17:15:00.000Z\",\n      \"archivedAt\": null,\n      \"availableActions\": {\n        \"approve\": {\n          \"allowed\": false,\n          \"reason\": \"high_credit_risk\",\n          \"message\": \"This application is flagged as High Credit Risk — decline only.\"\n        },\n        \"decline\": {\n          \"allowed\": true,\n          \"requires\": []\n        },\n        \"cancel\": {\n          \"allowed\": true,\n          \"requires\": []\n        }\n      }\n    }\n  ],\n  \"nextCursor\": \"eyJ2ZXJzaW9uIjoxLCJyZXNvdXJjZSI6ImZpbmFuY2luZ19saW5lcyJ9\"\n}"
            },
            {
              "name": "400 — Invalid person UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"personUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid organization UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"organizationUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid status",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"status\"\n        ],\n        \"code\": \"invalid_value\",\n        \"message\": \"Must be a supported financing-line status.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid limit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"limit\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"Limit must be between 1 and 100.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid cursor type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"cursor\"\n        ],\n        \"code\": \"invalid_type\",\n        \"message\": \"Invalid value type.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n  \"status\": \"funded\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/financingLines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "financingLines"
                  ]
                },
                "description": "Returns complete accessible financing-line aggregates. `financingUuid` is the stable upsert key across the application and funded-loan lifecycle.\n\nEach line exposes one explicit `mainApplicant` and an ordered `coApplicants` array. The optional `personUuid` filter matches either field.\n\nSubmitted history remains queryable after later funded, declined, or cancelled statuses. `status` is the coarse seven-state workflow category (the six v1 values plus `awaiting_approval`), while `rawStatus` is the exact CFI lifecycle status. A cancelled line is returned as `status: \"declined\"` with `rawStatus: \"cancelled\"`.\n\nFiltering by `status: \"declined\"` includes lines whose `rawStatus` is `cancelled`.\n\n`status: \"awaiting_approval\"` means the funder has made an offer and it is the dealer's turn to approve or decline (`rawStatus: \"funder_offer\"`). `status: \"approved\"` means the dealer has acted on the offer or it reached a later offer stage; it does not mean the line can be drawn. `loan` is null until CFI creates the funded loan record and may remain populated if the line later changes status.\n\nMoney is always an exact base-10 integer string of USD cents. `requestedCents` is the original application request. `creditLimitCents` is the current recorded commitment. `availableCreditCents` is max(provider-reported Loan.balance, 0), and `overLimitCents` is max(-Loan.balance, 0). `totalDrawnCents` and `outstandingPrincipalCents` are nullable provider-authoritative values; reserves and payoff estimates are informational. None of these values is tranche-specific.\n\nIn-progress and rejected draws do not change the local public amounts. A succeeded draw creates a durable local ACH transaction, while provider-authoritative available credit may remain unchanged until synchronization finishes. The API does not derive available credit from outstanding principal.\n\nDo not enable Draw from financing-line status or loan presence alone. When `loan` is null, Draw is unavailable. When it is populated, call `drawEligibility` with `loan.loanUuid`, the intended amount, and any selected tranche; enable Draw only when both eligibility booleans are true. `createDraw` performs the final authoritative validation.\n\nEach line carries `availableActions` for the authenticated user (`approve`, `decline`, `cancel`). Render buttons from `allowed`; a blocked action carries a `reason` code and `message` for a disabled button, and an allowed one may list `requires` (inputs to send with it). These are computed by the same rules the decision endpoint enforces, so do not re-derive them from `status`.\n\nPages use deterministic `createdAt, financingUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA line absent from a later scan is not proof of deletion, archival, or lost access; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"applicantUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Get the authenticated dealer",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "me"
              ]
            },
            "description": "Returns the stable dealer identity and runtime environment for the authenticated integration."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "me"
                  ]
                },
                "description": "Returns the stable dealer identity and runtime environment for the authenticated integration."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"dealerUuid\": \"20000000-0000-4000-8000-000000000001\",\n  \"dealerName\": \"Prairie Supply Cooperative\",\n  \"environment\": \"production\"\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "me"
                  ]
                },
                "description": "Returns the stable dealer identity and runtime environment for the authenticated integration."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"unexpected\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "List accessible financing organizations — Example 1",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"ein\": \"123456789\",\n  \"limit\": 50\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/organizations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "organizations"
              ]
            },
            "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"123456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"items\": [\n    {\n      \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n      \"name\": \"Harvest Ridge Farms LLC\",\n      \"ein\": \"123456789\",\n      \"type\": \"LimitedLiabilityCompany\",\n      \"website\": \"https://harvestridge.example.com\",\n      \"address\": {\n        \"street\": \"450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": \"2026-07-01T12:00:00.000Z\",\n      \"isReferenceable\": false\n    }\n  ],\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 — Invalid EIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"123456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"ein\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"EIN must contain exactly nine digits.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid limit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"123456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"limit\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"Limit must be between 1 and 100.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid cursor type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"123456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"cursor\"\n        ],\n        \"code\": \"invalid_type\",\n        \"message\": \"Invalid value type.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"123456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "List accessible financing organizations — Example 2",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"ein\": \"12-3456789\",\n  \"limit\": 50\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/organizations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "organizations"
              ]
            },
            "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12-3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"items\": [\n    {\n      \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n      \"name\": \"Harvest Ridge Farms LLC\",\n      \"ein\": \"123456789\",\n      \"type\": \"LimitedLiabilityCompany\",\n      \"website\": \"https://harvestridge.example.com\",\n      \"address\": {\n        \"street\": \"450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": \"2026-07-01T12:00:00.000Z\",\n      \"isReferenceable\": false\n    }\n  ],\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 — Invalid EIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12-3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"ein\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"EIN must contain exactly nine digits.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid limit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12-3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"limit\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"Limit must be between 1 and 100.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid cursor type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12-3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"cursor\"\n        ],\n        \"code\": \"invalid_type\",\n        \"message\": \"Invalid value type.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12-3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "List accessible financing organizations — Example 3",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"ein\": \"12 3456789\",\n  \"limit\": 50\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/organizations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "organizations"
              ]
            },
            "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12 3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"items\": [\n    {\n      \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n      \"name\": \"Harvest Ridge Farms LLC\",\n      \"ein\": \"123456789\",\n      \"type\": \"LimitedLiabilityCompany\",\n      \"website\": \"https://harvestridge.example.com\",\n      \"address\": {\n        \"street\": \"450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": \"2026-07-01T12:00:00.000Z\",\n      \"isReferenceable\": false\n    }\n  ],\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 — Invalid EIN",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12 3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"ein\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"EIN must contain exactly nine digits.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid limit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12 3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"limit\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"Limit must be between 1 and 100.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid cursor type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12 3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"cursor\"\n        ],\n        \"code\": \"invalid_type\",\n        \"message\": \"Invalid value type.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ein\": \"12 3456789\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/organizations",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "organizations"
                  ]
                },
                "description": "Returns allowlisted organization fields for organizations attached to accessible submitted financing lines.\n\nOrdinary requests exclude archived organizations. Set `includeArchived: true` to include accessible historical organizations. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nThe optional `ein` filter accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to exactly nine digits before lookup and responses return the canonical form `123456789`.\n\nPages use deterministic `createdAt, organizationUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nAn organization absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "List accessible financing applicants",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"applicant@example.com\",\n  \"limit\": 50\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/people",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "people"
              ]
            },
            "description": "Returns allowlisted identity and contact fields for both main applicants and co-applicants on accessible submitted financing lines.\n\nOrdinary requests exclude archived people. Set `includeArchived: true` to include accessible historical people. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nPages use deterministic `createdAt, personUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA person absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale.\n\nKYC, birth date, government ID, credit, and financial fields are never returned."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"applicant@example.com\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/people",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "people"
                  ]
                },
                "description": "Returns allowlisted identity and contact fields for both main applicants and co-applicants on accessible submitted financing lines.\n\nOrdinary requests exclude archived people. Set `includeArchived: true` to include accessible historical people. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nPages use deterministic `createdAt, personUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA person absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale.\n\nKYC, birth date, government ID, credit, and financial fields are never returned."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"items\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n      \"firstName\": \"Alex\",\n      \"lastName\": \"Miller\",\n      \"email\": \"applicant@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": \"2026-07-01T12:00:00.000Z\",\n      \"isReferenceable\": false\n    }\n  ],\n  \"nextCursor\": \"eyJ2ZXJzaW9uIjoxLCJyZXNvdXJjZSI6InBlb3BsZSJ9\"\n}"
            },
            {
              "name": "400 — Invalid email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"applicant@example.com\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/people",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "people"
                  ]
                },
                "description": "Returns allowlisted identity and contact fields for both main applicants and co-applicants on accessible submitted financing lines.\n\nOrdinary requests exclude archived people. Set `includeArchived: true` to include accessible historical people. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nPages use deterministic `createdAt, personUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA person absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale.\n\nKYC, birth date, government ID, credit, and financial fields are never returned."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid limit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"applicant@example.com\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/people",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "people"
                  ]
                },
                "description": "Returns allowlisted identity and contact fields for both main applicants and co-applicants on accessible submitted financing lines.\n\nOrdinary requests exclude archived people. Set `includeArchived: true` to include accessible historical people. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nPages use deterministic `createdAt, personUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA person absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale.\n\nKYC, birth date, government ID, credit, and financial fields are never returned."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"limit\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"Limit must be between 1 and 100.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid cursor type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"applicant@example.com\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/people",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "people"
                  ]
                },
                "description": "Returns allowlisted identity and contact fields for both main applicants and co-applicants on accessible submitted financing lines.\n\nOrdinary requests exclude archived people. Set `includeArchived: true` to include accessible historical people. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nPages use deterministic `createdAt, personUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA person absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale.\n\nKYC, birth date, government ID, credit, and financial fields are never returned."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"cursor\"\n        ],\n        \"code\": \"invalid_type\",\n        \"message\": \"Invalid value type.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"applicant@example.com\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/people",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "people"
                  ]
                },
                "description": "Returns allowlisted identity and contact fields for both main applicants and co-applicants on accessible submitted financing lines.\n\nOrdinary requests exclude archived people. Set `includeArchived: true` to include accessible historical people. `archivedAt` is the persisted archive timestamp and `isReferenceable` is false for archived records.\n\nPages use deterministic `createdAt, personUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot.\n\nA person absent from a later scan is not a deletion signal; retain the local record and optionally mark it stale.\n\nKYC, birth date, government ID, credit, and financial fields are never returned."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"personId\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a financing application — Existing person, no organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "submitApplication"
              ]
            },
            "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"status\": \"funded\",\n    \"rawStatus\": \"funded\",\n    \"requestedCents\": \"6000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    \"coApplicants\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"loan\": {\n      \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n      \"cropYear\": 2026,\n      \"creditLimitCents\": \"6000000\",\n      \"availableCreditCents\": \"5000000\",\n      \"overLimitCents\": \"0\",\n      \"totalDrawnCents\": \"1000000\",\n      \"outstandingPrincipalCents\": \"1000000\",\n      \"reservedCents\": \"0\",\n      \"estimatedPayoffCents\": \"1000000\",\n      \"currency\": \"USD\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": false,\n        \"reason\": \"not_cancellable\",\n        \"message\": \"This application can no longer be cancelled.\"\n      }\n    }\n  },\n  \"people\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n      \"firstName\": \"Alex\",\n      \"lastName\": \"Miller\",\n      \"email\": \"applicant@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    },\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000002\",\n      \"firstName\": \"Morgan\",\n      \"lastName\": \"Taylor\",\n      \"email\": \"morgan.taylor@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    }\n  ],\n  \"organization\": {\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Harvest Ridge Farms LLC\",\n    \"ein\": \"123456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"website\": \"https://harvestridge.example.com\",\n    \"address\": {\n      \"street\": \"450 Prairie View Road\",\n      \"city\": \"Ames\",\n      \"state\": \"IA\",\n      \"zip\": \"50010\",\n      \"country\": \"US\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"isReferenceable\": true\n  }\n}"
            },
            {
              "name": "400 — Missing main applicant",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"mainApplicant\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"mainApplicant is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid co-applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing EIN and obsolete organization field",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"organization\",\n          \"ein\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"EIN is required.\"\n      },\n      {\n        \"path\": [\n          \"organization\",\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid finance amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financeAmountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"financeAmountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"persons\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Multiple request problems",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"submissionUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      },\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      },\n      {\n        \"path\": [\n          \"legacyField\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Application entities are incomplete",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000001\",\n  \"organization\": null,\n  \"financeAmountCents\": \"2000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks an existing person without updating that person's stored record; organization is explicitly null."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Bad Request\",\n  \"data\": {\n    \"reason\": \"incomplete_application\",\n    \"retriable\": false,\n    \"entities\": [\n      {\n        \"kind\": \"person\",\n        \"ref\": \"30000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"birth_date: Invalid date\"\n        ]\n      },\n      {\n        \"kind\": \"organization\",\n        \"ref\": \"40000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"name: Organization name is required\"\n        ]\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a financing application — Existing person and organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "submitApplication"
              ]
            },
            "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"status\": \"funded\",\n    \"rawStatus\": \"funded\",\n    \"requestedCents\": \"6000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    \"coApplicants\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"loan\": {\n      \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n      \"cropYear\": 2026,\n      \"creditLimitCents\": \"6000000\",\n      \"availableCreditCents\": \"5000000\",\n      \"overLimitCents\": \"0\",\n      \"totalDrawnCents\": \"1000000\",\n      \"outstandingPrincipalCents\": \"1000000\",\n      \"reservedCents\": \"0\",\n      \"estimatedPayoffCents\": \"1000000\",\n      \"currency\": \"USD\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": false,\n        \"reason\": \"not_cancellable\",\n        \"message\": \"This application can no longer be cancelled.\"\n      }\n    }\n  },\n  \"people\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n      \"firstName\": \"Alex\",\n      \"lastName\": \"Miller\",\n      \"email\": \"applicant@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    },\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000002\",\n      \"firstName\": \"Morgan\",\n      \"lastName\": \"Taylor\",\n      \"email\": \"morgan.taylor@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    }\n  ],\n  \"organization\": {\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Harvest Ridge Farms LLC\",\n    \"ein\": \"123456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"website\": \"https://harvestridge.example.com\",\n    \"address\": {\n      \"street\": \"450 Prairie View Road\",\n      \"city\": \"Ames\",\n      \"state\": \"IA\",\n      \"zip\": \"50010\",\n      \"country\": \"US\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"isReferenceable\": true\n  }\n}"
            },
            {
              "name": "400 — Missing main applicant",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"mainApplicant\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"mainApplicant is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid co-applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing EIN and obsolete organization field",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"organization\",\n          \"ein\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"EIN is required.\"\n      },\n      {\n        \"path\": [\n          \"organization\",\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid finance amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financeAmountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"financeAmountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"persons\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Multiple request problems",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"submissionUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      },\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      },\n      {\n        \"path\": [\n          \"legacyField\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Application entities are incomplete",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000002\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nLinks both existing records without updating either stored record."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Bad Request\",\n  \"data\": {\n    \"reason\": \"incomplete_application\",\n    \"retriable\": false,\n    \"entities\": [\n      {\n        \"kind\": \"person\",\n        \"ref\": \"30000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"birth_date: Invalid date\"\n        ]\n      },\n      {\n        \"kind\": \"organization\",\n        \"ref\": \"40000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"name: Organization name is required\"\n        ]\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a financing application — New person, no organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "submitApplication"
              ]
            },
            "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"status\": \"funded\",\n    \"rawStatus\": \"funded\",\n    \"requestedCents\": \"6000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    \"coApplicants\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"loan\": {\n      \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n      \"cropYear\": 2026,\n      \"creditLimitCents\": \"6000000\",\n      \"availableCreditCents\": \"5000000\",\n      \"overLimitCents\": \"0\",\n      \"totalDrawnCents\": \"1000000\",\n      \"outstandingPrincipalCents\": \"1000000\",\n      \"reservedCents\": \"0\",\n      \"estimatedPayoffCents\": \"1000000\",\n      \"currency\": \"USD\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": false,\n        \"reason\": \"not_cancellable\",\n        \"message\": \"This application can no longer be cancelled.\"\n      }\n    }\n  },\n  \"people\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n      \"firstName\": \"Alex\",\n      \"lastName\": \"Miller\",\n      \"email\": \"applicant@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    },\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000002\",\n      \"firstName\": \"Morgan\",\n      \"lastName\": \"Taylor\",\n      \"email\": \"morgan.taylor@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    }\n  ],\n  \"organization\": {\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Harvest Ridge Farms LLC\",\n    \"ein\": \"123456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"website\": \"https://harvestridge.example.com\",\n    \"address\": {\n      \"street\": \"450 Prairie View Road\",\n      \"city\": \"Ames\",\n      \"state\": \"IA\",\n      \"zip\": \"50010\",\n      \"country\": \"US\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"isReferenceable\": true\n  }\n}"
            },
            {
              "name": "400 — Missing main applicant",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"mainApplicant\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"mainApplicant is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid co-applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing EIN and obsolete organization field",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"organization\",\n          \"ein\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"EIN is required.\"\n      },\n      {\n        \"path\": [\n          \"organization\",\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid finance amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financeAmountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"financeAmountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"persons\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Multiple request problems",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"submissionUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      },\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      },\n      {\n        \"path\": [\n          \"legacyField\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Application entities are incomplete",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000003\",\n  \"organization\": null,\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates a full person record whose financial fields are whole USD dollars and whose year_began_farming value is years of experience."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Bad Request\",\n  \"data\": {\n    \"reason\": \"incomplete_application\",\n    \"retriable\": false,\n    \"entities\": [\n      {\n        \"kind\": \"person\",\n        \"ref\": \"30000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"birth_date: Invalid date\"\n        ]\n      },\n      {\n        \"kind\": \"organization\",\n        \"ref\": \"40000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"name: Organization name is required\"\n        ]\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a financing application — New person and organization",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "submitApplication"
              ]
            },
            "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"status\": \"funded\",\n    \"rawStatus\": \"funded\",\n    \"requestedCents\": \"6000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    \"coApplicants\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"loan\": {\n      \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n      \"cropYear\": 2026,\n      \"creditLimitCents\": \"6000000\",\n      \"availableCreditCents\": \"5000000\",\n      \"overLimitCents\": \"0\",\n      \"totalDrawnCents\": \"1000000\",\n      \"outstandingPrincipalCents\": \"1000000\",\n      \"reservedCents\": \"0\",\n      \"estimatedPayoffCents\": \"1000000\",\n      \"currency\": \"USD\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": false,\n        \"reason\": \"not_cancellable\",\n        \"message\": \"This application can no longer be cancelled.\"\n      }\n    }\n  },\n  \"people\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n      \"firstName\": \"Alex\",\n      \"lastName\": \"Miller\",\n      \"email\": \"applicant@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    },\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000002\",\n      \"firstName\": \"Morgan\",\n      \"lastName\": \"Taylor\",\n      \"email\": \"morgan.taylor@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    }\n  ],\n  \"organization\": {\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Harvest Ridge Farms LLC\",\n    \"ein\": \"123456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"website\": \"https://harvestridge.example.com\",\n    \"address\": {\n      \"street\": \"450 Prairie View Road\",\n      \"city\": \"Ames\",\n      \"state\": \"IA\",\n      \"zip\": \"50010\",\n      \"country\": \"US\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"isReferenceable\": true\n  }\n}"
            },
            {
              "name": "400 — Missing main applicant",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"mainApplicant\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"mainApplicant is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid co-applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing EIN and obsolete organization field",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"organization\",\n          \"ein\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"EIN is required.\"\n      },\n      {\n        \"path\": [\n          \"organization\",\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid finance amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financeAmountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"financeAmountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"persons\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Multiple request problems",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"submissionUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      },\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      },\n      {\n        \"path\": [\n          \"legacyField\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Application entities are incomplete",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000004\",\n  \"organization\": {\n    \"name\": \"Record Farms LLC\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"incorporatedLocation\": \"NY\",\n    \"address\": [\n      {\n        \"street\": \"1 Farm Rd\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"type\": \"main\"\n      }\n    ],\n    \"kind\": \"record\",\n    \"ein\": \"12-3456789\",\n    \"incorporatedDate\": \"2000-01-01\",\n    \"totalAssetsCents\": \"150000000\",\n    \"totalLiabilitiesCents\": \"40000000\",\n    \"grossFarmIncomeCents\": \"90000000\",\n    \"nonFarmIncomeCents\": \"2500000\"\n  },\n  \"financeAmountCents\": \"6000000\",\n  \"mainApplicant\": {\n    \"first_name\": \"Ray\",\n    \"last_name\": \"Record\",\n    \"email\": \"ray.record@example.com\",\n    \"phone\": \"+18015551234\",\n    \"address\": [\n      {\n        \"street\": \"123 Main St\",\n        \"city\": \"New York\",\n        \"state\": \"NY\",\n        \"zip\": \"10001\",\n        \"type\": \"main\"\n      }\n    ],\n    \"communication_preference\": \"Email\",\n    \"marital_status\": \"Single\",\n    \"title\": \"Member\",\n    \"year_began_farming\": 10,\n    \"share_percentage\": 100,\n    \"kind\": \"record\",\n    \"birth_date\": \"1988-07-15\",\n    \"govID\": \"900-70-0000\",\n    \"totalAssetsCents\": \"45000000\",\n    \"totalLiabilitiesCents\": \"12500000\",\n    \"grossFarmIncomeCents\": \"35000000\",\n    \"nonFarmIncomeCents\": \"7500000\"\n  },\n  \"coApplicants\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\nCreates full person and organization records, including a formatted EIN and supported organization type."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Bad Request\",\n  \"data\": {\n    \"reason\": \"incomplete_application\",\n    \"retriable\": false,\n    \"entities\": [\n      {\n        \"kind\": \"person\",\n        \"ref\": \"30000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"birth_date: Invalid date\"\n        ]\n      },\n      {\n        \"kind\": \"organization\",\n        \"ref\": \"40000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"name: Organization name is required\"\n        ]\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a financing application — Main applicant with a co-applicant",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "submitApplication"
              ]
            },
            "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"replayed\": false,\n  \"financingLine\": {\n    \"financingUuid\": \"50000000-0000-4000-8000-000000000001\",\n    \"status\": \"funded\",\n    \"rawStatus\": \"funded\",\n    \"requestedCents\": \"6000000\",\n    \"currency\": \"USD\",\n    \"mainApplicant\": {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n    },\n    \"coApplicants\": [\n      {\n        \"personUuid\": \"30000000-0000-4000-8000-000000000002\"\n      }\n    ],\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"loan\": {\n      \"loanUuid\": \"60000000-0000-4000-8000-000000000001\",\n      \"cropYear\": 2026,\n      \"creditLimitCents\": \"6000000\",\n      \"availableCreditCents\": \"5000000\",\n      \"overLimitCents\": \"0\",\n      \"totalDrawnCents\": \"1000000\",\n      \"outstandingPrincipalCents\": \"1000000\",\n      \"reservedCents\": \"0\",\n      \"estimatedPayoffCents\": \"1000000\",\n      \"currency\": \"USD\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-06-15T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"availableActions\": {\n      \"approve\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"decline\": {\n        \"allowed\": false,\n        \"reason\": \"not_awaiting_approval\",\n        \"message\": \"This application is no longer awaiting approval — it may have just been actioned. Refresh to see its current status.\"\n      },\n      \"cancel\": {\n        \"allowed\": false,\n        \"reason\": \"not_cancellable\",\n        \"message\": \"This application can no longer be cancelled.\"\n      }\n    }\n  },\n  \"people\": [\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000001\",\n      \"firstName\": \"Alex\",\n      \"lastName\": \"Miller\",\n      \"email\": \"applicant@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    },\n    {\n      \"personUuid\": \"30000000-0000-4000-8000-000000000002\",\n      \"firstName\": \"Morgan\",\n      \"lastName\": \"Taylor\",\n      \"email\": \"morgan.taylor@example.com\",\n      \"phone\": \"+15155550142\",\n      \"address\": {\n        \"street\": \"1450 Prairie View Road\",\n        \"city\": \"Ames\",\n        \"state\": \"IA\",\n        \"zip\": \"50010\",\n        \"country\": \"US\"\n      },\n      \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n      \"archivedAt\": null,\n      \"isReferenceable\": true\n    }\n  ],\n  \"organization\": {\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\",\n    \"name\": \"Harvest Ridge Farms LLC\",\n    \"ein\": \"123456789\",\n    \"type\": \"LimitedLiabilityCompany\",\n    \"website\": \"https://harvestridge.example.com\",\n    \"address\": {\n      \"street\": \"450 Prairie View Road\",\n      \"city\": \"Ames\",\n      \"state\": \"IA\",\n      \"zip\": \"50010\",\n      \"country\": \"US\"\n    },\n    \"createdAt\": \"2026-01-10T15:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T18:30:00.000Z\",\n    \"archivedAt\": null,\n    \"isReferenceable\": true\n  }\n}"
            },
            {
              "name": "400 — Missing main applicant",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"mainApplicant\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"mainApplicant is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid co-applicant email",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Missing EIN and obsolete organization field",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"organization\",\n          \"ein\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"EIN is required.\"\n      },\n      {\n        \"path\": [\n          \"organization\",\n          \"registrationNumber\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid finance amount",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"financeAmountCents\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"financeAmountCents must be greater than zero.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"persons\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Multiple request problems",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"submissionUuid\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      },\n      {\n        \"path\": [\n          \"coApplicants\",\n          0,\n          \"email\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid email address.\"\n      },\n      {\n        \"path\": [\n          \"legacyField\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Application entities are incomplete",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"submissionUuid\": \"10000000-0000-4000-8000-000000000005\",\n  \"organization\": {\n    \"kind\": \"reference\",\n    \"organizationUuid\": \"40000000-0000-4000-8000-000000000001\"\n  },\n  \"financeAmountCents\": \"12000000\",\n  \"mainApplicant\": {\n    \"kind\": \"reference\",\n    \"personUuid\": \"30000000-0000-4000-8000-000000000001\"\n  },\n  \"coApplicants\": [\n    {\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Miller\",\n      \"email\": \"morgan.miller@example.com\",\n      \"phone\": \"+15155550188\",\n      \"address\": [\n        {\n          \"street\": \"1450 Prairie View Road\",\n          \"city\": \"Ames\",\n          \"state\": \"IA\",\n          \"zip\": \"50010\",\n          \"type\": \"main\"\n        }\n      ],\n      \"communication_preference\": \"Email\",\n      \"marital_status\": \"Single\",\n      \"title\": \"Member\",\n      \"year_began_farming\": 10,\n      \"share_percentage\": 40,\n      \"kind\": \"record\",\n      \"birth_date\": \"1988-07-15\",\n      \"govID\": \"900-70-0000\",\n      \"totalAssetsCents\": \"45000000\",\n      \"totalLiabilitiesCents\": \"12500000\",\n      \"grossFarmIncomeCents\": \"35000000\",\n      \"nonFarmIncomeCents\": \"7500000\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/submitApplication",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "submitApplication"
                  ]
                },
                "description": "The caller must hold the DEALER_ADMIN policy; without it the call is refused with HTTP 403 before anything is read.\n\nCreates or links the main applicant, ordered co-applicants, and optional organization while submitting one financing line in a single call. Each entity uses the existing `{ kind: \"reference\" }` or complete `{ kind: \"record\" }` shape.\n\nModel title as an attribute of the person-organization relationship: reuse it when the same person applies for the same organization, but copy it onto each application as a historical snapshot. In the client UI, select the organization first, then show a title field for each applicant and prefill it from the saved relationship for that person and organization.\n\nA suitable client-side relationship record is `{ \"personUuid\": \"...\", \"organizationUuid\": \"...\", \"organizationTitle\": \"Member\" }`; `organizationTitle` is a suggested client field name, not an additional request property.\n\nIn the current V2 wire contract, new-person records carry title; existing references use the title already stored by CFI and cannot override it in this request.\n\nEvery main applicant and co-applicant is validated against this organization type. Allowed titles are: LimitedLiabilityCompany — Member, Manager; Corporation — President, Vice President, Secretary, Treasurer, Director; JointVenture — Member; GeneralPartnership — Partner; Trust — Trustee; LimitedPartnership — Partner. `Co-Applicant` is an application role, not an organization title.\n\nA new `organization.ein` accepts `123456789`, `12-3456789`, or `12 3456789`. Every accepted form is normalized to the canonical nine-digit form before duplicate lookup, idempotency processing, or persistence.\n\nNew-person bounds follow the current underwriting contract: first and last name are required nonempty strings; email must be valid; phone is normalized to US E.164; communication preference and marital status use the published enums; years farming is 1 through 99; ownership is 1 through 100 percent; at least one address is required; state is two characters; ZIP is 12345 or 12345-6789. Names, email, address text, title, organization website/location, and the co-applicant/address/farm-state/crop-type collection sizes have no field-specific business maximum beyond the API request-size limit.\n\nPerson and organization assets and liabilities are required from 100 through 214748364700 cents; income is optional from 0 through 214748364700 cents. These underwriting values must end in 00 because the current persistence contract stores whole USD dollars. `financeAmountCents` must be greater than zero and has no field-specific business maximum. Acres, when supplied, must be a positive whole number and has no field-specific business maximum.\n\nPerson, organization, financing-line, and local workflow records commit together or roll back together in one local database transaction. External side effects are not part of that database transaction.\n\n`submissionUuid` is dealer-scoped to this operation and retained with the financing line. Create one UUID for one logical application. Replaying it with the same normalized payload returns the original canonical resources with `replayed: true` and performs no duplicate submission; reusing it with a different normalized payload returns `idempotency_key_reused_with_different_request`.\n\nA success response means the local person, organization, financing-line, and workflow records committed. It does not claim a distributed transaction with external systems. The returned canonical `financingLine`, ordered `people`, and `organization` can be upserted immediately without a full synchronization.\n\nAn unknown or inaccessible person reference returns HTTP 404 with `data.reason: person_not_found`; an unknown or inaccessible organization reference uses `organization_not_found`. Both are non-retriable and intentionally do not reveal foreign record existence.\n\n`incomplete_application` means the request passed transport and request-schema validation, but one or more linked or newly supplied entities are not complete enough to submit. An existing `{ kind: \"reference\" }` record is linked as stored; referencing it does not update or complete it.\n\nDisplay every `data.entities[].errors` entry next to the matching record; do not show only `data.reason`. `retriable: false` means retrying the identical payload will not help—the identified stored records or request data must be corrected first.\n\nIncomplete submissions roll back all local application records. No durable idempotency result is created, so only a successfully committed submission is replayable.\n\nEvery request object is strict. Transport validation returns `invalid_request` with stable issue codes and nested paths. New-record calendar dates use real `YYYY-MM-DD` dates; money uses decimal-string USD cents; government IDs are write-only and never returned or recorded in diagnostics.\n\npersons[0] is the primary applicant; each later entry is an additional applicant in request order."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Bad Request\",\n  \"data\": {\n    \"reason\": \"incomplete_application\",\n    \"retriable\": false,\n    \"entities\": [\n      {\n        \"kind\": \"person\",\n        \"ref\": \"30000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"birth_date: Invalid date\"\n        ]\n      },\n      {\n        \"kind\": \"organization\",\n        \"ref\": \"40000000-0000-4000-8000-000000000001\",\n        \"errors\": [\n          \"name: Organization name is required\"\n        ]\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "List a loan's transactions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/crmFinancingV2/transactions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "crmFinancingV2",
                "transactions"
              ]
            },
            "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "transactions"
                  ]
                },
                "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"items\": [\n    {\n      \"transactionUuid\": \"90000000-0000-4000-8000-000000000001\",\n      \"kind\": \"draw\",\n      \"status\": \"posted\",\n      \"amountCents\": \"500000\",\n      \"description\": \"Seed purchase\",\n      \"trancheId\": \"70000000-0000-4000-8000-000000000001\",\n      \"trancheLabel\": \"01 - AG 0%\",\n      \"createdAt\": \"2026-03-02T15:00:00.000Z\",\n      \"invoicedAt\": \"2026-03-01\",\n      \"postedAt\": \"2026-03-02T16:30:00.000Z\",\n      \"invoiceUuid\": \"a0000000-0000-4000-8000-000000000001\",\n      \"files\": [\n        {\n          \"key\": \"invoice-1042.pdf\",\n          \"name\": \"invoice-1042.pdf\",\n          \"sizeBytes\": 48213,\n          \"url\": \"https://files.example.com/loan/60000000-0000-4000-8000-000000000001/transaction/90000000-0000-4000-8000-000000000001/invoice-1042.pdf?signature=example\"\n        }\n      ]\n    }\n  ],\n  \"nextCursor\": \"eyJ2ZXJzaW9uIjoxLCJyZXNvdXJjZSI6InRyYW5zYWN0aW9ucyJ9\"\n}"
            },
            {
              "name": "400 — Missing loan UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "transactions"
                  ]
                },
                "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"loanRef\"\n        ],\n        \"code\": \"required\",\n        \"message\": \"loanRef is required.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid loan UUID",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "transactions"
                  ]
                },
                "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"loanRef\"\n        ],\n        \"code\": \"invalid_format\",\n        \"message\": \"Must be a valid UUID.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid limit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "transactions"
                  ]
                },
                "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"limit\"\n        ],\n        \"code\": \"out_of_range\",\n        \"message\": \"Limit must be between 1 and 100.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Invalid cursor type",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "transactions"
                  ]
                },
                "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"cursor\"\n        ],\n        \"code\": \"invalid_type\",\n        \"message\": \"Invalid value type.\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "400 — Unknown property",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"loanRef\": \"60000000-0000-4000-8000-000000000001\",\n  \"limit\": 50\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/crmFinancingV2/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crmFinancingV2",
                    "transactions"
                  ]
                },
                "description": "Returns one page of the ledger for the loan `loanRef` (`financingLine.loan.loanUuid`), newest first by `createdAt, transactionUuid` keyset ordering. Cursors are replay-safe but do not create a point-in-time snapshot, and a cursor is only meaningful with the `loanRef` it was issued for.\n\n`kind` is one of `draw`, `return`, `payment`, `fee` or `adjustment`. Lifecycle rows that never move money (`initial` and the declined/revoked types) are not listed; offered and accepted draws (`dealer_offer`, `borrower_accepted`) are listed as `draw`.\n\n`amountCents` is signed: positive means the borrower owes more (draws, fees), negative means the balance went down (payments, returns).\n\n`status` is `posted` once the transaction has a `postedAt`; otherwise `pending`.\n\n`transactionUuid` equals the `drawUuid` of a CRM-created draw. `invoicedAt` is a calendar date (`YYYY-MM-DD`).\n\n`files` are the transaction's invoice files: the linked invoice's folder, else the transaction's own folder; an empty list means none were found. File `url` values are presigned download links that expire within 48 hours: re-fetch the list instead of storing them. `key` is the stable file identity.\n\nAn unknown loan and a loan outside the authenticated dealer's accessible scope both return HTTP 404 with `data.reason: loan_not_found` and `data.retriable: false`, so the endpoint does not disclose foreign record existence. Any dealer user with access to the loan may call this read-only endpoint."
              },
              "status": "400",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"defined\": true,\n  \"code\": \"BAD_REQUEST\",\n  \"status\": 400,\n  \"message\": \"Input validation failed\",\n  \"data\": {\n    \"reason\": \"invalid_request\",\n    \"retriable\": false,\n    \"issues\": [\n      {\n        \"path\": [\n          \"loanUuid\"\n        ],\n        \"code\": \"unrecognized_key\",\n        \"message\": \"Unknown field.\"\n      }\n    ]\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "inboundDeals",
      "description": "Generated from the public OpenAPI contract. Request and response examples come from the endpoint schemas and metadata.",
      "item": [
        {
          "name": "Create an inbound deal",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"deal\": {\n    \"externalType\": \"InboundDeal\",\n    \"externalID\": \"\"\n  },\n  \"dealer\": {\n    \"token\": \"00000000-0000-4000-8000-000000000000\",\n    \"contactName\": \"Test Broker\",\n    \"contactPhone\": \"07000000099\",\n    \"contactEmail\": \"broker@example.test\",\n    \"subBrokerName\": \"\",\n    \"comments\": \"\"\n  },\n  \"parties\": [\n    {\n      \"relationshipType\": \"Borrower\",\n      \"partyType\": \"Organization\",\n      \"id\": \"20001\",\n      \"companyName\": \"Example Cleaning Services Ltd\",\n      \"registrationNumber\": \"12345678\",\n      \"companyType\": \"Private Company - Limited\",\n      \"dateEstablished\": \"14/05/2019\",\n      \"turnover\": \"150000\",\n      \"website\": \"https://www.example-cleaning.co.uk/\",\n      \"description\": \"General cleaning of buildings\",\n      \"addresses\": [\n        {\n          \"addressLine1\": \"1 Example Street\",\n          \"addressLine2\": \"Example Retail Park\",\n          \"city\": \"London\",\n          \"postCode\": \"SW1A 1AA\"\n        }\n      ],\n      \"tradingAddress\": {\n        \"addressLine1\": \"2 Trade Park\",\n        \"addressLine2\": \"Unit 5\",\n        \"city\": \"Manchester\",\n        \"county\": \"Greater Manchester\",\n        \"country\": \"United Kingdom\",\n        \"postCode\": \"M1 2AB\"\n      },\n      \"bankAccount\": {\n        \"accountWithLBG\": false,\n        \"sortCode\": \"12-34-56\",\n        \"accountNumber\": \"00112233\"\n      },\n      \"externalType\": \"Organization\",\n      \"externalID\": 20001\n    },\n    {\n      \"relationshipType\": \"Director\",\n      \"partyType\": \"Person\",\n      \"id\": \"30001\",\n      \"firstName\": \"Alex\",\n      \"middleName\": \"James\",\n      \"lastName\": \"DirectorOne\",\n      \"title\": \"Mr\",\n      \"dateOfBirth\": \"01/01/1970\",\n      \"nationality\": \"British\",\n      \"phoneNumbers\": [\n        {\n          \"number\": \"07700 900123\",\n          \"type\": \"Mobile\"\n        }\n      ],\n      \"emailAddresses\": [\n        \"alex.directorone@example.test\"\n      ],\n      \"addresses\": [\n        {\n          \"addressLine1\": \"10 Example Road\",\n          \"city\": \"London\",\n          \"county\": \"Greater London\",\n          \"country\": \"United Kingdom\",\n          \"postCode\": \"E1 6AN\"\n        }\n      ],\n      \"externalType\": \"Person\"\n    },\n    {\n      \"relationshipType\": \"Contact\",\n      \"partyType\": \"Person\",\n      \"id\": \"30001\",\n      \"firstName\": \"Alex\",\n      \"middleName\": \"James\",\n      \"lastName\": \"DirectorOne\",\n      \"title\": \"Mr\",\n      \"dateOfBirth\": \"01/01/1970\",\n      \"nationality\": \"British\",\n      \"phoneNumbers\": [\n        {\n          \"number\": \"07700 900123\",\n          \"type\": \"Mobile\"\n        }\n      ],\n      \"emailAddresses\": [\n        \"alex.directorone@example.test\"\n      ],\n      \"addresses\": [\n        {\n          \"addressLine1\": \"10 Example Road\",\n          \"city\": \"London\",\n          \"county\": \"Greater London\",\n          \"country\": \"United Kingdom\",\n          \"postCode\": \"E1 6AN\"\n        }\n      ],\n      \"externalType\": \"Person\"\n    },\n    {\n      \"relationshipType\": \"Supplier\",\n      \"partyType\": \"Organization\",\n      \"id\": \"40001\",\n      \"companyName\": \"Example Commercials Limited\",\n      \"registrationNumber\": \"87654321\",\n      \"companyType\": \"Private Company - Limited\",\n      \"addresses\": [\n        {\n          \"addressLine1\": \"C/O Example Accountants\",\n          \"city\": \"Cardiff\",\n          \"postCode\": \"CF10 1AA\"\n        }\n      ],\n      \"externalType\": \"Organization\"\n    }\n  ],\n  \"assets\": [\n    {\n      \"supplierId\": \"40001\",\n      \"quantity\": 1,\n      \"manufacturer\": \"Ford\",\n      \"model\": \"Transit Courier 1.0 EcoBoost Leader Panel Van\",\n      \"condition\": \"used\",\n      \"yearOfManufacture\": 2020,\n      \"costExcludingVat\": \"9240.00\",\n      \"vatAmount\": \"1848.00\",\n      \"nonVatableAmount\": \"0\",\n      \"costIncludingVat\": 11088\n    }\n  ],\n  \"facility\": {\n    \"typeOfProduct\": \"Hire Purchase\",\n    \"vatTreatment\": \"Pay Upfront\",\n    \"deposit\": \"0.00\",\n    \"balloon\": \"0.00\",\n    \"term\": 36,\n    \"paymentFrequency\": \"Monthly\",\n    \"advanceNumberOfInstalments\": 0,\n    \"periodicNumberOfInstalments\": 36,\n    \"endOfContractPeriod\": 36,\n    \"lenderYield\": \"5.84\",\n    \"commission\": \"554.40\",\n    \"repaymentAmountExcludingVat\": 577.68,\n    \"documentationFeeExcludingVat\": \"50\",\n    \"optionToPurchaseFeeExcludingVat\": \"50\"\n  },\n  \"writeUp\": {\n    \"background\": \"Example customer background paragraph from the broker write-up.\",\n    \"summary\": \"Broker's short rationale for the financing request.\"\n  },\n  \"consents\": {\n    \"metAtTradingPremises\": \"Yes\",\n    \"lastVisitDate\": \"2026-04-15\",\n    \"estimatedDrawdownDate\": \"01/10/2026\"\n  },\n  \"documents\": [\n    {\n      \"fileName\": \"example-document.pdf\",\n      \"mimeType\": \"application/pdf\",\n      \"data\": \"JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjAwIDIwMF0vQ29udGVudHMgNCAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4+Pj4+ZW5kb2JqCjQgMCBvYmo8PC9MZW5ndGggMzE+PnN0cmVhbQpCVCAvRjEgMjQgVGYgODAgOTAgVGQgKEEpIFRqIEVUCmVuZHN0cmVhbWVuZG9iago1IDAgb2JqPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTEvQmFzZUZvbnQvSGVsdmV0aWNhPj5lbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAwNTIgMDAwMDAgbiAKMDAwMDAwMDEwMSAwMDAwMCBuIAowMDAwMDAwMjExIDAwMDAwIG4gCjAwMDAwMDAyODcgMDAwMDAgbiAKdHJhaWxlcjw8L1NpemUgNi9Sb290IDEgMCBSPj4Kc3RhcnR4cmVmCjM0OAolJUVPRg==\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/inboundDeals/create",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "inboundDeals",
                "create"
              ]
            },
            "description": "**Idempotency.** Deals are deduped by `deal.externalType` + `deal.externalID`,\n**per funder**: re-submitting the same pair with the same `deal.funder`\nreturns the existing deal instead of creating a duplicate (`status` is\n`submitted` if that deal had already been submitted to the funder, otherwise\n`draft`); the same pair with a **different** funder creates a separate deal\nfor that funder. A funder pushed onto an existing funder-agnostic deal\n(created without `deal.funder`) attaches to it rather than duplicating it.\n\n**Documents.** The optional `documents` array attaches base64-encoded files\nto the deal, exactly as if the broker had uploaded them on the platform's\ndocuments step; they are sent to the funder when the deal is submitted.\nDocuments are only uploaded when the deal is first created — on idempotent\nre-submissions they are reported as `skipped`. Each document's outcome is\nreturned in the response `documents` array; a `failed` document does not\nfail the request (re-attach it in the platform via `loginUrl`)."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"deal\": {\n    \"externalType\": \"InboundDeal\",\n    \"externalID\": \"\"\n  },\n  \"dealer\": {\n    \"token\": \"00000000-0000-4000-8000-000000000000\",\n    \"contactName\": \"Test Broker\",\n    \"contactPhone\": \"07000000099\",\n    \"contactEmail\": \"broker@example.test\",\n    \"subBrokerName\": \"\",\n    \"comments\": \"\"\n  },\n  \"parties\": [\n    {\n      \"relationshipType\": \"Borrower\",\n      \"partyType\": \"Organization\",\n      \"id\": \"20001\",\n      \"companyName\": \"Example Cleaning Services Ltd\",\n      \"registrationNumber\": \"12345678\",\n      \"companyType\": \"Private Company - Limited\",\n      \"dateEstablished\": \"14/05/2019\",\n      \"turnover\": \"150000\",\n      \"website\": \"https://www.example-cleaning.co.uk/\",\n      \"description\": \"General cleaning of buildings\",\n      \"addresses\": [\n        {\n          \"addressLine1\": \"1 Example Street\",\n          \"addressLine2\": \"Example Retail Park\",\n          \"city\": \"London\",\n          \"postCode\": \"SW1A 1AA\"\n        }\n      ],\n      \"tradingAddress\": {\n        \"addressLine1\": \"2 Trade Park\",\n        \"addressLine2\": \"Unit 5\",\n        \"city\": \"Manchester\",\n        \"county\": \"Greater Manchester\",\n        \"country\": \"United Kingdom\",\n        \"postCode\": \"M1 2AB\"\n      },\n      \"bankAccount\": {\n        \"accountWithLBG\": false,\n        \"sortCode\": \"12-34-56\",\n        \"accountNumber\": \"00112233\"\n      },\n      \"externalType\": \"Organization\",\n      \"externalID\": 20001\n    },\n    {\n      \"relationshipType\": \"Director\",\n      \"partyType\": \"Person\",\n      \"id\": \"30001\",\n      \"firstName\": \"Alex\",\n      \"middleName\": \"James\",\n      \"lastName\": \"DirectorOne\",\n      \"title\": \"Mr\",\n      \"dateOfBirth\": \"01/01/1970\",\n      \"nationality\": \"British\",\n      \"phoneNumbers\": [\n        {\n          \"number\": \"07700 900123\",\n          \"type\": \"Mobile\"\n        }\n      ],\n      \"emailAddresses\": [\n        \"alex.directorone@example.test\"\n      ],\n      \"addresses\": [\n        {\n          \"addressLine1\": \"10 Example Road\",\n          \"city\": \"London\",\n          \"county\": \"Greater London\",\n          \"country\": \"United Kingdom\",\n          \"postCode\": \"E1 6AN\"\n        }\n      ],\n      \"externalType\": \"Person\"\n    },\n    {\n      \"relationshipType\": \"Contact\",\n      \"partyType\": \"Person\",\n      \"id\": \"30001\",\n      \"firstName\": \"Alex\",\n      \"middleName\": \"James\",\n      \"lastName\": \"DirectorOne\",\n      \"title\": \"Mr\",\n      \"dateOfBirth\": \"01/01/1970\",\n      \"nationality\": \"British\",\n      \"phoneNumbers\": [\n        {\n          \"number\": \"07700 900123\",\n          \"type\": \"Mobile\"\n        }\n      ],\n      \"emailAddresses\": [\n        \"alex.directorone@example.test\"\n      ],\n      \"addresses\": [\n        {\n          \"addressLine1\": \"10 Example Road\",\n          \"city\": \"London\",\n          \"county\": \"Greater London\",\n          \"country\": \"United Kingdom\",\n          \"postCode\": \"E1 6AN\"\n        }\n      ],\n      \"externalType\": \"Person\"\n    },\n    {\n      \"relationshipType\": \"Supplier\",\n      \"partyType\": \"Organization\",\n      \"id\": \"40001\",\n      \"companyName\": \"Example Commercials Limited\",\n      \"registrationNumber\": \"87654321\",\n      \"companyType\": \"Private Company - Limited\",\n      \"addresses\": [\n        {\n          \"addressLine1\": \"C/O Example Accountants\",\n          \"city\": \"Cardiff\",\n          \"postCode\": \"CF10 1AA\"\n        }\n      ],\n      \"externalType\": \"Organization\"\n    }\n  ],\n  \"assets\": [\n    {\n      \"supplierId\": \"40001\",\n      \"quantity\": 1,\n      \"manufacturer\": \"Ford\",\n      \"model\": \"Transit Courier 1.0 EcoBoost Leader Panel Van\",\n      \"condition\": \"used\",\n      \"yearOfManufacture\": 2020,\n      \"costExcludingVat\": \"9240.00\",\n      \"vatAmount\": \"1848.00\",\n      \"nonVatableAmount\": \"0\",\n      \"costIncludingVat\": 11088\n    }\n  ],\n  \"facility\": {\n    \"typeOfProduct\": \"Hire Purchase\",\n    \"vatTreatment\": \"Pay Upfront\",\n    \"deposit\": \"0.00\",\n    \"balloon\": \"0.00\",\n    \"term\": 36,\n    \"paymentFrequency\": \"Monthly\",\n    \"advanceNumberOfInstalments\": 0,\n    \"periodicNumberOfInstalments\": 36,\n    \"endOfContractPeriod\": 36,\n    \"lenderYield\": \"5.84\",\n    \"commission\": \"554.40\",\n    \"repaymentAmountExcludingVat\": 577.68,\n    \"documentationFeeExcludingVat\": \"50\",\n    \"optionToPurchaseFeeExcludingVat\": \"50\"\n  },\n  \"writeUp\": {\n    \"background\": \"Example customer background paragraph from the broker write-up.\",\n    \"summary\": \"Broker's short rationale for the financing request.\"\n  },\n  \"consents\": {\n    \"metAtTradingPremises\": \"Yes\",\n    \"lastVisitDate\": \"2026-04-15\",\n    \"estimatedDrawdownDate\": \"01/10/2026\"\n  },\n  \"documents\": [\n    {\n      \"fileName\": \"example-document.pdf\",\n      \"mimeType\": \"application/pdf\",\n      \"data\": \"JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjAwIDIwMF0vQ29udGVudHMgNCAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4+Pj4+ZW5kb2JqCjQgMCBvYmo8PC9MZW5ndGggMzE+PnN0cmVhbQpCVCAvRjEgMjQgVGYgODAgOTAgVGQgKEEpIFRqIEVUCmVuZHN0cmVhbWVuZG9iago1IDAgb2JqPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTEvQmFzZUZvbnQvSGVsdmV0aWNhPj5lbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAwNTIgMDAwMDAgbiAKMDAwMDAwMDEwMSAwMDAwMCBuIAowMDAwMDAwMjExIDAwMDAwIG4gCjAwMDAwMDAyODcgMDAwMDAgbiAKdHJhaWxlcjw8L1NpemUgNi9Sb290IDEgMCBSPj4Kc3RhcnR4cmVmCjM0OAolJUVPRg==\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/inboundDeals/create",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "inboundDeals",
                    "create"
                  ]
                },
                "description": "**Idempotency.** Deals are deduped by `deal.externalType` + `deal.externalID`,\n**per funder**: re-submitting the same pair with the same `deal.funder`\nreturns the existing deal instead of creating a duplicate (`status` is\n`submitted` if that deal had already been submitted to the funder, otherwise\n`draft`); the same pair with a **different** funder creates a separate deal\nfor that funder. A funder pushed onto an existing funder-agnostic deal\n(created without `deal.funder`) attaches to it rather than duplicating it.\n\n**Documents.** The optional `documents` array attaches base64-encoded files\nto the deal, exactly as if the broker had uploaded them on the platform's\ndocuments step; they are sent to the funder when the deal is submitted.\nDocuments are only uploaded when the deal is first created — on idempotent\nre-submissions they are reported as `skipped`. Each document's outcome is\nreturned in the response `documents` array; a `failed` document does not\nfail the request (re-attach it in the platform via `loginUrl`)."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"dealUuid\": \"11111111-1111-4111-8111-111111111111\",\n  \"remoteId\": null,\n  \"status\": \"draft\",\n  \"loginUrl\": \"https://app.connectedfi.com/borrower/verify?token=single-use-review-token\",\n  \"documents\": [\n    {\n      \"fileName\": \"example-document.pdf\",\n      \"status\": \"uploaded\",\n      \"fileKey\": \"V1StGXR8Z5jdHi6BmyT_example-document.pdf\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Get an inbound deal's funder submission status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/inboundDeals/status?dealUuid=%7B%7BdealUuid%7D%7D",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "inboundDeals",
                "status"
              ],
              "query": [
                {
                  "key": "dealUuid",
                  "value": "{{dealUuid}}",
                  "disabled": false
                }
              ]
            },
            "description": "Returns the current funder-submission status for a deal created via the\ninbound API, keyed by the `dealUuid` returned from `inboundDeals.create`.\n\n**Access.** A broker may only query deals belonging to their own company;\nan unknown or other-company `dealUuid` returns 404.\n\n**Lifecycle.** A freshly created deal is a `draft` with no funder reference.\nOnce the broker submits it in the platform, the funder submission moves to\n`submitted` with a `remoteId`, and the status then advances toward a\nfunder-specific terminal value as the platform polls the funder."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/inboundDeals/status?dealUuid=%7B%7BdealUuid%7D%7D",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "inboundDeals",
                    "status"
                  ],
                  "query": [
                    {
                      "key": "dealUuid",
                      "value": "{{dealUuid}}",
                      "disabled": false
                    }
                  ]
                },
                "description": "Returns the current funder-submission status for a deal created via the\ninbound API, keyed by the `dealUuid` returned from `inboundDeals.create`.\n\n**Access.** A broker may only query deals belonging to their own company;\nan unknown or other-company `dealUuid` returns 404.\n\n**Lifecycle.** A freshly created deal is a `draft` with no funder reference.\nOnce the broker submits it in the platform, the funder submission moves to\n`submitted` with a `remoteId`, and the status then advances toward a\nfunder-specific terminal value as the platform polls the funder."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"dealUuid\": \"11111111-1111-4111-8111-111111111111\",\n  \"dealStatus\": \"workflow_running\",\n  \"submissions\": [\n    {\n      \"funderUuid\": \"22222222-2222-4222-8222-222222222222\",\n      \"funderName\": \"Lloyds\",\n      \"funderSlug\": \"lloyds\",\n      \"status\": \"submitted\",\n      \"remoteId\": \"LLOYDS-REF-12345\",\n      \"errorMessage\": null,\n      \"updatedAt\": \"2026-07-01T09:30:00.000Z\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Upload documents to an existing inbound deal",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"dealUuid\": \"11111111-1111-4111-8111-111111111111\",\n  \"documents\": [\n    {\n      \"fileName\": \"example-document.pdf\",\n      \"mimeType\": \"application/pdf\",\n      \"data\": \"JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjAwIDIwMF0vQ29udGVudHMgNCAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4+Pj4+ZW5kb2JqCjQgMCBvYmo8PC9MZW5ndGggMzE+PnN0cmVhbQpCVCAvRjEgMjQgVGYgODAgOTAgVGQgKEEpIFRqIEVUCmVuZHN0cmVhbWVuZG9iago1IDAgb2JqPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTEvQmFzZUZvbnQvSGVsdmV0aWNhPj5lbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAwNTIgMDAwMDAgbiAKMDAwMDAwMDEwMSAwMDAwMCBuIAowMDAwMDAwMjExIDAwMDAwIG4gCjAwMDAwMDAyODcgMDAwMDAgbiAKdHJhaWxlcjw8L1NpemUgNi9Sb290IDEgMCBSPj4Kc3RhcnR4cmVmCjM0OAolJUVPRg==\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/inboundDeals/documents",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "inboundDeals",
                "documents"
              ]
            },
            "description": "Attaches documents to a deal previously created via `inboundDeals.create`,\nkeyed by the `dealUuid` from that call. Use this when the documents weren't\nready at creation time — the files are stored exactly as if the broker had\nuploaded them on the platform's documents step, and are sent to the funder\nwhen the deal is submitted.\n\n**Draft-only.** Documents can only be added while the deal is still a draft\n— before it has been submitted to the funder. A deal that has already been\nsubmitted is rejected with `409`; re-attach the file in the platform instead.\n\n**Access.** A broker may only upload to deals belonging to their own company;\nan unknown or other-company `dealUuid` returns `404`. The deal must have been\ncreated via the inbound API (`422` otherwise).\n\n**Per-document status.** Each document's outcome is returned in the response\n`documents` array in request order; a `failed` document does not fail the\nrequest (the others may still have been stored)."
          },
          "response": [
            {
              "name": "200 — Example 1",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dealUuid\": \"11111111-1111-4111-8111-111111111111\",\n  \"documents\": [\n    {\n      \"fileName\": \"example-document.pdf\",\n      \"mimeType\": \"application/pdf\",\n      \"data\": \"JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjAwIDIwMF0vQ29udGVudHMgNCAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4+Pj4+ZW5kb2JqCjQgMCBvYmo8PC9MZW5ndGggMzE+PnN0cmVhbQpCVCAvRjEgMjQgVGYgODAgOTAgVGQgKEEpIFRqIEVUCmVuZHN0cmVhbWVuZG9iago1IDAgb2JqPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTEvQmFzZUZvbnQvSGVsdmV0aWNhPj5lbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAwNTIgMDAwMDAgbiAKMDAwMDAwMDEwMSAwMDAwMCBuIAowMDAwMDAwMjExIDAwMDAwIG4gCjAwMDAwMDAyODcgMDAwMDAgbiAKdHJhaWxlcjw8L1NpemUgNi9Sb290IDEgMCBSPj4Kc3RhcnR4cmVmCjM0OAolJUVPRg==\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/inboundDeals/documents",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "inboundDeals",
                    "documents"
                  ]
                },
                "description": "Attaches documents to a deal previously created via `inboundDeals.create`,\nkeyed by the `dealUuid` from that call. Use this when the documents weren't\nready at creation time — the files are stored exactly as if the broker had\nuploaded them on the platform's documents step, and are sent to the funder\nwhen the deal is submitted.\n\n**Draft-only.** Documents can only be added while the deal is still a draft\n— before it has been submitted to the funder. A deal that has already been\nsubmitted is rejected with `409`; re-attach the file in the platform instead.\n\n**Access.** A broker may only upload to deals belonging to their own company;\nan unknown or other-company `dealUuid` returns `404`. The deal must have been\ncreated via the inbound API (`422` otherwise).\n\n**Per-document status.** Each document's outcome is returned in the response\n`documents` array in request order; a `failed` document does not fail the\nrequest (the others may still have been stored)."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"dealUuid\": \"11111111-1111-4111-8111-111111111111\",\n  \"documents\": [\n    {\n      \"fileName\": \"example-document.pdf\",\n      \"status\": \"uploaded\",\n      \"fileKey\": \"V1StGXR8Z5jdHi6BmyT_example-document.pdf\"\n    }\n  ]\n}"
            }
          ]
        }
      ]
    }
  ]
}