AVMS API Integration Guide

Version 4.1.0

EgyTwins Integrated Solutions — System Development Team

🚀 Getting Started

Prerequisites: The AVMS system must be installed and configured properly. The API is available through the main AVMS.

Base URL

{Root}/api

Example: http://localhost:5000/api/auth/sign-in

Authentication

All protected endpoints require an Authorization header:

Authorization: Bearer [token]

Important Notes

  • The API only handles application/json format in requests and responses (except endpoints with multipart/form-data).
  • Login sessions will be automatically logged out after a period of inactivity.
  • AUTH indicates the call requires authorization.

🔐 Authentication

POST /auth/register AUTH
multipart/form-data
Register a new user in the system.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
UsernamestringYesUser's username
EmailstringYesUser's email address
RolesListYesList of role names
PhoneNumberstringYesUser's phone number
ImageIFormFileNoProfile image file
PictureUrlstringNoProfile image URL
AreaIdsListNoList of area IDs
UniqCodestringNoUnique code for user
PasswordstringNoPassword
ConfirmPasswordstringNoPassword confirmation
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "User registered successfully",
  "data": {
    "confirmMessage": "User registered successfully",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expiresOn": "2024-12-31T23:59:59Z"
  }
}

Error Responses: 400 Bad Request, 401 Unauthorized, 500 Internal Server Error

POST /auth/user-role AUTH
application/json
Assign a role to a user.
Request Body:
{
  "userId": "123e4567-e89b-12d3-a456-426614174000",
  "roleName": "Admin"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Role assigned successfully",
  "data": "Role assigned successfully"
}
POST /auth/sign-in
application/json
Authenticate with the server. Returns a bearer token and sets a refresh token in an HTTP-only cookie.
Request Body:
{
  "username": "john.doe@example.com",
  "password": "P@ssw0rd123",
  "uniqCode": "DEVICE001"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Login successful",
  "data": {
    "isAuthenticated": true,
    "username": "john.doe",
    "email": "john.doe@example.com",
    "roles": ["Admin", "User"],
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expiresOn": "2024-12-31T23:59:59Z",
    "refreshToken": "a1b2c3d4e5f6...",
    "refreshTokenExpiresOn": "2025-01-07T23:59:59Z"
  }
}
POST /auth/change-password AUTH
application/json
Change the authenticated user's password.
Request Body:
{
  "currentPassword": "OldP@ssw0rd",
  "newPassword": "NewP@ssw0rd123",
  "confirmPassword": "NewP@ssw0rd123"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Password changed successfully",
  "data": "Password changed successfully"
}
POST /auth/forget-password
application/json
Initiate the password reset process.
Request Body:
{
  "email": "user@example.com"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Reset code sent to your email",
  "data": "Reset code: 123456"
}
POST /auth/reset-password
application/json
Reset password using the reset code.
Request Body:
{
  "resetCode": "123456",
  "email": "user@example.com",
  "newPassword": "NewP@ssw0rd123",
  "confirmPassword": "NewP@ssw0rd123"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Password reset successfully",
  "data": "Password reset successfully"
}
GET /auth/GenrateNewToken AUTH
Refresh the access token using the refresh token from the cookie.
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Token refreshed successfully",
  "data": {
    "isAuthenticated": true,
    "username": "john.doe",
    "email": "john.doe@example.com",
    "roles": ["Admin", "User"],
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expiresOn": "2024-12-31T23:59:59Z",
    "refreshToken": "a1b2c3d4e5f6...",
    "refreshTokenExpiresOn": "2025-01-07T23:59:59Z"
  }
}

📍 Areas

GET /area/get AUTH
Get a list of all areas.
Query Parameters:
ParameterTypeRequiredDescription
OwnerIdstringNoFilter by owner ID
Response 200 OK
[
  {
    "id": 1,
    "name": "Main Building",
    "areaTypeId": 1,
    "areaTypeName": "Building",
    "zIndex": 1,
    "areaParentId": null,
    "areaParentName": null,
    "status": 1,
    "isUnit": false,
    "isActive": true,
    "note": "Main administrative building",
    "description": "Headquarters building",
    "isDeleted": false,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": "user123",
    "updatedUserName": "Admin User",
    "deletedUserId": null,
    "deletedUserName": null,
    "visitStartTime": "08:00",
    "visitEndTime": "18:00",
    "number": "B001",
    "owners": [
      {
        "userId": "owner123",
        "userName": "John Doe",
        "email": "john.doe@example.com"
      }
    ],
    "currentlyInsideToday": 25,
    "logo": "https://example.com/logo.png"
  }
]
GET /area/unit AUTH
Get a list of all units (IsUnit = true).
Response 200 OK
[
  {
    "id": 10,
    "name": "Office 101",
    "areaTypeId": 3,
    "areaTypeName": "Office",
    "zIndex": 3,
    "areaParentId": 5,
    "areaParentName": "Floor 1",
    "status": 1,
    "isUnit": true,
    "isActive": true,
    "note": "Executive office",
    "description": "Main executive office",
    "isDeleted": false,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null,
    "visitStartTime": "09:00",
    "visitEndTime": "17:00",
    "number": "OFF101",
    "owners": [
      {
        "userId": "owner456",
        "userName": "Jane Smith",
        "email": "jane.smith@example.com"
      }
    ],
    "currentlyInsideToday": 3,
    "logo": "https://example.com/office-logo.png"
  }
]
GET /area/{id} AUTH
Get area by ID.

