Matchmaking API
Connect’s system-to-system Matchmaking API enables referral partners (and self-referring service partners) to integrate with Connect’s product catalog and create matching leads to service partners without any user interaction.
If you already know certain information about a user, such as their name, email, address, FICO score, etc., it is possible to present the user with Connect product offerings without them having to fill out an entire Connect questionnaire - or even know that they used Connect. You can also retrieve the list of questions from the Connect API and prompt the user directly to fill in any gaps in the requirements.
Forms, Questions, and Products
A bit of terminology:
-
A ‘Form’ is a set of questions.
-
A ‘Question’ is an individual question asked on the form, such as “Net Profit”.
-
A ‘Product’ is an product offering with several filtering criteria which an applicant must meet prior to being matched.
-
A ‘Product Kind’ is a category of product, such as a
Loan
. Future products may be things likeGrant
s orBusinessService
s. -
A ‘Submission’ is a set of answers to a form.
-
A ‘Lead’ is a link between a product and a submission
Since not every product is a good fit for every applicant, products have filters, and those filters act on answers to questions. Each product kind
requires different questions be answered in order to determine if the applicant is a good match, or to simply be a useful lead - for example, knowing the person’s first name can’t filter them, but a service partner would need to know who they’re talking to when they reach out.
Products commonly have filters such as AmountRequested
, which could be a range from $100,000 to $150,000, or YearsInBusiness
which may only allow businesses with TwoToThree
or ThreeOrMore
years.
The following is an example of the minimum question set required for a Form to match with any Loan
product:
Loan
Products Questions
Filtering questions:
Filter | Enum Name |
---|---|
AmountRequested | Integer |
BusinessAddress | Address Object |
BusinessIndustry | Industries |
BusinessType | BusinessType |
Collateral | Collateral |
CreditScore | CreditScores |
HasBusinessPlan | true or false |
NetProfit | Integer |
PriorBankruptcies | PriorBankruptcies |
RevenueLastYear | Revenues |
RevenueProjected | Revenues |
UseOfProceeds | UseOfProceeds |
YearsInBusiness | YearsInBusiness |
Informational questions:
Field | Type |
---|---|
BusinessName | String |
String | |
FirstName | String |
LastName | String |
Phone | String |
Relevant API Calls
- get-questions - Retrieve a flattened list of questions
- post-submission - Submit answers to questionnaire
- get-matches - Retrieve product matches for a submission
- post-match - Create a new lead for a matching product
Get Questions
In order to determine which questions you must gather to get matching Product
s, you can invoke this endpoint.
Specifications: GET /api/{referralpartner}/form/questions
Route Parameters
{referralpartner}
- [Required string] This is a specific, unique value provided by Connect that represents your organization.slug
- [Optional string] and references whichForm
you are utilizing, if this is your organizations’ default form, the querystring value should be omitted entirely.
Response
The response will be an array of Question
s. Each Question
has several properties, the most important properties of which are: id
and required
. Several other properties may appear on a question to indicate validation, custom language, or how to position the question on a screen, if applicable.
type Question = { // id of the question is also the property name of the answer in all other API calls id: string;
// If no value is provided, the C2C will assume this value defaultValue?: any | undefined;
// Validation isRequired?: boolean | undefined; minValue?: number | undefined; maxValue?: number | undefined;
// Form requires a full NAICS code in the `BusinessIndustry_NAICS` field requireFullNAICS?: boolean | undefined;
// Custom question type multi or single choice options isDropdown?: boolean | undefined; options?: QuestionOptionViewModel[] | undefined; none?: string | undefined;
// Display properties kind: QuestionType; isLabelAlwaysOn?: boolean | undefined; prefix?: string | undefined; postfix?: string | undefined; isDollar?: boolean | undefined; col?: number | undefined; colSpan?: number | undefined; label?: string | undefined; placeholder?: string | undefined;}
The response is an array of Question
s, which may look like the below JSON.
[ { "kind": "AmountRequested", "id": "AmountRequested", "col": 2, "isRequired": true }, { "kind": "UseOfProceeds", "id": "UseOfProceeds", "col": 2, "isRequired": true }, { "kind": "FinanceNeededBy", "id": "FinanceNeededBy", "col": 2, "isRequired": false }, { "kind": "BusinessName", "id": "BusinessName", "col": 2, "isRequired": true }, { "kind": "BusinessType", "id": "BusinessType", "col": 2, "isRequired": true }, { "kind": "BusinessIndustry", "id": "BusinessIndustry", "col": 2, "isRequired": true }, { "kind": "YearsInBusiness", "id": "YearsInBusiness", "col": 2, "isRequired": true }, { "kind": "BusinessAddress", "id": "BusinessAddress", "col": 2, "isRequired": true }, { "kind": "FirstName", "id": "FirstName", "col": 2, "isRequired": true }, { "kind": "LastName", "id": "LastName", "col": 3, "isRequired": true }, { "kind": "Email", "id": "Email", "col": 2, "colSpan": 2, "isRequired": true }, { "kind": "Phone", "id": "Phone", "col": 2, "colSpan": 2, "isRequired": true }, { "kind": "ContactMethod", "id": "ContactMethod", "col": 2, "colSpan": 2, "label": "How would you like to be contacted?", "isRequired": false, "isLabelAlwaysOn": true }, { "kind": "ContactTime", "id": "ContactTime", "col": 2, "colSpan": 2, "label": "What time do you prefer to be contacted?", "isRequired": false, "isLabelAlwaysOn": true }, { "kind": "RevenueLastYear", "id": "RevenueLastYear", "col": 2, "isRequired": true }, { "kind": "NetProfit", "id": "NetProfit", "col": 2, "isRequired": true, "defaultValue": 0 }, { "kind": "BusinessNumEmployees", "id": "BusinessNumEmployees", "col": 2, "label": "Number of full-time employees", "isRequired": false, "isLabelAlwaysOn": true }, { "kind": "PriorBankruptcies", "id": "PriorBankruptcies", "col": 2, "label": "Prior bankruptcies", "isRequired": true, "isLabelAlwaysOn": true }, { "kind": "Collateral", "id": "Collateral", "isRequired": true }, { "kind": "RevenueProjected", "id": "RevenueProjected", "col": 2, "isRequired": true }, { "kind": "HasBusinessPlan", "id": "HasBusinessPlan", "col": 2, "isRequired": true }, { "kind": "OwnerDemographics", "id": "OwnerDemographics", "isRequired": true }, { "kind": "CreditScore", "id": "CreditScore", "col": 2, "isRequired": true }]
Post Submission
Once all the answers to the required questions are known, whether by looking them up from an existing system or prompting the user with them, the Post Submission
endpoint can be invoked. The post submission endpoint expects a JSON object in the body
, with each required question’s id
as a property of the object. The order of the properties does not matter, so long as all the required questions without DefaultValue
s have been answered. Any values which do not correspond to Question
ids will be ignored.
Specifications: POST /api/{referralpartner}/form
Route Parameters
{referralpartner}
- [Required string] This is a specific, unique value provided by Connect that represents your organization.slug
- [Optional string] and references whichForm
you are utilizing, if this is your organizations’ default form, the querystring value should be omitted entirely.
Querystring Parameters
ipaddress
- Pass along the client’s IP address to help with fraud detection. This is optional, but highly recommended as it will assist in identifying potential fraudulent activity or spam. If this is not provided, Connect will mark your lead as ‘synthetic’, assuming the lead is trusted and skip fraud detection.
Body
{ "RequestedAmount": 75000, "UseOfProceeds": "WorkingCapital", "BusinessName": "Johns Plumbing Supplies", "BusinessType": "LLC", "BusinessIndustry": "InformationTechnology", "BusinessIndustry_NAICS": "541511", // only required if `requireFullNAICS` is true "YearsInBusiness": "ThreeOrMore", "BusinessAddress": { "Line1": "2122 Generic Ave N.", "City": "Minneapolis", "State": "Minnesota", "PostalCode": "55413" }, "FirstName": "John", "LastName": "Smith", "Email": "john.smith@johnsplumbingsupplies.com", "Phone": "123-456-7890", "RevenueLastYear": "_500000To1000000", "PriorBankruptcy": "None", "Collateral": [ "CommercialRealEstate", "ResidentialRealEstate" ], "RevenueProjected": "_500000To1000000", "HasBusinessPlan": true, "CreditScore": "_700Plus"}
Response
The response will be a 201 Created
status code, with a location
header containing a URL to the submission. This URL can be used to retrieve the matched products for the submission.
HTTP/1.1 201 CreatedLocation: /api/{referralpartner}/form/submissions/{submissionId}
Get matches
Once a submission has been created, it can be retrieved by invoking this endpoint. This endpoint is available indefinitely, but matchmaking will only be performed once — this functionality may change in the future. The matchmaking itself is actually performed when the submission is created, in post-submission, and this endpoint exists to retrieve the matchmaking results.
Specifications: /api/{referralpartner}/form/products
Response
The response will be an object with a property called products
, which contains the products matched, or an empty array.
type ProductResponse = { // The submission's unique id id: string;
// The products matched products: Product[]
// Additional resources which may be helpful to the applicant otherResources: AdditionalResource[]}
type Product = { // The product's unique id productId: string;
// Partner metadata partner: PartnerMetadata;
// Product details details: ProductDetail;}
type PartnerMetadata = { headquarters?: string | undefined; name?: string | undefined; description?: string | undefined; areasServed?: string | undefined; amountFinancedToDate?: number | undefined; smallBusinessesServed?: number | undefined; establishedYear?: number | undefined; languages?: string | undefined; website?: string | undefined;}
type ProductDetail = { // URL of the product or partner's logo productImage?: string | undefined;
// Name of the product name?: string | undefined;
// Kind of product (e.g. Loan) kind: ProductType;
// Terms of the loan product, when type = 'Loan' - OPTIONAL termsRange?: NumberRangeViewModel | undefined; interestRateRange?: NumberRangeViewModel | undefined; timeToFundRange?: NumberRangeViewModel | undefined; loanType?: LoanType | undefined; applicationFee?: FeeViewModel | undefined; originationFee?: FeeViewModel | undefined; collateralType: CollateralType; paymentFrequency?: PaymentFrequency | undefined; maxMoneyAmount: number | undefined;}
{ "products": [ { "productId": "1c7c521b-e6fe-43e5-aca5-f7f285d1722d", "details": { "productImage": "https://connect.crfusa.com/images/products/f7fde75f8cc84941888bef65de09eff9", "name": "My Small Business Loan", "kind": "Loan", "termsRange": { "min": 1, "max": 5, "unit": "Years" }, "interestRateRange": { "min": 6.75, "max": 9, "unit": "Fixed" }, "timeToFundRange": { "min": 15, "max": 30, "unit": "Days" }, "loanType": "TermLoan", "collateralType": "Secured", "paymentFrequency": "Monthly" }, "partner": { "name": "MyPartner", "headquarters": "Minneapolis, Minnesota", "partnerDescription": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris est justo, congue ut tempus quis, ullamcorper vitae tortor. Praesent vitae laoreet urna, in feugiat sapien. Nam sapien ligula, aliquam eget justo pretium, consectetur tincidunt tellus. Duis gravida lobortis nunc, eu faucibus felis commodo tincidunt.", "areasServed": "Minnesota", "amountFinancedToDate": 1000000, "smallBusinessesServed": 10000, "establishedYear": 1998, "languages": "English, Spanish" } } ]}
Apply Lead to Product
In order to generate a matching lead, the submission must now be linked with a product. This is done by invoking the Post Match
endpoint.
Specifications: POST /api/{referralpartner}/form/apply
Route Parameters
{referralpartner}
- [Required string] This is a specific, unique value provided by Connect that represents your organization.slug
- [Optional string] and references whichForm
you are utilizing, if this is your organizations’ default form, the querystring value should be omitted entirely.
Querystring Parameters
skipFraudCheck
- [Optional boolean]. If your system has already verified the user, the match will be created regardless of the outcome of Connect’s internal fraud detection.
Body
{ "submissionId": "e5fa496a-bf93-44a8-b0b0-7573dceace34", "productId": "544448ec-a3c7-4781-9781-5ae7e27dcc80"}
Response
The response will be an object containing contact information for the product’s service partner. It may also optionally include a formHandoff
which can be used to send a user directly into a product’s application system, see Form Handoff for more information.
type ApplyResult = { // Partner info partnerName?: string | undefined; website?: string | undefined;
// Contact information contactImage?: string | undefined; contactImageType: ProductContactImageType; contactName?: string | undefined; contactTitle?: string | undefined; contactEmail?: string | undefined; contactPhone?: string | undefined; contactAddress?: string | undefined; contactQuote?: string | undefined; contactAboutMe?: string | undefined; productId: string;
// Matching product details details: ProductDetail;
// Form handoff info formHandoff?: FormHandoff | undefined;}
type FormHandoff = { // URL to POST user to endpoint?: string | undefined;}
Example JSON
{ "partnerName": "MyPartner", "website": "https://www.mypartner.org/", "contactImage": "https://connect.crfusa.com/images/partners/918a07db8d7443d194beb9baff7201bc", "contactImageType": "Partner", "contactName": "Some Person", "contactTitle": "Loan Officer", "contactEmail": "contact@mypartner.org", "contactPhone": "612-100-4444", "contactAddress": "MyPartner\n123 E Somewhere Ave.\nSuite 100\nMinneapolis, MN 55411", "contactQuote": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "contactAboutMe": "Mauris est justo, congue ut tempus quis, ullamcorper vitae tortor.", "productId": "1c7c521b-e6fe-43e5-aca5-f7f285d1722d", "details": { "productImage": "https://connect.crfusa.com/images/products/f7fde75f8cc84941888bef65de09eff9", "productName": "My Small Business Loan", "kind": "Loan", "termsRange": { "low": 1, "high": 5, "unit": "Years" }, "interestRateRange": { "low": 6.75, "high": 9, "unit": "Fixed" }, "timeToFundRange": { "low": 15, "high": 30, "unit": "Days" }, "loanType": "TermLoan", "collateralType": "Secured", "paymentFrequency": "Monthly" }, "id": "83a7f974-f02b-456f-8978-9cf9621787fe"}
Address Object
The BusinessAddress
field should be provided as an object with the following properties:
Property | Type | Required | Description |
---|---|---|---|
Line1 | String | Yes | Street address, line 1 |
Line2 | String | No | Street address, line 2 (optional, e.g. suite or unit) |
City | String | Yes | City |
State | String | Yes | State or province |
PostalCode | String | Yes | Postal or ZIP code |
Example:
{ "Line1": "2122 Generic Ave N.", "Line2": "Suite 100", "City": "Minneapolis", "State": "Minnesota", "PostalCode": "55413"}
Enum Values
Collateral
CommercialRealEstate
: Commercial Real EstateResidentialRealEstate
: Residential Real EstateInventory
: InventoryAccountsReceivable
: Accounts ReceivableCash
: CashInvestmentAccounts
: Investment AccountsNewEquipmentMachinery
: New Equipment/MachineryFurnitureAndFixtures
: Furniture and FixturesVehicles
: VehiclesUsedEquipmentMachinery
: Used Equipment/MachineryVacantLand
: Vacant LandLeaseholdImprovements
: Leasehold ImprovementsOther
: Other
UseOfProceeds
WorkingCapital
: Working CapitalStartABusiness
: Start a BusinessAcquireABusiness
: Acquire a BusinessPurchaseInventory
: Purchase InventoryPurchaseMachineryOrEquipment
: Purchase Machinery or EquipmentMakeBuildingImprovements
: Make Building ImprovementsBuildingAcquisition
: Building AcquisitionRefinanceExistingDebt
: Refinance Existing DebtOther
: Other
BusinessType
SoleProprietorship
: Sole ProprietorshipLLC
: LLCCorporation
: CorporationNonProfit
: Non-ProfitOther
: Other
YearsInBusiness
Startup
: StartupLessThanOne
: Less Than One YearOneToTwo
: One to Two YearsTwoToThree
: Two to Three YearsThreeOrMore
: Three or More Years
PriorBankruptcies
None
: None_1Prior
: 1 Prior_2OrMore
: 2 or More
CreditScores
_700Plus
: 700+_660To699
: 660–699_640To659
: 640–659_620To639
: 620–639_580To619
: 580–619Below580
: Below 580
Revenues
LessThan100000
: Less Than $100,000_100000To250000
: $100,000–$250,000_250000To500000
: $250,000–$500,000_500000To1000000
: $500,000–$1,000,000_1000000To5000000
: $1,000,000–$5,000,000MoreThan5000000
: More Than $5,000,000
Industries
AccomodationAndFoodService
: Accommodation and Food ServiceAgriculture
: AgricultureBusinessServices
: Business ServicesConstruction
: ConstructionDentistsPhysicians
: Dentists/PhysiciansEducationalServices
: Educational ServicesFinanceAndInsurance
: Finance and InsuranceGasStationsAndConvenienceStores
: Gas Stations and Convenience StoresHealthcareAndSocialAssistance
: Healthcare and Social AssistanceHotels
: HotelsInformationTechnology
: Information TechnologyLandlord
: LandlordManufacturing
: ManufacturingMining
: MiningProfessionalServices
: Professional ServicesRealEstate
: Real EstateRestaurant
: RestaurantRetail
: RetailTransportationAndWarehousing
: Transportation and WarehousingUtilities
: UtilitiesWasteManagement
: Waste ManagementWholesaleTrade
: Wholesale TradeOther
: Other
BusinessServices
Accounting
: AccountingBusinessPlan
: Business PlanBuyOrSellABusiness
: Buy or Sell a BusinessCashFlowManagement
: Cash Flow ManagementCompanyFormation
: Company FormationCustomerRelations
: Customer RelationsCreditCounseling
: Credit CounselingFinancingOrCapital
: Financing or CapitalFranchising
: FranchisingGovernmentContracting
: Government ContractingHumanResourcesAndManagement
: Human Resources and ManagementInternationalTrade
: International TradeLegalIssues
: Legal IssuesMarketingOrSales
: Marketing or SalesPrivateSectorProcurement
: Private Sector ProcurementTaxPlanning
: Tax PlanningTechnologyAndECommerce
: Technology and E-Commerce
OwnershipDemographics
Women
: WomenVeteran
: VeteranLGBTQ
: LGBTQBlackAfricanAmerican
: Black/African AmericanAsian
: AsianLatinx
: LatinxMiddleEastNorthAfrican
: Middle East/North AfricanNativeAmerican
: Native AmericanAlaskanNative
: Alaskan NativeNativeHawaiian
: Native HawaiianPacificIslander
: Pacific IslanderMixedrace
: Mixed RaceDisabled
: DisabledOther
: Other
ContactMethods
Email
: EmailPhone
: Phone
ContactTime
Morning
: MorningAfternoon
: AfternoonEvening
: Evening
FinanceNeededBy
Today
: TodayInNextTwoWeeks
: In Next Two WeeksInNextTwoMonths
: In Next Two MonthsMultipleOptions
: Multiple Options