---
title: "11. API Endpoint Reference"
space: "CAMS Biometric Integration"
url: "https://docs.navari.co.ke/cams-biometric/api-endpoint-reference"
updated: "2026-05-27"
---

### Attendance Callback Endpoint

**URL:**

```
POST /api/method/navari_cams_biometric.cams_biometric.controllers.cams_call.attendance

```



**Authentication:** None required at the HTTP level. The endpoint is whitelisted for guest access. Authentication is performed internally by validating the `AuthToken` inside the JSON body against CAMS Biometric Settings.



**Content-Type:** `application/json`



**Request Body (RealTime Punch — the common case):**



```json
{
  "RealTime": {
    "OperationID": "9nu1wak5616p",
    "LabelName": "Main Gate",
    "SerialNumber": "ZHM11xxxxxxxx",
    "PunchLog": {
      "Type": "CheckIn",
      "Temperature": "36.8",
      "FaceMask": false,
      "InputType": "Fingerprint",
      "UserId": "EMP-0001",
      "LogTime": "2024-09-17 08:00:00 GMT +0300"
    },
    "AuthToken": "your-32-char-auth-token-here",
    "Time": "2024-09-17 05:01:00 GMT +0000"
  }
}

```



**Request Body (Historical PunchLog batch):**



```json
{
  "PunchLog": {
    "ReturnRowCount": "3",
    "Log": [
      { "Type": "CheckIn", "UserID": "EMP-0001", "LogTime": "2024-09-17 08:00:00 GMT +0300" },
      { "Type": "CheckOut", "UserID": "EMP-0001", "LogTime": "2024-09-17 17:30:00 GMT +0300" },
      { "Type": "CheckIn", "UserID": "EMP-0002", "LogTime": "2024-09-17 08:15:00 GMT +0300" }
    ]
  }
}

```



**Successful Response:**

```json
{"status": "done"}

```



HTTP Status: `200 OK`



**Error Responses:**


| Scenario           | HTTP Status | Body                                                   |
| ------------------ | ----------- | ------------------------------------------------------ |
| Empty request body | 200         | `{"status": "error", "message": "Empty request body"}` |
| Invalid JSON       | 200         | `{"status": "error", "message": "Invalid JSON"}`       |
| AuthToken mismatch | 200         | `{"status": "error", "message": "Invalid auth token"}` |
| Employee not found | 200         | `{"status": "done"}` (logged internally)               |


> **Note on error responses:** The CAMS Gateway expects HTTP 200 in all cases. The app always returns 200 to prevent the gateway from retrying unnecessarily. Errors are captured in the Frappe Error Log instead.