Path Parameters: id (int) – Area ID

Response 200 OK
{
  "id": 1,
  "name": "Main Building",
  "areaTypeId": 1,
  "areaTypeName": "Building",
  "zIndex": 1,
  "areaParentId": null,
  "areaParentName": null,
  "status": 1,
  "isUnit": false,
  "isActive": true,
  "note": "Main administrative building",
  "description": "Headquarters building",
  "isDeleted": false,
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": "user123",
  "updatedUserName": "Admin User",
  "deletedUserId": null,
  "deletedUserName": null,
  "visitStartTime": "08:00",
  "visitEndTime": "18:00",
  "number": "B001",
  "owners": [
    {
      "userId": "owner123",
      "userName": "John Doe",
      "email": "john.doe@example.com"
    }
  ],
  "currentlyInsideToday": 25,
  "logo": "https://example.com/logo.png"
}
POST /area/create AUTH
multipart/form-data
Create a new area.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
NamestringYesArea name
AreaTypeIdintYesArea type ID
AreaParentIdintNoParent area ID
IsUnitboolYesWhether this area is a unit
IsActiveboolNoActive status (default: true)
NotestringNoAdditional notes
DescriptionstringNoArea description
NumberstringNoArea number/code
VisitStartTimestringNoVisit start time (HH:mm)
VisitEndTimestringNoVisit end time (HH:mm)
LogoFileIFormFileNoArea logo image file
LogostringNoArea logo URL
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area created successfully",
  "data": "1"
}
POST /area/edit/{id} AUTH
multipart/form-data
Update an existing area.

Path Parameters: id (int) – Area ID

Request parameters same as /area/create plus Id field.

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area updated successfully",
  "data": "Area updated successfully"
}
POST /area/IsActive AUTH
application/json
Activate or deactivate an area.
Request Body:
{
  "id": 1,
  "isActive": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area status updated successfully",
  "data": "Area status updated successfully"
}
POST /area/edit-deleted-area/{id} AUTH
application/json
Restore a soft-deleted area.

Path Parameters: id (int) – Area ID

Request Body:
{
  "id": 1,
  "isDeleted": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area restored successfully",
  "data": "Area restored successfully"
}
POST /area/delete/{id} AUTH
Soft-delete an area.

Path Parameters: id (int) – Area ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area deleted successfully",
  "data": "Area deleted successfully"
}

🏷️ Area Types

GET /area-type/get AUTH
Get a list of all area types.
Response 200 OK
[
  {
    "id": 1,
    "name": "Building",
    "note": "Main building type",
    "description": "Large structure for offices",
    "isDeleted": false,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": "user123",
    "updatedUserName": "Admin User",
    "deletedUserId": null,
    "deletedUserName": null
  }
]
GET /area-type/get/{id} AUTH
Get area type by ID.

Path Parameters: id (int) – Area Type ID

Response 200 OK
{
  "id": 1,
  "name": "Building",
  "note": "Main building type",
  "description": "Large structure for offices",
  "isDeleted": false,
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": "user123",
  "updatedUserName": "Admin User",
  "deletedUserId": null,
  "deletedUserName": null
}
POST /area-type/create AUTH
application/json
Create a new area type.
Request Body:
{
  "name": "Department",
  "note": "Organizational department",
  "description": "Internal department within organization"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area type created successfully",
  "data": "Area type created successfully"
}
POST /area-type/edit/{id} AUTH
application/json
Update an existing area type.

Path Parameters: id (int) – Area Type ID

Request Body:
{
  "id": 1,
  "name": "Updated Building",
  "note": "Updated note",
  "description": "Updated description"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area type updated successfully",
  "data": "Area type updated successfully"
}
POST /area-type/edit-deleted-areatype/{id} AUTH
application/json
Restore a soft-deleted area type.

Path Parameters: id (int) – Area Type ID

Request Body:
{
  "id": 1,
  "isDeleted": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area type restored successfully",
  "data": "Area type restored successfully"
}
POST /area-type/delete/{id} AUTH
Soft-delete an area type.

Path Parameters: id (int) – Area Type ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Area type deleted successfully",
  "data": "Area type deleted successfully"
}

📜 Audit Log

GET /api/AuditLog/GetAllAuditLogs AUTH
Get paginated audit log entries.
Query Parameters:
ParameterTypeRequiredDescription
UserIdstringNoFilter by user ID
TableNamestringNoFilter by table name
ActionstringNoFilter by action
FromDateDateTimeNoStart date
ToDateDateTimeNoEnd date
PageintNoPage number (default: 1)
PageSizeintNoPage size (default: 20)
Response 200 OK
{
  "items": [
    {
      "action": "INSERT",
      "tableName": "Areas",
      "timestamp": "2024-01-15T10:30:00Z",
      "userId": "user123",
      "oldValues": {},
      "newValues": {
        "Id": 5,
        "Name": "New Area",
        "AreaTypeId": 1
      }
    }
  ],
  "totalCount": 150,
  "pageNumber": 1,
  "pageSize": 20,
  "totalPages": 8
}

