> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.middesk.com/api-reference/risk-assessments/get-latest-risk-assessment/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.middesk.com/_mcp/server. # Retrieve the latest scored risk assessment for a business GET https://api.middesk.com/v1/businesses/{business_id}/risk_assessments/latest Reference: https://docs.middesk.com/api-reference/risk-assessments/get-latest-risk-assessment ## Authentication - `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, where token is your auth token. ## Request ### Path parameters - `business_id` (string, required) — Business ID ## Response ### 200 latest risk assessment - `business_snapshot_url` (string, required, nullable) — URL of the business as of this assessment's order (`GET /businesses/{id}?order_id={order_id}`), resolving to the per-order snapshot to compare against the assessment's results. Null for assessments not tied to an order. - `created_at` (datetime, required) - `description_markdown` (string, required, nullable) — Narrative explanation of the assessment, in CommonMark markdown. Null on assessments recorded before markdown narratives shipped. - `dimensions` (list of RiskDimension, required) — Per-dimension risk scores with their top contributing factors. - `id` (string, required) - `level` (enum, required) — Categorical risk verdict. `not_available` means a Risk order ran but could not produce a conclusive verdict. New values are not expected; `level` is a closed set. - Allowed values: `low`, `moderate`, `high`, `not_available` - `object` (enum, required) - Allowed values: `risk_assessment` - `order_id` (string, required, nullable) — The order this assessment was produced against — the snapshot coordinate. Fetch the business as of this order with `GET /businesses/{id}?order_id={order_id}` to compare the assessment against the underlying record. Null for assessments not tied to an order. - `score` (integer, required, nullable) — Overall risk score from 0 (lowest risk) to 100 (highest risk); `level` is banded from it. Null when the assessment could not be scored. Note the scale — the top-level score is a 0–100 integer, while nested dimension and identifier-assessment scores are 0–1 floats. - `title` (string, required, nullable) — One-line headline synthesizing the assessment. Null on assessments produced before titles shipped. ## Errors ### 403 Get Latest Risk Assessment Request Forbidden Error account is not entitled to risk - `errors` (list of ErrorResponseErrorsItem, required) ### 404 Get Latest Risk Assessment Request Not Found Error no risk assessment for this business - `errors` (list of ErrorResponseErrorsItem, required) ## Types ### RiskDimension A score for one dimension of merchant risk, with the measured facts that contributed most to it. - `object` (enum, required) - Allowed values: `risk_dimension` - `type` (string, required) — The dimension of risk being scored (e.g. `transaction_laundering`, `reputational`). Not a closed set — new dimensions may be added, so clients should tolerate unknown values. - `score` (double, required) — Dimension risk score from 0 (lowest risk) to 1 (highest risk). Unlike the assessment's top-level 0–100 integer `score`, nested scores are 0–1 floats. - `level` (enum, required) — Categorical band of this dimension's `score`, on the same scale as the assessment's `level`. - Allowed values: `low`, `moderate`, `high`, `not_available` - `top_factors` (list of RiskDimensionTopFactorsItem, required) — The measured facts that contributed most to this dimension's score, ranked by absolute contribution. Factor names are stable snake_case identifiers from a broader vocabulary than identifier-assessment attributes: website-content facts (e.g. `website_has_no_refund_language`) appear alongside identifier facts (e.g. `url_domain_parked`). Not a closed set. ### ErrorResponseErrorsItem - `message` (string, required) - `parameter` (string, optional) — Request parameter associated with the error, when applicable ### RiskDimensionTopFactorsItem - `name` (string, required) — Stable factor name (e.g. `website_has_no_refund_language`, `url_domain_parked`). - `type` (string, required) — JSON type of `value`. Typically `boolean`, `integer`, or `double`; not a closed set. - `value` (any, required) - `contribution` (double, required) — Signed share of this factor's contribution to the dimension score; larger absolute values contributed more. ## Examples **Response** ```json { "business_snapshot_url": "https://api.middesk.com/v1/businesses/0793f2a2-e315-4b6a-9f0c-2d1e3c4b5a69?order_id=a58a4f4e-7f3b-4c8e-9d2a-1b0c9d8e7f6a", "created_at": "2026-07-21T18:03:11Z", "description_markdown": "Acme Home Goods presents as a small home furnishings retailer, but its storefront shows several traits common to laundering fronts.\n\n- The checkout flow displays no-refund language ([acmehomegoods.com/checkout](https://acmehomegoods.com/checkout))\n- The product catalog reuses stock imagery found on unrelated storefronts ([acmehomegoods.com/shop](https://acmehomegoods.com/shop))", "dimensions": [ { "object": "risk_dimension", "type": "transaction_laundering", "score": 0.72, "level": "high", "top_factors": [ { "name": "website_has_no_refund_language", "type": "boolean", "value": true, "contribution": 0.28 }, { "name": "url_risk_score", "type": "double", "value": 0, "contribution": -0.17 } ] } ], "id": "5f8c9d0e-1a2b-4c3d-8e9f-6a7b8c9d0e1f", "level": "high", "object": "risk_assessment", "order_id": "a58a4f4e-7f3b-4c8e-9d2a-1b0c9d8e7f6a", "score": 68, "title": "Likely transaction laundering: the storefront cannot support its stated sales volume." } ``` **SDK Code** ```python Risk assessment import requests url = "https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest" headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript Risk assessment const url = 'https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest'; const options = {method: 'GET', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Risk assessment package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Risk assessment require 'uri' require 'net/http' url = URI("https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java Risk assessment import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest") .header("Authorization", "Bearer ") .asString(); ``` ```php Risk assessment request('GET', 'https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp Risk assessment using RestSharp; var client = new RestClient("https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift Risk assessment import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.middesk.com/v1/businesses/business_id/risk_assessments/latest")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers 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() ```