> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skortorent.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 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.




## OpenAPI

````yaml /api-reference/openapi.yaml get /applications/{applicationId}/decision-engine
openapi: 3.1.0
info:
  title: SKOR Modular API
  version: 1.0.0
  description: >
    ## Overview

    This is the SKOR Modular API v1. It provides access to tenant

    workflows, API keys, webhooks, document processing, identity

    verification, banking connectivity, and forensic analysis.


    ## Error Statuses


    The API uses standard HTTP status codes to indicate the success

    or failure of requests. Each error response provides guidance

    to help identify the issue and take corrective action.


    ### Success — `200 OK`

    The request was processed successfully and the expected response

    data is returned.


    ### Validation Error — `400 Bad Request`

    The request is invalid due to missing, malformed, or incorrect

    parameters.


    **Common causes:**

    - Required fields are missing from the request.

    - Invalid data formats or unsupported values are provided.

    - File size or payload limits are exceeded.


    **How to resolve:**

    - Verify all required parameters are present.

    - Ensure the request payload matches the documented schema.

    - Validate data formats and constraints before retrying.


    ### Unauthorized — `401 Unauthorized`

    Authentication failed or the provided token is missing or invalid.


    **Common causes:**

    - The `Authorization` header is missing.

    - An invalid or expired bearer token is provided.


    **How to resolve:**

    - Ensure the token is included in the request as an `Authorization: Bearer
    <token>` header.

    - Verify the token is valid and has not expired.

    - Generate a new token if required.


    ### Not Found — `404 Not Found`

    The requested resource does not exist or is not accessible.


    **Common causes:**

    - An invalid or non-existent resource identifier.

    - The resource has not been created or has been deleted.


    **How to resolve:**

    - Confirm the resource identifier is correct.

    - Ensure the resource exists before accessing it.


    ### Server Error — `500 Internal Server Error`

    An unexpected error occurred on the server while processing the request.


    **How to resolve:**

    - Retry the request after a short delay.

    - If the issue persists, **[contact us](mailto:info@skortorent.com)** with
    relevant request details.


    ### Need Help?

    If you encounter unexpected behavior,

    please **[contact us](mailto:info@skortorent.com)** for assistance.
servers:
  - url: https://api.skortorent.com/api/v1
    description: Live
  - url: https://dev-api.skortorent.com/api/v1
    description: Sandbox
security:
  - BearerAuth: []
paths:
  /applications/{applicationId}/decision-engine:
    get:
      tags:
        - Applications
      summary: Calculate application decision
      description: >
        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.
      operationId: getApplicationDecisionEngine
      parameters:
        - name: applicationId
          in: path
          required: true
          description: Application owned by your API key.
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
        - name: propertyId
          in: query
          required: true
          description: >-
            Linked active property owned by the key’s landlord. Its report_rent
            supplies the monthly rent.
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
        - name: workspaceId
          in: query
          required: false
          description: >-
            Authorized workspace Mongo ObjectId. Required when the
            property/shared-profile context has multiple authorized workspaces.
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
      responses:
        '200':
          description: Decision engine calculation completed
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - success
                  message:
                    type: string
                  data:
                    $ref: '#/components/schemas/ApplicationDecisionEngineResult'
              example:
                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: []
        '400':
          description: >-
            Missing or malformed IDs, ambiguous workspace, or workspace outside
            the authorized property/shared-profile context.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - error
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties: true
                    description: >-
                      Optional diagnostics such as code, field, workspaceIds or
                      excludedParticipants. Error diagnostics retain their
                      existing keys.
        '401':
          description: Missing, invalid or expired modular bearer token.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - error
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties: true
                    description: >-
                      Optional diagnostics such as code, field, workspaceIds or
                      excludedParticipants. Error diagnostics retain their
                      existing keys.
        '403':
          description: The API key is not linked to a landlord.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - error
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties: true
                    description: >-
                      Optional diagnostics such as code, field, workspaceIds or
                      excludedParticipants. Error diagnostics retain their
                      existing keys.
        '404':
          description: >-
            Application or active property is inaccessible, or the application
            is not linked to the property for this landlord.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - error
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties: true
                    description: >-
                      Optional diagnostics such as code, field, workspaceIds or
                      excludedParticipants. Error diagnostics retain their
                      existing keys.
        '422':
          description: >-
            No eligible participants, missing/nonpositive report_rent, or
            missing/invalid scoring configuration.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - error
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties: true
                    description: >-
                      Optional diagnostics such as code, field, workspaceIds or
                      excludedParticipants. Error diagnostics retain their
                      existing keys.
        '500':
          description: >-
            A required data lookup or calculation failed. No partial verdict is
            returned.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - error
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties: true
                    description: >-
                      Optional diagnostics such as code, field, workspaceIds or
                      excludedParticipants. Error diagnostics retain their
                      existing keys.
