curl --request GET \
--url https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Decision engine calculation completed",
"data": {
"application_id": "100000000000000000000001",
"property_id": "200000000000000000000001",
"workspace_id": "500000000000000000000001",
"shared_profile_id": "700000000000000000000001",
"rent": 900,
"calculated_at": "2026-10-26T12:00:00.000Z",
"engine": "DECISION",
"income": {
"tenants": 3000,
"guarantors": 0,
"combined": 3000
},
"household_effort_rate": 30,
"aggregation_strategy": "MIN",
"aggregated_pillars": {
"INCOME_AFFORDABILITY": 95,
"EMPLOYMENT_STABILITY": 87.5,
"FINANCIAL_BEHAVIOUR": 52,
"CREDIT_DEFAULT_RISK": 90,
"DOCUMENTATION_STRENGTH": 90
},
"is_hard_fail": false,
"final_score": 82.9,
"applicant_count": 1,
"decision": "Approved",
"recommendation": [],
"recommendation_flags": {
"add_guarantor": false,
"add_more_guarantor": false,
"buy_insurance": false,
"complete_profile": false
},
"recommendation_codes": [],
"applicants": [
{
"id": "600000000000000000000001",
"name": "Synthetic tenant",
"role": "tenant",
"declared_role": "tenant",
"income": {
"source_amounts": [
{
"source": "bank",
"amount": 3000
}
],
"amount": 3000,
"sources": [
"bank"
],
"source_mode": "avg",
"payslip_ids": [],
"payslip_fields": [],
"tax_ids": [],
"other_income_ids": []
},
"effort_rate": 30,
"effort_rate_type": "tenant",
"policy_inputs": {
"kyc_aml_fail_check": {},
"TENURE": 24,
"EMPLOYMENT_PREDICTABILITY": "stable",
"INCOME_CONSISTENCY": 81.82,
"INCOME_VERIFICATION": [
{
"source": "Bank Connection",
"amount": 3000,
"verified": true
},
{
"source": "Self-declared",
"amount": 30000,
"verified": false
}
],
"EFFORT_RATE_SCORE": 30,
"FINANCIAL_SKOR": 70,
"BANK_BEHAVIOUR": null,
"RENT_PAYMENT_BEHAVIOUR": 0,
"DEFAULT_HISTORY": "No defaults ever",
"RISK_MITIGATION_SUB_SCORE": "Eligible but not taken",
"DOCUMENTATION": 0,
"FORENSICS": null,
"MISSING_DOCS": []
},
"sub_scores": {
"EFFORT_RATE_SCORE": {
"score": 95,
"label": "Low"
},
"TENURE": {
"score": 90,
"label": "Low"
},
"INCOME_CONSISTENCY": {
"score": 20,
"label": "High"
},
"FINANCIAL_SKOR": {
"score": 20,
"label": "High"
},
"DOCUMENTATION": {
"score": 90,
"label": "Low"
},
"BANK_BEHAVIOUR": {
"score": 30,
"label": "No data"
},
"FORENSICS": {
"score": 30,
"label": "No data"
},
"RENT_PAYMENT_BEHAVIOUR": {
"score": 90,
"label": "Low"
},
"EMPLOYMENT_PREDICTABILITY": {
"score": 85,
"label": "Stable"
},
"INCOME_VERIFICATION": {
"score": 74,
"label": "Bank Connection & Self-declared"
},
"RISK_MITIGATION_SUB_SCORE": {
"score": 80,
"label": "Eligible but not taken"
},
"DEFAULT_HISTORY": {
"score": 90,
"label": "No defaults ever"
}
},
"pillars": {
"INCOME_AFFORDABILITY": 95,
"EMPLOYMENT_STABILITY": 87.5,
"FINANCIAL_BEHAVIOUR": 52,
"CREDIT_DEFAULT_RISK": 90,
"DOCUMENTATION_STRENGTH": 90
},
"final_score": 82.9,
"is_hard_fail": false,
"hard_fails": [],
"missing_documents": []
}
]
}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}Calculate application decision
Calculate the decision-engine result for an application and its linked property using current saved profiles, income selections, rent and policy settings.
Returns income, effort rates, applicant scores, aggregated pillars, hard-fail reasons, recommendations and the final verdict. Includes accepted participants with existing profiles and their linked guarantors.
This read-only endpoint requires access through your modular API key and does not save the result.
curl --request GET \
--url https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skortorent.com/api/v1/applications/{applicationId}/decision-engine")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "Decision engine calculation completed",
"data": {
"application_id": "100000000000000000000001",
"property_id": "200000000000000000000001",
"workspace_id": "500000000000000000000001",
"shared_profile_id": "700000000000000000000001",
"rent": 900,
"calculated_at": "2026-10-26T12:00:00.000Z",
"engine": "DECISION",
"income": {
"tenants": 3000,
"guarantors": 0,
"combined": 3000
},
"household_effort_rate": 30,
"aggregation_strategy": "MIN",
"aggregated_pillars": {
"INCOME_AFFORDABILITY": 95,
"EMPLOYMENT_STABILITY": 87.5,
"FINANCIAL_BEHAVIOUR": 52,
"CREDIT_DEFAULT_RISK": 90,
"DOCUMENTATION_STRENGTH": 90
},
"is_hard_fail": false,
"final_score": 82.9,
"applicant_count": 1,
"decision": "Approved",
"recommendation": [],
"recommendation_flags": {
"add_guarantor": false,
"add_more_guarantor": false,
"buy_insurance": false,
"complete_profile": false
},
"recommendation_codes": [],
"applicants": [
{
"id": "600000000000000000000001",
"name": "Synthetic tenant",
"role": "tenant",
"declared_role": "tenant",
"income": {
"source_amounts": [
{
"source": "bank",
"amount": 3000
}
],
"amount": 3000,
"sources": [
"bank"
],
"source_mode": "avg",
"payslip_ids": [],
"payslip_fields": [],
"tax_ids": [],
"other_income_ids": []
},
"effort_rate": 30,
"effort_rate_type": "tenant",
"policy_inputs": {
"kyc_aml_fail_check": {},
"TENURE": 24,
"EMPLOYMENT_PREDICTABILITY": "stable",
"INCOME_CONSISTENCY": 81.82,
"INCOME_VERIFICATION": [
{
"source": "Bank Connection",
"amount": 3000,
"verified": true
},
{
"source": "Self-declared",
"amount": 30000,
"verified": false
}
],
"EFFORT_RATE_SCORE": 30,
"FINANCIAL_SKOR": 70,
"BANK_BEHAVIOUR": null,
"RENT_PAYMENT_BEHAVIOUR": 0,
"DEFAULT_HISTORY": "No defaults ever",
"RISK_MITIGATION_SUB_SCORE": "Eligible but not taken",
"DOCUMENTATION": 0,
"FORENSICS": null,
"MISSING_DOCS": []
},
"sub_scores": {
"EFFORT_RATE_SCORE": {
"score": 95,
"label": "Low"
},
"TENURE": {
"score": 90,
"label": "Low"
},
"INCOME_CONSISTENCY": {
"score": 20,
"label": "High"
},
"FINANCIAL_SKOR": {
"score": 20,
"label": "High"
},
"DOCUMENTATION": {
"score": 90,
"label": "Low"
},
"BANK_BEHAVIOUR": {
"score": 30,
"label": "No data"
},
"FORENSICS": {
"score": 30,
"label": "No data"
},
"RENT_PAYMENT_BEHAVIOUR": {
"score": 90,
"label": "Low"
},
"EMPLOYMENT_PREDICTABILITY": {
"score": 85,
"label": "Stable"
},
"INCOME_VERIFICATION": {
"score": 74,
"label": "Bank Connection & Self-declared"
},
"RISK_MITIGATION_SUB_SCORE": {
"score": 80,
"label": "Eligible but not taken"
},
"DEFAULT_HISTORY": {
"score": 90,
"label": "No defaults ever"
}
},
"pillars": {
"INCOME_AFFORDABILITY": 95,
"EMPLOYMENT_STABILITY": 87.5,
"FINANCIAL_BEHAVIOUR": 52,
"CREDIT_DEFAULT_RISK": 90,
"DOCUMENTATION_STRENGTH": 90
},
"final_score": 82.9,
"is_hard_fail": false,
"hard_fails": [],
"missing_documents": []
}
]
}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}{
"status": "error",
"message": "<string>",
"errors": {}
}Authorizations
HTTP Bearer Authentication. Generate a shared token via
/authenticate/token, then pass it as Authorization: Bearer <token>.
Path Parameters
Application owned by your API key.
^[a-fA-F0-9]{24}$Query Parameters
Linked active property owned by the key’s landlord. Its report_rent supplies the monthly rent.
^[a-fA-F0-9]{24}$Authorized workspace Mongo ObjectId. Required when the property/shared-profile context has multiple authorized workspaces.
^[a-fA-F0-9]{24}$