⛔ Black Lists

GET /black-list/get-all AUTH
Get a list of all blacklist entries.
Response 200 OK
[
  {
    "id": "blk001",
    "name": "John Doe",
    "note": "Unauthorized access attempt",
    "description": "Attempted to enter restricted area",
    "documentIdno": "ID123456",
    "pictureUrl": "https://example.com/person.jpg",
    "dateTimeFrom": "2024-01-01T00:00:00Z",
    "dateTimeTo": "2024-12-31T23:59:59Z",
    "permanentBlock": false,
    "isDeleted": false,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null,
    "area": [
      { "id": 1, "name": "Main Building" },
      { "id": 2, "name": "East Wing" }
    ]
  }
]
GET /black-list/{id} AUTH
Get blacklist entry by ID.

Path Parameters: id (string) – Blacklist ID

Response 200 OK
{
  "id": "blk001",
  "name": "John Doe",
  "note": "Unauthorized access attempt",
  "description": "Attempted to enter restricted area",
  "documentIdno": "ID123456",
  "pictureUrl": "https://example.com/person.jpg",
  "dateTimeFrom": "2024-01-01T00:00:00Z",
  "dateTimeTo": "2024-12-31T23:59:59Z",
  "permanentBlock": false,
  "isDeleted": false,
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null,
  "area": [
    { "id": 1, "name": "Main Building" }
  ]
}
POST /black-list/create AUTH
multipart/form-data
Create a new blacklist entry.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
NamestringYesPerson's name
NotestringNoAdditional notes
DescriptionstringNoDetailed description
DocumentIdnostringYesID document number
ImageIFormFileNoPerson's image file
PictureUrlstringNoPerson's image URL
DateTimeFromDateTimeNoBlock start date
DateTimeToDateTimeNoBlock end date
PermanentBlockboolNoWhether block is permanent
AreaIdsListYesAreas where block applies
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Blacklist entry created successfully",
  "data": "blk001"
}
POST /black-list/edit/{id} AUTH
multipart/form-data
Update an existing blacklist entry.

Path Parameters: id (string) – Blacklist ID

Request parameters same as /black-list/create plus Id field.

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Blacklist entry updated successfully",
  "data": "Blacklist entry updated successfully"
}
POST /black-list/delete/{id} AUTH
Delete a blacklist entry by ID.

Path Parameters: id (string) – Blacklist ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Blacklist entry deleted successfully",
  "data": "Blacklist entry deleted successfully"
}
POST /black-list/delete AUTH
Delete a blacklist entry by document number.
Query Parameters:
documentNostringYesDocument number
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Blacklist entry deleted successfully",
  "data": "Blacklist entry deleted successfully"
}

📊 Dashboard

GET /dashboard/TabsInfo AUTH
Get dashboard statistics.
Response 200 OK
{
  "totalInvitation": 1250,
  "entered": 875,
  "exited": 350,
  "pending": 25,
  "totalTransaction": 3500
}
GET /dashboard/TotalVisitorLineChart AUTH
Get visitor statistics for line chart.
Query Parameters:
DateFromDateTimeNoStart date (default: 30 days ago)
DateToDateTimeNoEnd date (default: now)
Response 200 OK
[
  { "day": "2024-01-15T00:00:00Z", "count": 45 },
  { "day": "2024-01-16T00:00:00Z", "count": 52 }
]
GET /dashboard/WeeklyVisitorPerDayCount AUTH
Get daily visitor counts for each week.
Query Parameters:
YearintNoYear (default: current year)
Response 200 OK
[
  {
    "week": 1,
    "days": [
      { "day": "Monday", "count": 12 },
      { "day": "Tuesday", "count": 15 }
    ]
  }
]
GET /dashboard/WeeklyVisitorCount AUTH
Get weekly visitor statistics.
Query Parameters:
YearintNoYear (default: current year)
Response 200 OK
[
  { "weekNumber": 1, "count": 85 },
  { "weekNumber": 2, "count": 92 }
]
GET /dashboard/HourlyVisitorCount AUTH
Get hourly visitor statistics.
Query Parameters:
DateFromDateTimeNoStart date (default: today)
DateToDateTimeNoEnd date (default: today)
Response 200 OK
[
  { "hour": 9, "count": 25 },
  { "hour": 10, "count": 42 }
]
GET /dashboard/MonthlyVisitorCount AUTH
Get monthly visitor statistics.
Query Parameters:
YearintNoYear (default: current year)
Response 200 OK
[
  { "month": "January", "count": 450 },
  { "month": "February", "count": 380 }
]
GET /dashboard/TopFiveInvitations AUTH
Get top 5 invitations.
Response 200 OK
[
  {
    "documentId": "ID123456",
    "fullName": "John Smith",
    "registrationDate": "2024-01-15T09:30:00Z",
    "expiryDate": "2024-01-15T17:30:00Z",
    "cardNumber": "CARD001"
  }
]

