> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.finput.com.au/api/endpoints/approval-matrix/matrix/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.finput.com.au/_mcp/server. # Find where a deal can be approved POST https://api.finput.com.au/api/v1/matrix/ Content-Type: application/json Evaluates a deal against every financier's approval criteria and returns the approvals that are not ruled out, grouped by financier. Only `cost` and `asset_value` are required. Every other field is a criterion, and the three outcomes are: - **confirmed** — every criterion the approval checks was supplied and satisfied. - **possible** — a checked criterion had no input. The approval is still returned, with the outstanding answers in `missing_fields`. A blank input is never a violation. - **dropped** — a supplied input violates a criterion. The approval is omitted from the response entirely. A criterion left blank on the *approval* is not checked at all and can never disqualify a deal. Requires the `matrix.enabled` entitlement (Pro and above), and `surfaces.matrix` on `GET /api/v1/feature-flags` to be `available`. Runs are metered against the same daily allowance whether they come from a session or an API token. Reference: https://docs.finput.com.au/api/endpoints/approval-matrix/matrix ## Authentication - `Authorization` header (bearer token, required) — JWT access token obtained from `POST /api/v1/auth/login`, or a `finput_sk_...` API token ## Request ### Headers - `X-Finput-Client` (enum, optional) — Which client is asking, so every `message` in the response is worded for it. `ios` and `android` get sentences that state a fact and nothing more: no plan, no price, no link. Absent means `web`, which keeps its existing wording. An unrecognised value is treated like `ios` and `android`. - Allowed values: `web`, `ios`, `android` ### Body (application/json) This endpoint expects a MatrixRequest. - `cost` (string, required) — Asset cost. Compared GST-inclusive against an approval's `min_asset_cost` / `max_asset_cost`. A negative cost is rejected. - `asset_value` (integer, required) — Asset ID from `GET /api/v1/assets/search`. - `cost_gst` (boolean, optional, default: false) — Whether `cost` already includes GST. - `abn_age` (integer, optional, nullable) — ABN age (months). - `gst_age` (integer, optional, nullable) — GST registration age (months). - `asset_age` (integer, optional, nullable) — Asset age (months). Derived from `year_model` when that is sent instead. - `term` (integer, optional, nullable) — Requested term in months, matching the calculator's payload. Optional here where the calculator requires it: a repayment cannot be computed without a term, but a destination can still be found. Omitting it returns approvals that bound the term as `possible`, with `term` listed in `missing_fields`. - `year_model` (integer, optional, nullable) — Build year, used to derive `asset_age`. - `borrower_age_youngest` (integer, optional, nullable) — Youngest borrower's age (years). Tested against the approval's minimum — every borrower has to sit inside the band. - `borrower_age_oldest` (integer, optional, nullable) — Oldest borrower's age (years), tested against the maximum. A single-borrower deal can send `borrower_age` instead and the API mirrors it into both ends. - `borrower_age` (integer, optional, nullable) — Shorthand for a single-borrower deal. - `file_age` (integer, optional, nullable) — Age of the borrower's **credit file**, in months — not the deal file. Months to match every other age criterion on the form (ABN age, GST age, asset age); it was days until the unit was unified. - `credit_score` (integer, optional, nullable) — The borrower's credit score. A different criterion from `file_age`: this is the score, that is how long the file has existed, and an approval can gate on either or both. - `industry` (string, optional, nullable) — ANZSIC division. See `GET /api/v1/approvals/options`. - `asset_state` (enum, optional) - Allowed values: `none`, `new`, `used`, `demo` - `transaction_type` (enum, optional) - Allowed values: `purchase`, `refinance`, `sale_hire_back`, `capital_raise` - `home_owner` (boolean, optional, nullable) - `private_sale` (boolean, optional, nullable) - `sale_hire_back` (boolean, optional, nullable) - `preferred_financier` (list of integer, optional) — Restrict results to these organisation (financier) IDs. ## Response ### 200 Approvals grouped by financier - `financiers` (list of MatrixFinancierGroup, optional) ## Errors ### 400 Bad Request Error Invalid input (e.g. a negative cost, or a missing asset) - `error` (string, optional) - `errors` (map from string to list of string, optional) ### 403 Forbidden Error Matrix is not on this account (`entitlement_required`) or the feature is off (`feature_disabled`). - `error` (enum, required) - Allowed values: `feature_disabled`, `entitlement_required` - `detail` (string, required) — The sentence this endpoint sent before `message` existed. The same as `message` for `ios` and `android`; kept for the web. - `message` (string, optional) — Sent with `entitlement_required`: why, worded for the client named in `X-Finput-Client`. - `entitlement` (string, optional) — Sent with `entitlement_required`. ### 429 Too Many Requests Error The daily Matrix allowance is spent. - `error` (enum, required) - Allowed values: `cap_hit` - `detail` (string, required) — The sentence this endpoint sent before `message` existed. The same as `message` for `ios` and `android`; kept for the web. - `message` (string, required) — What happened, worded for the client named in `X-Finput-Client`. Show this rather than composing a sentence from the other fields. - `limit` (integer, required) - `used` (integer, required) - `metric` (enum, optional) — Which allowance ran out. Sent by `/matrix-calculator/`, which spends both. - Allowed values: `calculator`, `matrix` ## Types ### MatrixFinancierGroup - `organisation_id` (integer, optional) - `organisation_name` (string, optional) - `approvals` (list of MatrixApprovalResult, optional) ### MatrixApprovalResult One approval that was not ruled out. Approvals whose criteria the deal violates are omitted entirely rather than returned as a rejection. - `approval_id` (integer, optional) - `approval_name` (string, optional) - `doc_level` (enum, optional) — Documentation burden. Results sort least-onerous first. - Allowed values: `low_doc`, `lite_doc`, `full_doc` - `status` (enum, optional) — `confirmed` — every criterion the approval checks was supplied and satisfied. `possible` — a checked criterion had no input, so it could still qualify once that answer is known. A blank input is never treated as a violation. - Allowed values: `confirmed`, `possible` - `missing_fields` (list of string, optional) — Request fields that would need answering to move this row from `possible` to `confirmed`. - `deposit_percentage` (float, optional, nullable) - `deposit_amount` (float, optional, nullable) - `deposit_required` (float, optional, nullable) — Deposit this deal needs, resolved from the two fields above. - `max_term` (integer, optional, nullable) — Longest term (months) this approval will write. Also bounds a supplied `term`, so an approval capped below the requested term is dropped rather than returned. - `rate_bracket_ids` (list of integer, optional) — Rate brackets linked to this approval. ## Examples **Request** ```json { "cost": "100000", "asset_value": 42, "cost_gst": false, "abn_age": 36, "gst_age": 24, "borrower_age_youngest": 32, "borrower_age_oldest": 58, "file_age": 36, "credit_score": 720, "asset_state": "used", "transaction_type": "purchase", "home_owner": true } ``` **Response** ```json { "financiers": [ { "organisation_id": 1, "organisation_name": "Dynamoney", "approvals": [ { "approval_id": 1, "approval_name": "Low doc to $150k, property owner", "doc_level": "low_doc", "status": "confirmed", "missing_fields": [ "credit_score" ], "deposit_percentage": 1.1, "deposit_amount": 1.1, "deposit_required": 1.1, "max_term": 1, "rate_bracket_ids": [ 1 ] } ] } ] } ``` **SDK Code** ```python Approval Matrix_matrix_example import requests url = "https://api.finput.com.au/api/v1/matrix/" payload = { "cost": "100000", "asset_value": 42, "cost_gst": False, "abn_age": 36, "gst_age": 24, "borrower_age_youngest": 32, "borrower_age_oldest": 58, "file_age": 36, "credit_score": 720, "asset_state": "used", "transaction_type": "purchase", "home_owner": True } headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript Approval Matrix_matrix_example const url = 'https://api.finput.com.au/api/v1/matrix/'; const options = { method: 'POST', headers: {Authorization: 'Bearer ', 'Content-Type': 'application/json'}, body: '{"cost":"100000","asset_value":42,"cost_gst":false,"abn_age":36,"gst_age":24,"borrower_age_youngest":32,"borrower_age_oldest":58,"file_age":36,"credit_score":720,"asset_state":"used","transaction_type":"purchase","home_owner":true}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Approval Matrix_matrix_example package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.finput.com.au/api/v1/matrix/" payload := strings.NewReader("{\n \"cost\": \"100000\",\n \"asset_value\": 42,\n \"cost_gst\": false,\n \"abn_age\": 36,\n \"gst_age\": 24,\n \"borrower_age_youngest\": 32,\n \"borrower_age_oldest\": 58,\n \"file_age\": 36,\n \"credit_score\": 720,\n \"asset_state\": \"used\",\n \"transaction_type\": \"purchase\",\n \"home_owner\": true\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Approval Matrix_matrix_example require 'uri' require 'net/http' url = URI("https://api.finput.com.au/api/v1/matrix/") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"cost\": \"100000\",\n \"asset_value\": 42,\n \"cost_gst\": false,\n \"abn_age\": 36,\n \"gst_age\": 24,\n \"borrower_age_youngest\": 32,\n \"borrower_age_oldest\": 58,\n \"file_age\": 36,\n \"credit_score\": 720,\n \"asset_state\": \"used\",\n \"transaction_type\": \"purchase\",\n \"home_owner\": true\n}" response = http.request(request) puts response.read_body ``` ```java Approval Matrix_matrix_example import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.finput.com.au/api/v1/matrix/") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"cost\": \"100000\",\n \"asset_value\": 42,\n \"cost_gst\": false,\n \"abn_age\": 36,\n \"gst_age\": 24,\n \"borrower_age_youngest\": 32,\n \"borrower_age_oldest\": 58,\n \"file_age\": 36,\n \"credit_score\": 720,\n \"asset_state\": \"used\",\n \"transaction_type\": \"purchase\",\n \"home_owner\": true\n}") .asString(); ``` ```php Approval Matrix_matrix_example request('POST', 'https://api.finput.com.au/api/v1/matrix/', [ 'body' => '{ "cost": "100000", "asset_value": 42, "cost_gst": false, "abn_age": 36, "gst_age": 24, "borrower_age_youngest": 32, "borrower_age_oldest": 58, "file_age": 36, "credit_score": 720, "asset_state": "used", "transaction_type": "purchase", "home_owner": true }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp Approval Matrix_matrix_example using RestSharp; var client = new RestClient("https://api.finput.com.au/api/v1/matrix/"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"cost\": \"100000\",\n \"asset_value\": 42,\n \"cost_gst\": false,\n \"abn_age\": 36,\n \"gst_age\": 24,\n \"borrower_age_youngest\": 32,\n \"borrower_age_oldest\": 58,\n \"file_age\": 36,\n \"credit_score\": 720,\n \"asset_state\": \"used\",\n \"transaction_type\": \"purchase\",\n \"home_owner\": true\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Approval Matrix_matrix_example import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = [ "cost": "100000", "asset_value": 42, "cost_gst": false, "abn_age": 36, "gst_age": 24, "borrower_age_youngest": 32, "borrower_age_oldest": 58, "file_age": 36, "credit_score": 720, "asset_state": "used", "transaction_type": "purchase", "home_owner": true ] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.finput.com.au/api/v1/matrix/")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```