components:
  schemas:
    ApplicationDecisionEngineResult:
      type: object
      properties:
        application_id:
          type: string
        property_id:
          type: string
        workspace_id:
          type: string
        shared_profile_id:
          type: string
        rent:
          type: number
          description: Saved positive property report_rent, in EUR per month.
        calculated_at:
          type: string
          format: date-time
        engine:
          type: string
          enum:
            - DECISION
        income:
          type: object
          properties:
            tenants:
              type: number
            guarantors:
              type: number
            combined:
              type: number
        household_effort_rate:
          type: number
        aggregation_strategy:
          type: string
          enum:
            - MIN
            - MAX
            - MEAN
        aggregated_pillars:
          type: object
          additionalProperties:
            type: number
        is_hard_fail:
          type: boolean
        final_score:
          type: number
          description: >-
            Case score. A hard failure sets this to zero even though diagnostic
            applicant scores remain available.
        applicant_count:
          type: integer
        decision:
          type: string
          enum:
            - Approved
            - Conditional
            - Rejected
        recommendation:
          type: array
          items:
            type: string
        recommendation_flags:
          type: object
          properties:
            add_guarantor:
              type: boolean
            add_more_guarantor:
              type: boolean
            buy_insurance:
              type: boolean
            complete_profile:
              type: boolean
        recommendation_codes:
          type: array
          items:
            type: string
          description: >-
            Recommendation codes, such as HARD_FAIL, SCORE_BELOW_THRESHOLD,
            addGuarantor or buyInsurance.
        applicants:
          type: array
          items:
            $ref: '#/components/schemas/DecisionEngineApplicant'
    DecisionEngineApplicant:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        role:
          type: string
          enum:
            - tenant
            - guarantor
        declared_role:
          type: string
          description: >-
            Application participant role. Omitted for linked guarantor entries.
            The frontend calculation treats application participants as tenants
            regardless of this declared role.
        income:
          $ref: '#/components/schemas/DecisionEngineIncome'
        effort_rate:
          type: number
          description: >-
            Household effort rate for tenants; individual guarantor income
            against full property rent for guarantors.
        effort_rate_type:
          type: string
          enum:
            - tenant
            - guarantor
            - both
          description: >-
            Income inclusion setting for application participants; omitted for
            linked guarantors.
        policy_inputs:
          type: object
          additionalProperties: true
          description: >-
            Extracted policy inputs used to calculate applicant scores. Missing
            numeric inputs may be null.
        sub_scores:
          type: object
          additionalProperties:
            type: object
            properties:
              score:
                type: number
              label:
                type: string
          description: Subscore keys such as EFFORT_RATE_SCORE remain uppercase.
        pillars:
          type: object
          additionalProperties:
            type: number
          description: Pillar keys such as INCOME_AFFORDABILITY remain uppercase.
        final_score:
          type: number
        is_hard_fail:
          type: boolean
        hard_fails:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
              reason_code:
                type: string
              description:
                type: string
        missing_documents:
          type: array
          items:
            type: string
    DecisionEngineIncome:
      type: object
      properties:
        amount:
          type: number
          description: >-
            Monthly income in EUR after source selection and averaging or
            summing.
        sources:
          type: array
          items:
            type: string
        source_mode:
          type: string
          description: Saved income-source mode, defaulting to avg.
        source_amounts:
          type: array
          items:
            type: object
            properties:
              source:
                type: string
              amount:
                type: number
          description: Monthly EUR amounts for selected sources before averaging.
        payslip_ids:
          type: array
          items:
            type: string
        payslip_fields:
          type: array
          items:
            type: string
        tax_ids:
          type: array
          items:
            type: string
        other_income_ids:
          type: array
          items:
            type: string
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: |
        HTTP Bearer Authentication. Generate a shared token via
        `/authenticate/token`, then pass it as `Authorization: Bearer <token>`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.