Appearance
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 descSuccess-rate definition:
HTTP 400 Bad Request,HTTP 401 Unauthorized, andHTTP 404 Not Foundare 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 routeGET items/images/proxy/{sequence:int}(4 721 requests) represents this traffic as a whole.
| Endpoint | Requests | P50 (ms) | P95 (ms) | P99 (ms) | Avg (ms) | Success % |
|---|---|---|---|---|---|---|
| GET items/price | 91 496 | 92.84 | 336.08 | 697.86 | 126.08 | 100 |
| GET items/restock-orders | 47 188 | 13.82 | 25.44 | 87.11 | 15.34 | 100 |
| GET items/attachments | 45 983 | 8.10 | 13.70 | 67.63 | 9.25 | 100 |
| GET customers/{customerCode}/addresses | 43 152 | 11.45 | 20.09 | 69.60 | 12.58 | 100 |
| GET pricelists/items/detail | 39 515 | 11.69 | 32.76 | 85.47 | 13.51 | 100 |
| GET items/images | 36 966 | 10.06 | 15.67 | 67.37 | 11.16 | 100 |
| GET channels/{channelCode}/items | 23 304 | 75.64 | 300.87 | 693.04 | 109.33 | 100 |
| GET channels/{channelCode}/items/detail | 19 767 | 34.81 | 263.04 | 481.98 | 72.76 | 100 |
| GET customers/{customerCode}/contact-persons | 19 075 | 7.88 | 16.48 | 76.56 | 11.18 | 100 |
| GET items/images/proxy/ | 4 721 | 88.70 | 509.03 | 1 201.75 | 170.87 | 100 |
| PUT items | 3 058 | 40.31 | 74.17 | 299.88 | 48.49 | 100 |
| PUT customers/{customerCode}/addresses/ | 1 857 | 32.64 | 95.49 | 1 232.85 | 62.42 | 100 |
| PUT pricelists/items | 1 102 | 28.25 | 104.02 | 212.19 | 50.80 | 100 |
| GET administration/notifications | 857 | 10.50 | 26.69 | 121.67 | 16.00 | 100 |
| POST items/list | 471 | 1 211.08 | 7 984.65 | 24 150.55 | 2 215.84 | 100 |
| GET pricelists/items | 436 | 24.48 | 271.86 | 537.70 | 67.71 | 100 |
| GET pricelists/detail | 372 | 8.38 | 11.16 | 31.36 | 7.99 | 100 |
| PUT pricelists | 342 | 10.99 | 14.51 | 28.33 | 10.56 | 100 |
| POST customers/list | 318 | 37.44 | 133.03 | 220.71 | 52.99 | 100 |
| GET vat-tariffs/rates | 305 | 9.00 | 73.17 | 92.44 | 16.52 | 100 |
| POST pricelists/items | 280 | 23.21 | 33.62 | 49.28 | 18.44 | 100 |
| POST items/attachments | 268 | 76.02 | 132.38 | 186.10 | 78.05 | 100 |
| GET customers/{customerCode}/addresses/ | 262 | 11.72 | 101.65 | 209.61 | 24.95 | 100 |
| DELETE items/attachments | 252 | 36.55 | 52.22 | 109.20 | 38.84 | 100 |
| GET customers/{customerCode}/contact-persons/ | 191 | 11.66 | 58.19 | 229.35 | 19.59 | 100 |
| GET channels/ | 180 | 13.53 | 87.74 | 178.05 | 25.37 | 100 |
| GET customers/ | 148 | 9.45 | 72.03 | 203.16 | 17.82 | 100 |
| GET webhooks | 143 | 25.96 | 194.15 | 194.15 | 54.85 | 100 |
| GET auth/me | 130 | 0.57 | 7.84 | 192.25 | 5.70 | 100 |
| GET attribute-definitions | 111 | 11.93 | 93.78 | 211.69 | 22.84 | 100 |
| GET pricelists | 108 | 10.56 | 15.24 | 298.36 | 25.21 | 100 |
| GET items/audit-trails | 95 | 153.67 | 610.74 | 990.57 | 230.23 | 100 |
| POST items | 73 | 48.67 | 1 727.72 | 2 618.62 | 187.49 | 100 |
| GET items/detail | 72 | 17.77 | 175.98 | 802.96 | 43.46 | 100 |
| DELETE customers/ | 67 | 29.56 | 80.32 | 108.79 | 35.36 | 100 |
| GET unit-of-measures | 62 | 11.50 | 22.61 | 131.71 | 14.60 | 100 |
| GET webhooks/ | 32 | 11.31 | 62.04 | 81.00 | 16.70 | 100 |
| POST items/restock-orders | 26 | 9.61 | 14.44 | 81.56 | 11.82 | 100 |
| DELETE items | 13 | 25.63 | 193.81 | 193.81 | 40.41 | 100 |
| POST customers/{customerCode}/addresses | 12 | 48.62 | 292.01 | 292.01 | 80.66 | 100 |
| GET entitymetrics/total | 10 | 7.23 | 99.84 | 99.84 | 18.70 | 100 |
| GET channels | 10 | 13.59 | 219.00 | 219.00 | 43.06 | 100 |
| GET entity-lists | 9 | 10.00 | 54.56 | 54.56 | 15.18 | 100 |
| GET entitymetrics/counters | 8 | 6.85 | 89.63 | 89.63 | 18.86 | 100 |
| GET jobs | 7 | 10.04 | 76.94 | 76.94 | 21.70 | 100 |
| PUT customers/{customerCode}/contact-persons/ | 5 | 417.08 | 2 399.81 | 2 399.81 | 875.26 | 100 |
| GET items/customer-prices | 4 | 14.82 | 676.76 | 676.76 | 178.71 | 100 |
| GET customers/{customerCode}/audit-trails | 4 | 68.92 | 188.49 | 188.49 | 102.46 | 100 |
| POST items/images | 4 | 127.19 | 197.48 | 197.48 | 138.65 | 100 |
| GET channels/{channelCode}/audit-trails | 3 | 75.33 | 143.16 | 143.16 | 97.21 | 100 |
| DELETE items/images | 3 | 25.25 | 27.24 | 27.24 | 25.45 | 100 |
| POST customers | 3 | 72.96 | 110.66 | 110.66 | 76.56 | 100 |
| POST customers/{customerCode}/contact-persons | 3 | 1 304.77 | 1 404.61 | 1 404.61 | 935.40 | 100 |
| PUT customers/ | 3 | 49.26 | 81.46 | 81.46 | 57.48 | 100 |
| GET flows/definitions | 2 | 4.50 | 7.12 | 7.12 | 5.81 | 100 |
| GET entity-lists/ | 1 | 9.65 | 9.65 | 9.65 | 9.65 | 100 |
| GET orders | 1 | 6.50 | 6.50 | 6.50 | 6.50 | 100 |
| DELETE customers/{customerCode}/addresses/ | 1 | 32.54 | 32.54 | 32.54 | 32.54 | 100 |
| GET connectors | 1 | 9.14 | 9.14 | 9.14 | 9.14 | 100 |
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:
| Endpoint | Requests | Notes |
|---|---|---|
| GET items/price | 91 496 | Highest volume; P95 337 ms — monitor closely. |
| GET items/restock-orders | 47 222 | Fast; well within SLO. |
| GET items/attachments | 45 983 | Fast; well within SLO. |
| GET customers/{customerCode}/addresses | 43 152 | Fast; well within SLO. |
| GET pricelists/items/detail | 39 515 | Fast; well within SLO. |
| GET items/images | 36 966 | Fast; well within SLO. |
| GET channels/{channelCode}/items | 23 304 | P95 301 ms; keep under observation. |
| GET channels/{channelCode}/items/detail | 19 767 | P95 263 ms; 100% success once 400/404 are excluded. |
| GET items/images/proxy/ | 4 721 | Image 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:
| Endpoint | Requests | P95 (ms) | P99 (ms) | Notes |
|---|---|---|---|---|
| POST items/list | 471 | 7 985 | 24 151 | Batch endpoint — expected to be slow; ensure callers use appropriate timeouts and this does not run at high concurrency. |
| POST items | 73 | 1 728 | 2 619 | High P99; likely involves multi-step writes. Profile under load. |
| PUT customers/{customerCode}/contact-persons/ | 5 | 2 400 | 2 400 | Very few samples; P95 may not be representative, but worth watching. |
| POST customers/{customerCode}/contact-persons | 3 | 1 405 | 1 405 | Very few samples; same caveat. |
| GET items/images/proxy/ | 4 721 | 509 | 1 202 | Image proxy at meaningful volume; P99 > 1 s warrants profiling if traffic grows. |
| GET items/audit-trails | 95 | 611 | 991 | Read-heavy; consider caching or pagination if volume grows. |
| PUT customers/{customerCode}/addresses/ | 1 857 | 96 | 1 233 | P99 spike (1 233 ms) against a P95 of 96 ms indicates occasional slow outliers — likely lock contention or downstream delays. |
| GET items/price | 91 496 | 337 | 699 | Highest-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
maxReplicasor reducedconcurrentRequestsshould 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.