---
title: "Search Consortium"
method: POST
path: "/consortium/searches"
tags: ["Consortium"]
---

# Search Consortium

`POST /consortium/searches`

## Request body

- V1ConsortiumCheckRequest — Strict JSON body for the standalone consortium check endpoint.
  - `tin` string, nullable — The business's 9-digit EIN/tax id.
  - `phones` string[] — Business or owner phone numbers.
  - `emails` string[] — Business or owner email addresses.
  - `website` string, nullable — The business's website.
  - `business_name` string, nullable — The business's legal or trade name.
  - `business_id` string, uuid, nullable — An Osiris business id to match exclusions linked to it.
  - `officers` V1ConsortiumCheckOfficerName[] — Officer/owner names to match.
    - `first_name` string, required — The officer's first name.
    - `last_name` string, required — The officer's last name.
    - `state` 'AL' | 'AK' | 'AZ' | 'AR' | 'CA' | 'CO' | 'CT' | 'DE' | 'DC' | 'FL' | 'GA' | 'HI' | 'ID' | 'IL' | 'IN' | 'IA' | 'KS' | 'KY' | 'LA' | 'ME' | 'MD' | 'MA' | 'MI' | 'MN' | 'MS' | 'MO' | 'MT' | 'NE' | 'NV' | 'NH' | 'NJ' | 'NM' | 'NY' | 'NC' | 'ND' | 'OH' | 'OK' | 'OR' | 'PA' | 'RI' | 'SC' | 'SD' | 'TN' | 'TX' | 'UT' | 'VT' | 'VA' | 'WA' | 'WV' | 'WI' | 'WY' | 'PR' | 'VI' | 'AE' | 'AA' | 'AP' | 'GU' | 'AS'
  - `address` V1ConsortiumCheckAddress
    - `street` string, nullable — Street line of the address.
    - `city` string, nullable — City of the address.
    - `state` 'AL' | 'AK' | 'AZ' | 'AR' | 'CA' | 'CO' | 'CT' | 'DE' | 'DC' | 'FL' | 'GA' | 'HI' | 'ID' | 'IL' | 'IN' | 'IA' | 'KS' | 'KY' | 'LA' | 'ME' | 'MD' | 'MA' | 'MI' | 'MN' | 'MS' | 'MO' | 'MT' | 'NE' | 'NV' | 'NH' | 'NJ' | 'NM' | 'NY' | 'NC' | 'ND' | 'OH' | 'OK' | 'OR' | 'PA' | 'RI' | 'SC' | 'SD' | 'TN' | 'TX' | 'UT' | 'VT' | 'VA' | 'WA' | 'WV' | 'WI' | 'WY' | 'PR' | 'VI' | 'AE' | 'AA' | 'AP' | 'GU' | 'AS'
    - `zip` string, nullable — ZIP code of the address.

## Response `200`

Successful Response