📱 Devices

GET /Device/get AUTH
Get a list of all devices.
Response 200 OK
[
  {
    "id": "dev001",
    "name": "Main Gate Kiosk",
    "deviceNo": 1,
    "deviceIp": "192.168.1.100",
    "deviceTypeName": "Kiosk",
    "deviceTypeId": "type001",
    "durationComponentLifeTime": 30,
    "openQrRangeFrom": 1000,
    "openQrRangeTo": 1999,
    "qrRangeFrom": 2000,
    "qrRangeTo": 2999,
    "usingScaner": true,
    "showAllUnits": false,
    "isActive": true,
    "isDeleted": false,
    "areaId": 1,
    "areaName": "Main Building",
    "note": "Main entrance kiosk",
    "description": "Kiosk at the main entrance",
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null,
    "usingRange": true,
    "autoGenerate": true
  }
]
GET /Device/{id} AUTH
Get device by ID.

Path Parameters: id (string) – Device ID

Response 200 OK
{
  "id": "dev001",
  "name": "Main Gate Kiosk",
  "deviceNo": 1,
  "deviceIp": "192.168.1.100",
  "deviceTypeName": "Kiosk",
  "deviceTypeId": "type001",
  "durationComponentLifeTime": 30,
  "openQrRangeFrom": 1000,
  "openQrRangeTo": 1999,
  "qrRangeFrom": 2000,
  "qrRangeTo": 2999,
  "usingScaner": true,
  "showAllUnits": false,
  "isActive": true,
  "isDeleted": false,
  "areaId": 1,
  "areaName": "Main Building",
  "note": "Main entrance kiosk",
  "description": "Kiosk at the main entrance",
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null,
  "usingRange": true,
  "autoGenerate": true
}
GET /Device/device-Ip/{ip} AUTH
Get device by IP address.

Path Parameters: ip (string) – Device IP address

Response 200 OK
{
  "id": "dev001",
  "name": "Main Gate Kiosk",
  "deviceNo": 1,
  "deviceIp": "192.168.1.100",
  "deviceTypeName": "Kiosk",
  "deviceTypeId": "type001",
  "durationComponentLifeTime": 30,
  "openQrRangeFrom": 1000,
  "openQrRangeTo": 1999,
  "qrRangeFrom": 2000,
  "qrRangeTo": 2999,
  "usingScaner": true,
  "showAllUnits": false,
  "isActive": true,
  "isDeleted": false,
  "areaId": 1,
  "areaName": "Main Building",
  "note": "Main entrance kiosk",
  "description": "Kiosk at the main entrance",
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null,
  "usingRange": true,
  "autoGenerate": true
}
POST /Device/create AUTH
application/json
Create a new device.
Request Body:
{
  "name": "South Gate Kiosk",
  "deviceNo": 2,
  "password": "devicePass123",
  "userName": "kioskUser",
  "deviceIp": "192.168.1.101",
  "databaseName": "KioskDB",
  "printerName": "Zebra ZD420",
  "cameraName": "Logitech C920",
  "durationComponentLifeTime": 30,
  "qrRangeFrom": 3000,
  "qrRangeTo": 3999,
  "deviceTypeId": "type001",
  "areaId": 2,
  "serverId": "server001",
  "note": "South entrance kiosk",
  "description": "Kiosk at the south entrance",
  "usingScaner": true,
  "showAllUnits": false,
  "isActive": true,
  "usingRange": true,
  "autoGenerate": true
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device created successfully",
  "data": "dev002"
}
POST /Device/edit/{id} AUTH
application/json
Update an existing device.

Path Parameters: id (string) – Device ID

Request body same as /Device/create plus Id field.

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device updated successfully",
  "data": "Device updated successfully"
}
POST /Device/UpdateDeviceIsActive AUTH
application/json
Activate or deactivate a device.
Request Body:
{
  "id": "dev001",
  "isActive": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device status updated successfully",
  "data": "Device status updated successfully"
}
POST /Device/UpdateUsingScanner AUTH
application/json
Update whether a device uses a scanner.
Request Body:
{
  "id": "dev001",
  "usingScaner": true
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device scanner status updated successfully",
  "data": "Device scanner status updated successfully"
}
POST /Device/UpdateShowAllUnits AUTH
application/json
Update device's show all units setting.
Request Body:
{
  "id": "dev001",
  "showAllUnits": true
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device show all units setting updated successfully",
  "data": "Device show all units setting updated successfully"
}
POST /Device/edit-deleted-device AUTH
application/json
Restore a soft-deleted device.
Request Body:
{
  "id": "dev001",
  "isDeleted": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device restored successfully",
  "data": "Device restored successfully"
}
POST /Device/delete/{id} AUTH
Soft-delete a device.

Path Parameters: id (string) – Device ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device deleted successfully",
  "data": "Device deleted successfully"
}

📟 Device Types

GET /deviceType/get AUTH
Get a list of all device types.
Response 200 OK
[
  {
    "id": "type001",
    "name": "Kiosk",
    "isDeleted": false,
    "note": "Self-service kiosk",
    "description": "Touch screen kiosk for visitor registration",
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null
  }
]
GET /deviceType/{id} AUTH
Get device type by ID.

