Skip to content

Performance Baseline ​

This page documents the latency and success-rate baseline for the Public API, captured over a 14-day window. Use these numbers as the reference point when evaluating performance test results or making scaling decisions.


Methodology ​

Data was collected with the following KQL query against Application Insights:

kql
AppRequests
| where TimeGenerated > ago(14d)
| where AppRoleName == "public-api"
// 1. Exclude Health/Liveness checks
| where OperationName !contains "health"
    and OperationName !contains "alive"
// 2. Exclude Browser/Dev noise
| where OperationName !contains "browserLink"
    and OperationName !contains "aspnetcore-browser-refresh"
    and OperationName !contains "robots.txt"
// 3. Exclude Documentation/Root noise
| where OperationName !contains "swagger"
    and OperationName !contains "openapi"
    and OperationName != "GET /"
// 4. Ensure we only look at versioned API calls or specific functional paths
| where OperationName contains "/v" or OperationName contains "api"
| summarize
    RequestCount = count(),
    percentiles(DurationMs, 50, 95, 99),
    AvgDuration_ms = avg(DurationMs),
    SuccessRate = avg(iff(Success == true or ResultCode == "404" or ResultCode == "400" or ResultCode == "401", 100.0, 0.0)) // treat 'Not Found', 'Not Authenticated' and 'Bad Request' as success
  by OperationName
| project
    Endpoint = OperationName,
    Requests = RequestCount,
    P50_ms = round(percentile_DurationMs_50, 2),
    P95_ms = round(percentile_DurationMs_95, 2),
    P99_ms = round(percentile_DurationMs_99, 2),
    Avg_ms = round(AvgDuration_ms, 2),
    SuccessRate = round(SuccessRate, 2)
| order by Requests desc

Success-rate definition: HTTP 400 Bad Request, HTTP 401 Unauthorized, and HTTP 404 Not Found are counted as successful. These are valid, expected API responses (invalid caller input, unauthenticated caller, or a missing resource) and do not indicate a platform fault. Only 5xx responses and network-level failures reduce the success rate.

Captured: March 12, 2026 (covering the preceding 14 days)


Results ​

Individual image proxy requests (GET /v1/items/images/proxy/wiser2/...) are excluded from this table — the query returns hundreds of single-occurrence rows for specific image paths. The aggregated template route GET items/images/proxy/{sequence:int} (4 721 requests) represents this traffic as a whole.

EndpointRequestsP50 (ms)P95 (ms)P99 (ms)Avg (ms)Success %
GET items/price91 49692.84336.08697.86126.08100
GET items/restock-orders47 18813.8225.4487.1115.34100
GET items/attachments45 9838.1013.7067.639.25100
GET customers/{customerCode}/addresses43 15211.4520.0969.6012.58100
GET pricelists/items/detail39 51511.6932.7685.4713.51100
GET items/images36 96610.0615.6767.3711.16100
GET channels/{channelCode}/items23 30475.64300.87693.04109.33100
GET channels/{channelCode}/items/detail19 76734.81263.04481.9872.76100
GET customers/{customerCode}/contact-persons19 0757.8816.4876.5611.18100
GET items/images/proxy/4 72188.70509.031 201.75170.87100
PUT items3 05840.3174.17299.8848.49100
PUT customers/{customerCode}/addresses/1 85732.6495.491 232.8562.42100
PUT pricelists/items1 10228.25104.02212.1950.80100
GET administration/notifications85710.5026.69121.6716.00100
POST items/list4711 211.087 984.6524 150.552 215.84100
GET pricelists/items43624.48271.86537.7067.71100
GET pricelists/detail3728.3811.1631.367.99100
PUT pricelists34210.9914.5128.3310.56100
POST customers/list31837.44133.03220.7152.99100
GET vat-tariffs/rates3059.0073.1792.4416.52100
POST pricelists/items28023.2133.6249.2818.44100
POST items/attachments26876.02132.38186.1078.05100
GET customers/{customerCode}/addresses/26211.72101.65209.6124.95100
DELETE items/attachments25236.5552.22109.2038.84100
GET customers/{customerCode}/contact-persons/19111.6658.19229.3519.59100
GET channels/18013.5387.74178.0525.37100
GET customers/1489.4572.03203.1617.82100
GET webhooks14325.96194.15194.1554.85100
GET auth/me1300.577.84192.255.70100
GET attribute-definitions11111.9393.78211.6922.84100
GET pricelists10810.5615.24298.3625.21100
GET items/audit-trails95153.67610.74990.57230.23100
POST items7348.671 727.722 618.62187.49100
GET items/detail7217.77175.98802.9643.46100
DELETE customers/6729.5680.32108.7935.36100
GET unit-of-measures6211.5022.61131.7114.60100
GET webhooks/3211.3162.0481.0016.70100
POST items/restock-orders269.6114.4481.5611.82100
DELETE items1325.63193.81193.8140.41100
POST customers/{customerCode}/addresses1248.62292.01292.0180.66100
GET entitymetrics/total107.2399.8499.8418.70100
GET channels1013.59219.00219.0043.06100
GET entity-lists910.0054.5654.5615.18100
GET entitymetrics/counters86.8589.6389.6318.86100
GET jobs710.0476.9476.9421.70100
PUT customers/{customerCode}/contact-persons/5417.082 399.812 399.81875.26100
GET items/customer-prices414.82676.76676.76178.71100
GET customers/{customerCode}/audit-trails468.92188.49188.49102.46100
POST items/images4127.19197.48197.48138.65100
GET channels/{channelCode}/audit-trails375.33143.16143.1697.21100
DELETE items/images325.2527.2427.2425.45100
POST customers372.96110.66110.6676.56100
POST customers/{customerCode}/contact-persons31 304.771 404.611 404.61935.40100
PUT customers/349.2681.4681.4657.48100
GET flows/definitions24.507.127.125.81100
GET entity-lists/19.659.659.659.65100
GET orders16.506.506.506.50100
DELETE customers/{customerCode}/addresses/132.5432.5432.5432.54100
GET connectors19.149.149.149.14100