- V1ConsortiumCheckResult — Response for a standalone consortium check. Mirrors the OFAC / PEP adhoc search envelope (``matches`` + ``total_matches``); only the per-match shape (``ConsortiumMatch``) is consortium-specific. A no-match — including the unsupported name-only case — is simply an empty ``matches`` with ``total_matches == 0``.
  - `matches` V1ConsortiumMatch[] — The matched consortium exclusion records, strongest first.
    - `exclusion_id` string, uuid, required — Identifier of the matched consortium exclusion record.
    - `reported_on` string, date, nullable — Date the matching exclusion was submitted to the consortium.
    - `business_name` string, required — Legal name of the excluded business.
    - `doing_business_as` string, nullable — Trade name the business operates under, if different.
    - `business_address` string, required — Business address as reported with the exclusion.
    - `entity_type` 'CORPORATION' | 'LLC' | 'PARTNERSHIP' | 'SOLE PROPRIETORSHIP' | 'NON-PROFIT' | 'TRUST' | 'AGENT' | 'UNKNOWN'
    - `tin` string, nullable — The business's 9-digit EIN/tax id.
    - `email` string, nullable — Contact email reported with the exclusion.
    - `website` string, nullable — Business website reported with the exclusion.
    - `primary_owner` V1ExclusionOwnerDetail, required — One owner (primary or secondary) on a matched exclusion record. Built from the owner columns on the exclusion row itself, which are the same source the ingestion processor derives the ``ExclusionOwner`` rows from — so this is available on every record without depending on whether the processor has run or eager-loaded the owner relationship.
      - `first_name` string, required — Owner's first name.
      - `middle_name` string, nullable — Owner's middle name, if reported.
      - `last_name` string, required — Owner's last name.
      - `phone_number` string, nullable — Owner's phone number, normalized to E.164.
      - `address` string, nullable — Owner's address as reported with the exclusion.
    - `secondary_owner` V1ExclusionOwnerDetail — One owner (primary or secondary) on a matched exclusion record. Built from the owner columns on the exclusion row itself, which are the same source the ingestion processor derives the ``ExclusionOwner`` rows from — so this is available on every record without depending on whether the processor has run or eager-loaded the owner relationship.
      - `first_name` string, required — Owner's first name.
      - `middle_name` string, nullable — Owner's middle name, if reported.
      - `last_name` string, required — Owner's last name.
      - `phone_number` string, nullable — Owner's phone number, normalized to E.164.
      - `address` string, nullable — Owner's address as reported with the exclusion.
    - `product_type` 'BNK' | 'CC' | 'WC' | 'LOC' | 'EQF' | 'MCA' | 'PMT' | 'Other', required
    - `application_channel` 'OG' | 'BR' | 'ISO' | 'Other'
    - `application_channel_name` string, nullable — Free-text name of the application channel, if reported.
    - `application_ip_address` string, nullable — IP address recorded at application time, if reported.
    - `application_date` string, date, required — Date the original application was submitted.
    - `opened_on` string, date, required — Date the account was opened.
    - `closed_on` string, date, required — Date the account was closed.
    - `matures_on` string, date, nullable — Maturity date of the account, if applicable.
    - `closure_status` 'PIF' | 'WO' | 'SD', required
    - `closure_reason` 'PIF' | 'WBC' | 'WUP' | 'WPF' | 'WIF' | 'WSF', required
    - `first_payment_default` boolean, nullable — Whether the borrower defaulted on the first payment.
    - `term_in_months` integer, nullable — Term of the account in months, if applicable.
    - `amount` number, nullable — Original principal/funded amount.
    - `charge_off_amount` number, nullable — Amount charged off at closure, if any.
    - `payment_frequency` 'DY' | 'WY' | 'BW' | 'MY' | 'QY' | 'AY'
    - `score` number, required — Match confidence in [0, 1] — the strongest signal on this record: 1.0 when any exact identifier (EIN, phone, email, website, address, business id) matched; otherwise the best Typesense name similarity. Matches are returned sorted by exact-before-fuzzy, then by this score.
    - `matched_on` V1ConsortiumMatchedField[], required — The input identifiers that matched this record.
      - `type` 'TIN' | 'PHONE' | 'EMAIL' | 'WEBSITE' | 'BUSINESS_NAME' | 'OFFICER' | 'ADDRESS' | 'BUSINESS_ID', required — The identifier pass that produced a hit. Business-name and officer matches are distinct types (not a single ``name``) so a hit's ``matched_value`` is always the input that actually matched — an officer hit on a clean business reads as OFFICER("John Doe"), never as the applicant's unrelated business name.
      - `value` string, required — The caller's input that matched this record — structured identifiers in normalized form (phone as E.164, EIN as 9 digits), and the website as the URL supplied (matched on its domain).
  - `total_matches` integer, required — The number of distinct exclusion records matched.

## Other responses

- `403` — No active consortium membership.
- `422` — The request body is malformed.

---

[API](https://skmtc.net/baselayer/apis/baselayer-api-service.md) · [All operations](https://skmtc.net/baselayer/apis/baselayer-api-service/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/baselayer/baselayer-api-service/versions/0cc89938bc26/schema)
