TPO partnerships stop being friction
Originators and investors collaborate on the same loan record with explicit, time-bound grants. No email exports, no 'temporary user' accounts.
Typed org hierarchy (ORIGINATOR / INVESTOR / CORRESPONDENT / SUBSERVICER) with Entity sub-units (BRANCH·REGION·TEAM·DIVISION·CORPORATE). Loan sharing via JWT visibility predicates with TTL grants. Bulk-assign by directive. Every cross-tenant action writes actingAsOrgId into the audit chain.
Overview
Team and delegation in RateStack is built around three primitives: typed orgs, typed entities, and capability grants. Orgs carry OrgRoles (ORIGINATOR / INVESTOR / CORRESPONDENT / SUBSERVICER) and out-of-the-box capability sets. Entities are sub-units inside an org with their own type (BRANCH / REGION / TEAM / DIVISION / CORPORATE). Loan sharing and delegation use TTL-bounded JWT grants that carry specific capabilities; expiry is enforced server-side and grants are revocable. Every cross-tenant action — pricing, locking, viewing — writes actingAsOrgId into the audit chain so wholesale lenders can prove which originator initiated each request.
ORIGINATOR / INVESTOR / CORRESPONDENT / SUBSERVICER. Each ships with a default capability set; admins can refine per-org.
BRANCH / REGION / TEAM / DIVISION / CORPORATE. Hierarchies nest naturally; capability scoping respects the path.
12 operational capabilities (loan.read, loan.write, loan.share, loan.price, etc.) and 7 provider capabilities. Published at /v1/capabilities.
Grant another org or user time-bound visibility on a specific loan. JWT-gated; expiry enforced server-side.
Reassign loans to a new LO with one bulk command. The audit chain captures the directive + reason + every loan touched.
Every cross-tenant operation writes actingAsOrgId. Wholesale lenders can prove which originator instigated a price-discovery or lock.
How it works
Numbered steps from input to output. Each step maps to a specific subsystem you can inspect via OpenTelemetry.
Admins create orgs and assign type (ORIGINATOR / INVESTOR / CORRESPONDENT / SUBSERVICER). The platform applies the matching default capability set.
Add entities (BRANCH, REGION, TEAM, etc.) under the org. Entities nest naturally; capability scoping inherits down.
Users belong to a primary entity and may have secondary affiliations. Capability resolution walks the entity path.
POST a loan-share with grantee, capabilities, and TTL. The platform issues a delegation grant that the api-service's JWT layer enforces.
When the grantee operates against the shared loan, the audit row carries actingAsOrgId = grantor + actor.orgId = grantee. The trace is unambiguous.
Grants expire at TTL by default. Admins can revoke early via the grant endpoint; revoked grants 401 on next request.
Hands on
Live cURL sample — copy, paste, ship.
# Grant another org temporary visibility into a loan
curl -X POST https://api.ratestack.com/v1/loans/lck_8a7c/share \
-H "X-API-Key: $RATESTACK_KEY" \
-H "Content-Type: application/json" \
-d '{
"granteeOrgId": "org_partner_42",
"capabilities": ["loan.read", "loan.price"],
"ttlMinutes": 120,
"reason": "Partner is exploring counter-offers for this borrower"
}'
# Returns:
# {
# "grantId": "grant_b4f2",
# "expiresAt": "2026-05-26T16:42:11Z",
# "auditId": "audit_9c1d"
# }Why this matters
Originators and investors collaborate on the same loan record with explicit, time-bound grants. No email exports, no 'temporary user' accounts.
actingAsOrgId on the audit chain shows exactly which originator initiated a price discovery or a lock at a wholesale partner.
Moving 200 loans from LO A to LO B is one directive. The audit row captures every loan touched with the reason.
Frequently asked
Yes. A user has an identity; org membership is a relation with its own role. Capability resolution combines memberships on every request.
TTL is the upper bound. Revocation is immediate: the next request from the grantee returns 401. Already-completed actions remain in the audit chain (we don't rewrite history).
Yes. Org admins can shrink the set; they cannot expand beyond what the org type allows. Enterprise customers can request custom capability bundles.
Embeds attach the exception as context for the next detector run. Not part of team/delegation strictly — but it shows up here because exception ownership respects entity scoping.
Single directive row + a child row per loan touched (loan-id, prior LO, new LO, reason). All hash-chained.
Related capabilities
Ready to see it on your data?
We'll spin you a sandbox, load your actual ratesheets, and walk you through this capability against your top scenarios.