I've been pulling my hair out over this for days and can't find a solution anywhere. Hoping someone here has dealt with it.
The Problem
I have a Hikvision DS-K1T321MFWX (Firmware V3.9.2 / V3.9.5) configured with HTTP Listening to push access control events to my PHP server. Everything works perfectly unless "Save Picture When Auth" is enabled.
When picture saving is enabled, the device sends the event + photo fine on the first attempt — but then keeps retrying the same event every ~6 seconds forever, never clearing it from its internal queue. This blocks the FIFO queue, so any new swipe/face scan never gets delivered until I manually clear the pictures from the device.
What I've already tried (none of it works)
Every possible HTTP response format:
json
{"statusCode": 1, "statusString": "OK", "subStatusCode": "ok", "requestURL": "/api/endpoint"}
xml
<?xml version="1.0"?>
<ResponseStatus version="2.0">
<statusCode>1</statusCode>
<statusString>OK</statusString>
<subStatusCode>ok</subStatusCode>
</ResponseStatus>
Plain text "200", various Connection: keep-alive / Connection: close headers, Content-Length set correctly.
Sending the response before any processing using fastcgi_finish_request() so the device gets the ACK instantly — still retries.
What the logs show
The device sends Connection: keep-alive and our server mirrors it. The response goes out immediately. The device receives it (confirmed by log timing) and retries anyway.
=== NEW REQUEST [2026-05-09 18:56:02] ===
REQUEST HEADERS:
Connection: keep-alive
Content-Length: 87031
Content-Type: multipart/form-data; boundary=MIME_boundary
FILES: [Picture] => size: 85808 bytes ✓
RESPONSE SENT immediately:
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 87
BODY: {"statusCode":1,"statusString":"OK","subStatusCode":"ok"}
=== NEW REQUEST [2026-05-09 18:56:08] === ← same event, 6 seconds later
[DUPLICATE ignored] mac=08:54:11:27:f9:54 serial=348
Key finding
If I disable "Save Picture When Auth", the retry loop stops completely. But then "Upload Picture When Auth" also disappears from the UI — they're coupled in firmware. So it's all-or-nothing: either pictures work with infinite retry, or no retry but no pictures either.
The device behavior
The device marks the picture as "undelivered" internally and won't clear that flag regardless of any HTTP response. The same device works perfectly for card-only events (no picture) — those are confirmed and never retried.
activePostCount: 1 stays permanently until pictures are manually deleted from device storage.
My setup
Questions
Any help appreciated — this is driving me crazy.
The Problem
I have a Hikvision DS-K1T321MFWX (Firmware V3.9.2 / V3.9.5) configured with HTTP Listening to push access control events to my PHP server. Everything works perfectly unless "Save Picture When Auth" is enabled.
When picture saving is enabled, the device sends the event + photo fine on the first attempt — but then keeps retrying the same event every ~6 seconds forever, never clearing it from its internal queue. This blocks the FIFO queue, so any new swipe/face scan never gets delivered until I manually clear the pictures from the device.
What I've already tried (none of it works)
Every possible HTTP response format:
json
{"statusCode": 1, "statusString": "OK", "subStatusCode": "ok", "requestURL": "/api/endpoint"}
xml
<?xml version="1.0"?>
<ResponseStatus version="2.0">
<statusCode>1</statusCode>
<statusString>OK</statusString>
<subStatusCode>ok</subStatusCode>
</ResponseStatus>
Plain text "200", various Connection: keep-alive / Connection: close headers, Content-Length set correctly.
Sending the response before any processing using fastcgi_finish_request() so the device gets the ACK instantly — still retries.
What the logs show
The device sends Connection: keep-alive and our server mirrors it. The response goes out immediately. The device receives it (confirmed by log timing) and retries anyway.
=== NEW REQUEST [2026-05-09 18:56:02] ===
REQUEST HEADERS:
Connection: keep-alive
Content-Length: 87031
Content-Type: multipart/form-data; boundary=MIME_boundary
FILES: [Picture] => size: 85808 bytes ✓
RESPONSE SENT immediately:
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 87
BODY: {"statusCode":1,"statusString":"OK","subStatusCode":"ok"}
=== NEW REQUEST [2026-05-09 18:56:08] === ← same event, 6 seconds later
[DUPLICATE ignored] mac=08:54:11:27:f9:54 serial=348
Key finding
If I disable "Save Picture When Auth", the retry loop stops completely. But then "Upload Picture When Auth" also disappears from the UI — they're coupled in firmware. So it's all-or-nothing: either pictures work with infinite retry, or no retry but no pictures either.
The device behavior
The device marks the picture as "undelivered" internally and won't clear that flag regardless of any HTTP response. The same device works perfectly for card-only events (no picture) — those are confirmed and never retried.
activePostCount: 1 stays permanently until pictures are manually deleted from device storage.
My setup
- Device: DS-K1T321MFWX, Firmware V3.9.5 (upgraded hoping it would fix it)
- Server: PHP on cPanel/Apache (no persistent TCP listeners possible)
- Protocol tested: both HTTP and HTTPS, ports 80 and 443
Questions
- Has anyone found an HTTP response format that actually confirms picture delivery on this device?
- Is there a specific ISAPI endpoint to clear the "undelivered pictures" queue remotely (the server can't reach the device's local IP directly)?
- Does ISUP protocol solve this? The device has ISUP available but my server is cPanel-based.
- Any firmware version known to fix this behavior?
Any help appreciated — this is driving me crazy.