Path Parameters: id (string) – Device Type ID

Response 200 OK
{
  "id": "type001",
  "name": "Kiosk",
  "isDeleted": false,
  "note": "Self-service kiosk",
  "description": "Touch screen kiosk for visitor registration",
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null
}
POST /deviceType/create AUTH
application/json
Create a new device type.
Request Body:
{
  "name": "Biometric Reader",
  "note": "Fingerprint scanner",
  "description": "Biometric fingerprint reader for access control"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device type created successfully",
  "data": "type003"
}
POST /deviceType/edit/{id} AUTH
application/json
Update an existing device type.

Path Parameters: id (string) – Device Type ID

Request Body:
{
  "id": "type001",
  "name": "Updated Kiosk",
  "note": "Updated note",
  "description": "Updated description"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device type updated successfully",
  "data": "Device type updated successfully"
}
POST /deviceType/edit-deleted-devicetype AUTH
application/json
Restore a soft-deleted device type.
Request Body:
{
  "id": "type001",
  "isDeleted": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device type restored successfully",
  "data": "Device type restored successfully"
}
POST /deviceType/delete/{id} AUTH
Soft-delete a device type.

Path Parameters: id (string) – Device Type ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Device type deleted successfully",
  "data": "Device type deleted successfully"
}

🖨️ Hardware

POST /hardware/printing AUTH
application/json
Send a print job to a printer.
Request Body:
{
  "printerName": "CUSTOM TG2480-H",
  "name": "John Smith",
  "areaName": "Main Building",
  "areaId": 1,
  "registerationDate": "2024-01-15 09:30:00",
  "qrBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Print job sent successfully",
  "data": "Print job sent successfully"
}

📄 Invitation Document Type

GET /InvitationDocType/get AUTH
Get a list of all invitation document types.
Response 200 OK
[
  {
    "id": 1,
    "name": "National ID",
    "note": "National identity card",
    "description": "Official government ID",
    "isDeleted": false,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null
  }
]
GET /InvitationDocType/{id} AUTH
Get invitation document type by ID.

Path Parameters: id (int) – Invitation Document Type ID

Response 200 OK
{
  "id": 1,
  "name": "National ID",
  "note": "National identity card",
  "description": "Official government ID",
  "isDeleted": false,
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null
}
POST /InvitationDocType/create AUTH
application/json
Create a new invitation document type.
Request Body:
{
  "name": "Driver License",
  "note": "Driver's license",
  "description": "Official driver's license"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Invitation document type created successfully",
  "data": "3"
}
POST /InvitationDocType/edit/{id} AUTH
application/json
Update an existing invitation document type.

Path Parameters: id (int) – Invitation Document Type ID

Request Body:
{
  "id": 1,
  "name": "Updated National ID",
  "note": "Updated note",
  "description": "Updated description"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Invitation document type updated successfully",
  "data": "Invitation document type updated successfully"
}
POST /InvitationDocType/edit-deleted-InviatationDocType/{id} AUTH
application/json
Restore a soft-deleted invitation document type.

Path Parameters: id (int) – Invitation Document Type ID

Request Body:
{
  "id": 1,
  "isDeleted": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Invitation document type restored successfully",
  "data": "Invitation document type restored successfully"
}
POST /InvitationDocType/delete/{id} AUTH
Soft-delete an invitation document type.

Path Parameters: id (int) – Invitation Document Type ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Invitation document type deleted successfully",
  "data": "Invitation document type deleted successfully"
}

📨 Invitations

GET /invitation/get-all AUTH
Get paginated list of invitations.
Query Parameters:
ParameterTypeRequiredDescription
PageNumberintNoPage number (default: 1)
PageSizeintNoPage size (default: 10)
SearchstringNoSearch term
CreateDateFromDateTimeNoCreation date from
CreateDateToDateTimeNoCreation date to
RegistrationDateFromDateTimeNoRegistration date from
RegistrationDateToDateTimeNoRegistration date to
ExpiryDateFromDateTimeNoExpiry date from
ExpiryDateToDateTimeNoExpiry date to
StatusbyteNoInvitation status
IsSuccessstringNoSuccess flag
orderbystringNoOrder by field (default: "CreateDate")
orderbyTypestringNoOrder type (ASC/DESC, default: "ASC")
ActiveDateDateTimeNoActive date
ExpiryDateDateTimeNoExpiry date
VisitTypeIdintNoVisit type ID
GroupIdstringNoGroup ID filter
Response 200 OK
{
  "items": [
    {
      "id": "inv001",
      "fullName": "John Smith",
      "email": "john.smith@example.com",
      "phone": "+1234567890",
      "documentId": "ID123456",
      "cardNumber": "CARD001",
      "areaNames": "Main Building, Floor 1",
      "areaId": 1,
      "qrLink": "https://example.com/qr/inv001",
      "invitDocType": 1,
      "name": "National ID",
      "visitorImage": "https://example.com/visitor.jpg",
      "registrationDate": "2024-01-15T09:30:00Z",
      "expiryDate": "2024-01-15T17:30:00Z",
      "createDate": "2024-01-15T09:30:00Z",
      "status": 1,
      "visitType": "Business",
      "customVisitType": null,
      "createdUserId": "user123",
      "createdUserName": "Admin User",
      "lastUpdatedUserId": null,
      "updatedUserName": null,
      "isSuccess": false,
      "documentImage": "https://example.com/document.jpg",
      "transactionType": null,
      "company": "ABC Corp",
      "statusValue": "Active"
    }
  ],
  "totalCount": 150,
  "pageNumber": 1,
  "pageSize": 10,
  "totalPages": 15
}
GET /invitation/get-all-groups AUTH
Get all invitation groups.
Query Parameters:
searchstringNoSearch term for groups
Response 200 OK
[
  {
    "groupId": "grp001",
    "groupLabel": "Conference Attendees",
    "invitationCount": 25,
    "createdDate": "2024-01-10T10:00:00Z"
  }
]
GET /invitation/get/{id} AUTH
Get invitation by ID.

