Agents

Submit a bulk-delivery job for agents

POST
/v1/agents/bulk-delivery

Queues an ECS task that dumps every matching agents document to S3 in the requested format. Returns 202 with a jobId; poll GET /v1/agents/bulk-delivery/{jobId} for status + the signed download URL.

Row limit. Deliveries of up to 5,000 rows need no entitlement. Above that, the org's bulk-delivery.agents entitlement is required and its scope (row ceiling, row filters, allowed fields) governs the delivery; without it the request is rejected with 403 entitlement_missing. Pass limit at or below the ceiling to deliver a capped subset of a broader query. Email support@modelmatch.com to request a limit increase.

Delivery is billed at 1 credit per row regardless of entitlement (deliveries submitted from the ModelMatch web app are not billed).

Push-target destination. Pass destination: { type: "push-target", targetId } to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and code (TARGET_NOT_FOUND 404, FORBIDDEN 403, PLAN_REQUIRED 402, TARGET_DISABLED 409, ENTITY_MISMATCH 400). Limits and billing are the same as a file delivery.

Authorization

x-api-key<token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/agents/bulk-delivery" \  -H "Content-Type: application/json" \  -d '{}'
{
  "billing": "credits",
  "destination": {
    "targetId": "string",
    "type": "push-target"
  },
  "entityType": "string",
  "estimatedTotal": 0,
  "format": "parquet",
  "jobId": "string",
  "maxRows": 1,
  "status": "queued"
}
{
  "error": "string"
}
{
  "error": "string"
}
{
  "balance": 0,
  "cost": 0,
  "error": "payment_required",
  "message": "string",
  "reason": "out_of_credits"
}
{
  "entitlementKey": "string",
  "error": "entitlement_missing",
  "estimatedTotal": 0,
  "maxRows": 1,
  "message": "string"
}
{
  "code": "TARGET_NOT_FOUND",
  "error": "TARGET_NOT_FOUND",
  "message": "string"
}
{
  "code": "TARGET_NOT_FOUND",
  "error": "TARGET_NOT_FOUND",
  "message": "string"
}
{
  "error": "string"
}

Search agents with filters POST

Search and list individual real-estate agents with filters — one row per agent. Filter by name, location (state, city, zip), brokerage/office, and production metrics (sales volume, transaction units, price range), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city/zip filters match ANY of an agent's location signals — their listed city/state, their office address(es), AND the markets where they actually closed transactions (production) — combined with OR. So an agent matches a searched location if their office OR their production is there (set `locationSource` to `office` or `production` to use one signal). A search for city "Long Beach" can therefore return agents whose office or displayed primary market is in a different city/state, because they transacted in Long Beach. The `state`/`city` returned on each row reflect the agent's primary market and may differ from the searched location. (Use the `office` filter to match by brokerage/office name — one or several names, each a case-insensitive whole-word phrase, `name*` for a prefix; `currentOffice` restricts to the agent's current office — and the per-agent city/county/state breakdown endpoints to rank an agent's volume within a specific market.) RANKING BY DEAL SIDE: combine a location filter with `sort` on `buyerVolume`/`buyerUnits` (or `sellerVolume`/`sellerUnits`, `dualVolume`/`dualUnits`) to rank agents by how active they are representing buyers vs. sellers in that market — e.g. sort `buyerVolume` descending for the most active buyer-side agents in a state or city. This is the per-agent record search: use it to find specific real-estate agents or build a filtered agent list. (For a single agent by ID use the agent detail endpoint.) If you only need how many agents match and not the records themselves, send the same request body to `countAgents`.

Configurable chart (measure × slice) over a branch roster's loans POST

Scoped to loans written by the loan officers on this branch's CURRENT licensing roster (wherever they wrote them), matching the branch profile. For loans public record attributes to the branch itself, use the branch breakdown endpoints.