4.2 KiB
4.2 KiB
Home Page API — Response Time Benchmarks
Measured from the client network (curl) against production.
| Field | Value |
|---|---|
| Date | 2026-07-07 |
| Base URL | https://app.opplenz.com |
| Runs per endpoint | 10 |
| Account | test@email.com |
| Company ID | 69dbef4e0917c63d28787737 |
All requests returned HTTP 200 on every run.
Average response time
| # | Endpoint | Method | Avg (ms) | Min (ms) | Max (ms) | Blocks UI? | % of blocking load |
|---|---|---|---|---|---|---|---|
| 1 | /api/v1/tender-approvals/stats |
GET | 614 | 520 | 793 | Yes | 3.4% |
| 2 | /api/v1/tender-approvals?limit=10&offset=0 |
GET | 16,688 | 16,503 | 17,061 | Yes | 93.6% |
| 3 | /api/v1/feedback?feedback_type=like&limit=1&offset=0 |
GET | 554 | 506 | 668 | Yes | 3.1% |
| 4 | /api/v1/notifications?seen=false&limit=1&event_type=PUSH |
GET | 548 | 483 | 642 | No | — |
| 5 | /api/v1/tenders/recommend?limit=10&offset=0 |
GET | 5,716 | 4,010 | 8,361 | No* | — |
* Call #5 only fires when call #2 returns an empty tender list. It does not block the initial loading spinner, but still adds server load and may update the list shortly after render.
Totals
| Metric | Time |
|---|---|
| Sequential blocking total (calls 1 + 2 + 3) | ~17.9 s |
| Slowest single endpoint | GET /api/v1/tender-approvals — 16.7 s avg |
| Fastest endpoint | GET /api/v1/notifications — 0.5 s avg |
The home page waits on calls 1 → 2 → 3 in series before rendering. /api/v1/tender-approvals accounts for ~94% of that wait.
Raw timings (seconds)
1. Tender approval stats
GET /api/v1/tender-approvals/stats
| Run | Time (s) |
|---|---|
| 1 | 0.779 |
| 2 | 0.662 |
| 3 | 0.644 |
| 4 | 0.793 |
| 5 | 0.597 |
| 6 | 0.536 |
| 7 | 0.562 |
| 8 | 0.533 |
| 9 | 0.520 |
| 10 | 0.520 |
| Avg | 0.614 |
2. Your tenders
GET /api/v1/tender-approvals?limit=10&offset=0
| Run | Time (s) |
|---|---|
| 1 | 16.503 |
| 2 | 16.573 |
| 3 | 16.873 |
| 4 | 16.607 |
| 5 | 17.061 |
| 6 | 16.600 |
| 7 | 16.628 |
| 8 | 16.707 |
| 9 | 16.727 |
| 10 | 16.606 |
| Avg | 16.688 |
3. Liked tenders count
GET /api/v1/feedback?feedback_type=like&limit=1&offset=0
| Run | Time (s) |
|---|---|
| 1 | 0.629 |
| 2 | 0.506 |
| 3 | 0.515 |
| 4 | 0.594 |
| 5 | 0.521 |
| 6 | 0.509 |
| 7 | 0.529 |
| 8 | 0.529 |
| 9 | 0.542 |
| 10 | 0.668 |
| Avg | 0.554 |
4. Unread notifications (background)
GET /api/v1/notifications?seen=false&limit=1&event_type=PUSH
| Run | Time (s) |
|---|---|
| 1 | 0.566 |
| 2 | 0.540 |
| 3 | 0.486 |
| 4 | 0.607 |
| 5 | 0.541 |
| 6 | 0.498 |
| 7 | 0.614 |
| 8 | 0.642 |
| 9 | 0.506 |
| 10 | 0.483 |
| Avg | 0.548 |
5. Recommended tenders (conditional)
GET /api/v1/tenders/recommend?limit=10&offset=0
| Run | Time (s) |
|---|---|
| 1 | 4.364 |
| 2 | 5.880 |
| 3 | 5.402 |
| 4 | 4.010 |
| 5 | 6.512 |
| 6 | 5.827 |
| 7 | 5.584 |
| 8 | 5.653 |
| 9 | 8.361 |
| 10 | 5.575 |
| Avg | 5.716 |
Key finding
| Priority | Endpoint | Issue |
|---|---|---|
| P0 | GET /api/v1/tender-approvals?limit=10&offset=0 |
~17 s average — dominates home page load |
| P1 | GET /api/v1/tenders/recommend?limit=10&offset=0 |
~5.7 s average — slow when used as fallback |
| P2 | GET /api/v1/tender-approvals/stats |
~0.6 s — acceptable but called on every home visit |
| — | Feedback + notifications | ~0.55 s each — not a bottleneck |
How to reproduce
TOKEN='<access_token>'
BASE='https://app.opplenz.com'
for url in \
"$BASE/api/v1/tender-approvals/stats" \
"$BASE/api/v1/tender-approvals?limit=10&offset=0" \
"$BASE/api/v1/feedback?feedback_type=like&limit=1&offset=0" \
"$BASE/api/v1/notifications?seen=false&limit=1&event_type=PUSH" \
"$BASE/api/v1/tenders/recommend?limit=10&offset=0"
do
curl -s -o /dev/null -w "%{time_total}s %{http_code} $url\n" \
-H "Authorization: Bearer $TOKEN" "$url"
done
Related
See home-page-api-calls.md for full call order, parameters, and optimization suggestions.