Path Parameters: id (string) – Invitation ID

Response 200 OK
{
  "id": "inv001",
  "fullName": "John Smith",
  "resone": "Business meeting",
  "email": "john.smith@example.com",
  "phone": "+1234567890",
  "status": 1,
  "documentImage": "https://example.com/document.jpg",
  "documentId": "ID123456",
  "registrationDate": "2024-01-15T09:30:00Z",
  "visitorImage": "https://example.com/visitor.jpg",
  "expiryDate": "2024-01-15T17:30:00Z",
  "cardNumber": "CARD001",
  "qrLink": "https://example.com/qr/inv001",
  "isSuccess": false,
  "areaNames": "Main Building, Floor 1, Office 101",
  "invitDocType": 1,
  "name": "National ID",
  "note": "VIP visitor",
  "description": "Important client meeting",
  "transactionType": null,
  "visitType": "Business",
  "customVisitType": null,
  "invitationCount": 1,
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "company": "ABC Corp",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "statusValue": "Active",
  "invitations": [],
  "firstInvitation": null,
  "lastInvitation": null,
  "firstTransaction": null,
  "lastTransaction": null
}
GET /invitation/getbydocumentid AUTH
Get invitations by document ID.
Query Parameters:
documentIdstringYesDocument ID
Response 200 OK
[
  {
    "id": "inv001",
    "fullName": "John Smith",
    "email": "john.smith@example.com",
    "phone": "+1234567890",
    "documentId": "ID123456",
    "cardNumber": "CARD001",
    "areaNames": "Main Building, Floor 1",
    "areaId": 1,
    "qrLink": "https://example.com/qr/inv001",
    "invitDocType": 1,
    "name": "National ID",
    "visitorImage": "https://example.com/visitor.jpg",
    "registrationDate": "2024-01-15T09:30:00Z",
    "expiryDate": "2024-01-15T17:30:00Z",
    "createDate": "2024-01-15T09:30:00Z",
    "status": 1,
    "visitType": "Business",
    "customVisitType": null,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "isSuccess": false,
    "documentImage": "https://example.com/document.jpg",
    "transactionType": null,
    "company": "ABC Corp",
    "statusValue": "Active"
  }
]
POST /invitation/create AUTH
multipart/form-data
Create a new invitation.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
FullNamestringNoVisitor's full name
EmailstringNoVisitor's email
PhonestringNoVisitor's phone
ImageIFormFileNoVisitor's image file
PersonImageIFormFileNoPerson image file
VisitorImagestringNoVisitor image URL
DocumentImagestringNoDocument image URL
DocumentIdstringNoDocument ID number
RegistrationDateDateTimeNoRegistration date (default: now)
ExpiryDateDateTimeNoExpiry date (default: now + 30min)
CardNumberstringNoCard number
AreaIdintYesArea/unit ID
ResonestringNoReason for visit
NotestringNoAdditional notes
DescriptionstringNoDescription
InvitDocTypeintYesInvitation document type ID
DeviceIpstringYesDevice IP address
VisitTypesIdintNoVisit type ID
CustomVisitTypestringNoCustom visit type
GroupIdstringNoGroup ID
GroupLabelstringNoGroup label
CompanystringNoCompany name
Response 200 OK
{
  "qrLink": "https://example.com/qr/inv002",
  "id": "inv002"
}
POST /invitation/createGroup AUTH
multipart/form-data
Create a group of invitations.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
GroupLabelstringNoLabel for the group
InvitationsJsonListYesJSON strings of InvitationCreateRequest
ImagesListNoImage files for each invitation
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Group created successfully",
  "data": "grp002"
}
POST /invitation/cancle AUTH
application/json
Cancel an invitation.
Request Body:
{
  "registrationId": "inv001"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Invitation cancelled successfully",
  "data": "Invitation cancelled successfully"
}

👥 Roles

GET /role/get-role AUTH
Get a list of all roles.
Response 200 OK
[
  { "id": "role001", "name": "Admin" },
  { "id": "role002", "name": "User" }
]
GET /role/get-role-permission/{roleId} AUTH
Get permissions for a specific role.