Observations ​

High-traffic endpoints ​

The following endpoints account for the vast majority of request volume and deserve the closest attention in performance testing and scaling decisions:

EndpointRequestsNotes
GET items/price91 496Highest volume; P95 337 ms — monitor closely.
GET items/restock-orders47 222Fast; well within SLO.
GET items/attachments45 983Fast; well within SLO.
GET customers/{customerCode}/addresses43 152Fast; well within SLO.
GET pricelists/items/detail39 515Fast; well within SLO.
GET items/images36 966Fast; well within SLO.
GET channels/{channelCode}/items23 304P95 301 ms; keep under observation.
GET channels/{channelCode}/items/detail19 767P95 263 ms; 100% success once 400/404 are excluded.
GET items/images/proxy/4 721Image proxy; P95 509 ms, P99 1 202 ms — see latency outliers.

Latency outliers ​

Endpoints with elevated P95 or P99 values that should be investigated or load-tested before raising traffic:

EndpointRequestsP95 (ms)P99 (ms)Notes
POST items/list4717 98524 151Batch endpoint — expected to be slow; ensure callers use appropriate timeouts and this does not run at high concurrency.
POST items731 7282 619High P99; likely involves multi-step writes. Profile under load.
PUT customers/{customerCode}/contact-persons/52 4002 400Very few samples; P95 may not be representative, but worth watching.
POST customers/{customerCode}/contact-persons31 4051 405Very few samples; same caveat.
GET items/images/proxy/4 7215091 202Image proxy at meaningful volume; P99 > 1 s warrants profiling if traffic grows.
GET items/audit-trails95611991Read-heavy; consider caching or pagination if volume grows.
PUT customers/{customerCode}/addresses/1 857961 233P99 spike (1 233 ms) against a P95 of 96 ms indicates occasional slow outliers — likely lock contention or downstream delays.
GET items/price91 496337699Highest-volume endpoint; P95 is acceptable today but should be a key SLO signal.

Using this baseline ​

  • Performance tests — Use the P50, P95, and P99 values above as pass/fail thresholds. A regression is any endpoint whose P95 exceeds the baseline P99 under equivalent load.
  • Scaling decisions — Cross-reference with the Scaling page. High-volume endpoints that approach their P99 under increases in maxReplicas or reduced concurrentRequests should be re-profiled.
  • Refresh cadence — Re-run the KQL query after significant traffic changes, major releases, or infrastructure resizing events, and update this page with the new snapshot.