Path Parameters: roleId (string) – Role ID

Response 200 OK
{
  "roleId": "role001",
  "roleName": "Admin",
  "permissions": [
    {
      "module": "Area",
      "permissions": [
        { "name": "Index", "value": true },
        { "name": "Create", "value": true }
      ]
    }
  ]
}
POST /role/create-role AUTH
multipart/form-data
Create a new role.
Request (Form Data):
roleNamestringYesName of the role
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Role created successfully",
  "data": "role004"
}
POST /role/create-permission AUTH
application/json
Assign permissions to a role.
Request Body:
{
  "roleId": "role001",
  "permissions": [
    {
      "module": "Area",
      "permissions": [
        { "name": "Index", "value": true },
        { "name": "Create", "value": true }
      ]
    }
  ]
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Permissions assigned successfully",
  "data": "Permissions assigned successfully"
}
POST /role/delete-role AUTH
multipart/form-data
Delete a role.
Request (Form Data):
roleIdstringYesRole ID to delete
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Role deleted successfully",
  "data": "Role deleted successfully"
}

⚙️ Settings

GET /setting AUTH
Get system settings.
Response 200 OK
{
  "integrationUrl": "https://integration.example.com",
  "isIntegrated": true,
  "rbhUrl": "https://rbh.example.com",
  "rbhUsername": "rbh_user",
  "emailAddress": "noreply@example.com",
  "emailDisplayName": "AVMS System",
  "emailPassword": null,
  "emailHost": "smtp.example.com",
  "emailPort": 587,
  "emailImageUrl": "https://example.com/email-logo.png"
}
GET /setting/GetIntegrationSettings AUTH
Get integration settings.
Response 200 OK
[
  {
    "id": "setting001",
    "key": "IntegrationUrl",
    "value": "https://integration.example.com",
    "description": "Integration bridge URL"
  }
]
POST /setting/TestConnection AUTH
application/json
Test database connection.
Request Body:
{
  "baseUrl": "https://integration.example.com"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Connection successful",
  "data": "Connected successfully"
}
POST /setting/TestConnectionEdit AUTH
application/json
Test edited connection settings.
Request Body:
{
  "id": "setting001",
  "integrationUrl": "https://new-integration.example.com",
  "isIntegrated": true
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Connection test successful",
  "data": "Connected successfully"
}
POST /setting/EmailSetting AUTH
multipart/form-data
Configure email settings.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
EmailstringYesEmail address
DisplayNamestringNoDisplay name
PasswordstringYesEmail password
HoststringNoSMTP host
PortintYesSMTP port
ImageIFormFileNoEmail logo image
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Email settings updated successfully",
  "data": "Email settings updated successfully"
}
POST /setting/BackupSettings AUTH
multipart/form-data
Configure backup settings.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
DatabaseNamestringYesDatabase name
BackupDirectorystringYesBackup directory path
BackupIntervalDayintYesBackup interval in days
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Backup settings updated successfully",
  "data": "Backup settings updated successfully"
}
GET /setting/GetRbhIntegrationSettings AUTH
Get RBH integration settings.
Response 200 OK
{
  "isIntegrated": true,
  "rbhUrl": "https://rbh.example.com",
  "rbhUsername": "rbh_user"
}
POST /setting/UpdateRbhIntegrationSettings AUTH
application/json
Update RBH integration settings.
Request Body:
{
  "isIntegrated": true,
  "rbhUrl": "https://rbh.example.com",
  "rbhUsername": "rbh_user",
  "rbhPassword": "rbh_password"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "RBH settings updated successfully",
  "data": "RBH settings updated successfully"
}
POST /setting/TestRbhConnection AUTH
application/json
Test RBH connection.
Request Body:
{
  "rbhUrl": "https://rbh.example.com",
  "rbhUsername": "rbh_user",
  "rbhPassword": "rbh_password"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "RBH connection successful",
  "data": "Connected to RBH successfully"
}

🖥️ Terminal

GET /terminal/get-unit AUTH
Get unit information by device IP.
Query Parameters:
ipstringYesDevice IP address
Response 200 OK
[
  {
    "unitName": "Main Building",
    "unitOwner": "Jane Doe",
    "unitParent": "Headquarters",
    "unitGrandParent": "Organization",
    "unitId": 1,
    "ownerPicture": "https://example.com/owner.jpg",
    "availableFrom": "08:00:00",
    "availableTo": "18:00:00",
    "isOpen": true,
    "logo": "https://example.com/logo.png"
  }
]

🔄 Transaction

POST /transaction/create AUTH
application/json
Create a new transaction.
Request Body:
{
  "invitationId": "inv001",
  "transactionType": "Entry",
  "createDate": "2024-01-15T09:30:00Z",
  "cardNumber": "CARD001"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Transaction created successfully",
  "data": "trans001"
}

👤 Users

GET /user/get-users AUTH
Get a list of all users.
Response 200 OK
[
  {
    "userId": "user123",
    "username": "jane.doe",
    "email": "jane.doe@example.com",
    "isActive": true,
    "pictureUrl": "https://example.com/user.jpg",
    "roles": ["Admin", "User"],
    "accountStatus": "Active",
    "emailConfirmed": true,
    "phoneNumber": "+1234567890",
    "isDeleted": false,
    "uniqCode": "DEVICE001",
    "createdUserId": "admin123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null,
    "areas": [
      { "areaId": 1, "areaName": "Main Building" }
    ]
  }
]
GET /user/{id} AUTH
Get user by ID.

Path Parameters: id (string) – User ID

Response 200 OK
{
  "userId": "user123",
  "username": "jane.doe",
  "email": "jane.doe@example.com",
  "isActive": true,
  "pictureUrl": "https://example.com/user.jpg",
  "roles": ["Admin", "User"],
  "accountStatus": "Active",
  "emailConfirmed": true,
  "phoneNumber": "+1234567890",
  "isDeleted": false,
  "uniqCode": "DEVICE001",
  "createdUserId": "admin123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null,
  "areas": [
    { "areaId": 1, "areaName": "Main Building" }
  ]
}
GET /user/account-status AUTH
Get users account status statistics.
Response 200 OK
[
  { "status": "Pending", "value": 0 },
  { "status": "Accept", "value": 1 },
  { "status": "Reject", "value": 2 }
]
GET /user/get-user-roles/{userId} AUTH
Get roles assigned to a user.

Path Parameters: userId (string) – User ID

Response 200 OK
{
  "userId": "user123",
  "username": "jane.doe",
  "roles": [
    { "roleId": "role001", "roleName": "Admin", "isSelected": true },
    { "roleId": "role002", "roleName": "User", "isSelected": true }
  ]
}
POST /user/assign-role AUTH
application/json
Assign roles to a user.
Request Body:
{
  "userId": "user123",
  "roles": [
    { "roleId": "role001", "roleName": "Admin", "isSelected": true },
    { "roleId": "role002", "roleName": "User", "isSelected": false }
  ]
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Roles assigned successfully",
  "data": "Roles assigned successfully"
}
POST /user/account-status AUTH
application/json
Update user account status.
Request Body:
{
  "id": "user123",
  "accountStatus": 1
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "User account status updated successfully",
  "data": "User account status updated successfully"
}
POST /user/UpdateUser AUTH
multipart/form-data
Update user information.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
IdstringYesUser ID
UsernamestringYesUsername
EmailstringYesEmail
PhoneNumberstringYesPhone number
ImageIFormFileNoProfile image
PictureUrlstringNoProfile image URL
AreaIdsListNoArea IDs
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "User updated successfully",
  "data": "User updated successfully"
}
POST /user/UserIsActive AUTH
application/json
Activate or deactivate a user.
Request Body:
{
  "userId": "user123",
  "isActive": true
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "User active status updated successfully",
  "data": "User active status updated successfully"
}
POST /user/edit-deleted-users AUTH
application/json
Restore a soft-deleted user.
Request Body:
{
  "id": "user123",
  "isDeleted": false
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "User restored successfully",
  "data": "User restored successfully"
}
POST /user/delete AUTH
application/json
Soft-delete a user.
Request Body:
{
  "id": "user123"
}
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "User deleted successfully",
  "data": "User deleted successfully"
}

🏢 Visit Types

GET /visitTypes/get AUTH
Get a list of all visit types.
Response 200 OK
[
  {
    "id": 1,
    "name": "Business",
    "pictureUrl": "https://example.com/business.png",
    "note": "Business meetings",
    "description": "Official business visits",
    "isDeleted": false,
    "createdUserId": "user123",
    "createdUserName": "Admin User",
    "lastUpdatedUserId": null,
    "updatedUserName": null,
    "deletedUserId": null,
    "deletedUserName": null
  }
]
GET /visitTypes/{id} AUTH
Get visit type by ID.

Path Parameters: id (int) – Visit Type ID

Response 200 OK
{
  "id": 1,
  "name": "Business",
  "pictureUrl": "https://example.com/business.png",
  "note": "Business meetings",
  "description": "Official business visits",
  "isDeleted": false,
  "createdUserId": "user123",
  "createdUserName": "Admin User",
  "lastUpdatedUserId": null,
  "updatedUserName": null,
  "deletedUserId": null,
  "deletedUserName": null
}
POST /visitTypes/create AUTH
multipart/form-data
Create a new visit type.
Request Parameters (Form Data):
ParameterTypeRequiredDescription
NamestringYesVisit type name
PictureUrlstringNoImage URL
ImageIFormFileNoImage file
NotestringNoAdditional notes
DescriptionstringNoDescription
Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Visit type created successfully",
  "data": "3"
}
POST /visitTypes/edit/{id} AUTH
multipart/form-data
Update an existing visit type.

Path Parameters: id (int) – Visit Type ID

Request parameters same as /visitTypes/create plus Id field.

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Visit type updated successfully",
  "data": "Visit type updated successfully"
}
POST /visitTypes/delete/{id} AUTH
Delete a visit type.

Path Parameters: id (int) – Visit Type ID

Response 200 OK
{
  "statusCode": 200,
  "succeeded": true,
  "message": "Visit type deleted successfully",
  "data": "Visit type deleted successfully"
}