A
Aliste Volta / API
Staging Postman

API reference

The Aliste Volta API is organized around REST. Requests use JSON-encoded bodies, return JSON-encoded responses, and use standard HTTP response codes and verbs.

Base URL
https://test.alistetechnologies.com
Authentication
HTTP Basic — base64(keyId:keyPassword)

Authentication #

The Aliste Volta API uses HTTP Basic authentication. Generate an API key from your dashboard with the roles you need; the password is shown only once, so store it securely.

Use the keyId as the username and the keyPassword as the password. Base64-encode them together as keyId:keyPassword and pass the result in an Authorization header.

All API requests must be made over HTTPS. Requests made without authentication, or with an expired key, will fail.

Keep your keys secret. Your API keys carry many privileges — do not share them in publicly accessible places such as GitHub, client-side code, or screenshots.
curl https://test.alistetechnologies.com/integration/room/details \
  -H "Authorization: Basic MjJVeHFkN2o6Y0p3bmdYSFI4cTJGTzhuYm84YVYwRGZoMEl5eVRzd1A=" \
  -H "Content-Type: application/json" \
  -d '{"roomId":"TEST001"}'
const token = Buffer
  .from(`${keyId}:${keyPassword}`)
  .toString('base64');

await fetch('https://test.alistetechnologies.com/integration/room/details', {
  method: 'POST',
  headers: {
    'Authorization': `Basic ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ roomId: 'TEST001' })
});

Errors #

Aliste Volta uses conventional HTTP response codes. Codes in the 2xx range indicate success; codes in the 4xx range indicate a client error; codes in the 5xx range indicate a server error.

Every response — successful or not — has the same envelope, so your code can branch on a single boolean.

Response envelope

successboolean

true if the request was successful, false otherwise.

messagestring

Human-readable description. On errors, this explains what went wrong.

dataobject

The payload — shape varies by endpoint. May be {} on errors.

{
  "success": true,
  "message": "Room fetched successfully",
  "data": { "room": { /* ... */ } }
}
{
  "success": false,
  "message": "Missing fields: roomId",
  "data": {}
}

Quickstart #

Five steps to take your integration from zero to live. Steps 1 and 2 are completed by your Aliste admin; the rest are handled by your engineering team.

1
Admin
Share access
2
Admin
Create API key
3
You
List properties
4
You
Map your IDs
5
You
Use your IDs
1
Admin

Get share access

Ask your Aliste admin to grant your team integration access from the Share access section of the dashboard. This is what authorises your organisation to issue API keys.

2
Admin

Create a production API key

From the API Keys section, your admin generates a production key for the integration and grants it access to all properties you intend to integrate.

The key's password is shown only once — store it in your secret manager before closing the dialog. You'll use it in every request as Basic base64(keyId:keyPassword).

3
You

List all properties

Call GET /integration/property/all/details once with your new key. The response enumerates every property and room you have access to — each one carries an alisteId you'll reference in the next step.

4
You

Map your IDs

Link your records with Aliste's. Two approaches get you there — the only real difference is where the mapping lives.

Approach 1
Aliste holds the mapping
Your ID configure Aliste

For each property, call Update a property once — pass Aliste's alisteId as propertyId and your own ID as referenceId. Repeat for every room via Update a room.

One-time write to Aliste
Approach 2
Your system holds the mapping
Aliste ID save Your DB

Skip the configure calls entirely. Store each alisteId from step 3 against the matching property and room in your own database, keyed however you like.

Zero writes to Aliste
5
You

Use your IDs going forward

You're done. Every endpoint accepts either ID — send whichever you persisted in step 4.

Approach 1 · continued
Send your own IDs
"roomId": "YOUR_ROOM_42"

Call every API with the IDs already in your database. Aliste resolves them through the referenceId you wrote — there's nothing else to store on your side.

Approach 2 · continued
Send Aliste's IDs
"roomId": "66fe39d2…f8c0"

Pass the alisteId you saved as propertyId / roomId in every call. No client-side reference IDs need to live on Aliste's records.


List all properties #

Returns every property accessible to your API key, fully expanded with rooms and common areas. No body required.

GET/integration/property/all/details
curl https://test.alistetechnologies.com/integration/property/all/details \
  -H "Authorization: Basic {token}"
{
  "success": true,
  "message": "Properties and rooms fetched successfully",
  "data": {
    "properties": [
      {
        "id": "PROP12345",
        "name": "Sample Property Alpha",
        "cpu": 8,
        "cpdu": 12,
        "mnb": 0,
        "meb": 200,
        "minRecharge": 150,
        "alisteId": "66fe39d21cd53cdac238f8c0",
        "supportNumbers": ["+919834343434"],
        "supportEmails": ["support@example.com"],
        "rooms": [
          {
            "id": "TEST001",
            "name": "Room A-101",
            "cpu": 8,
            "cpdu": 12,
            "mnb": 0,
            "meb": 200,
            "balance": 540.25,
            "blocked": false,
            "devices": ["M240000"],
            "minRecharge": 150,
            "alisteId": "68134a6d6e9ecaea755243c1"
          }
        ],
        "commonAreas": [
          {
            "id": "CA1001",
            "name": "Recreation Hall",
            "cpu": 8,
            "cpdu": 12,
            "mnb": 0,
            "meb": 200,
            "balance": 0,
            "blocked": false,
            "devices": ["M310000"],
            "minRecharge": 150,
            "alisteId": "66fe39d21cd53cdac238f8c1"
          }
        ]
      }
    ]
  }
}

List rooms in a property #

Lists every room and common area under a property, with per-meter monitoring state.

POST/integration/property/rooms

Body parameters

propertyIdstringRequired

alisteId received from the List all properties API, or your Client Property ID.

curl https://test.alistetechnologies.com/integration/property/rooms \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"propertyId":"PROP12345"}'
{
  "success": true,
  "message": "Rooms fetched successfully",
  "data": {
    "room": [
      {
        "id": "TEST001",
        "name": "Room A-101",
        "cpu": 8,
        "cpdu": 12,
        "mnb": 0,
        "meb": 200,
        "balance": 540.25,
        "blocked": false,
        "devices": ["M240000"],
        "minRecharge": 150,
        "alisteId": "66fe39d21cd53cdac238f8c0",
        "monitoring": true
      }
    ],
    "commonAreas": [
      {
        "id": "CA1001",
        "name": "Recreation Hall",
        "cpu": 8,
        "cpdu": 12,
        "mnb": 0,
        "meb": 200,
        "balance": 0,
        "devices": ["M310000"],
        "minRecharge": 150,
        "alisteId": "66fe39d21cd53cdac238f8c1",
        "monitoring": true
      }
    ]
  }
}

Retrieve a property #

Returns the configuration of a single property including tariffs, minimums, and monitoring status.

POST/integration/property/detailsscope: property.view

Body parameters

propertyIdstringRequired

alisteId received from the List all properties API, or your Client Property ID.

curl https://test.alistetechnologies.com/integration/property/details \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"propertyId":"PROP12345"}'
{
  "success": true,
  "message": "Property fetched successfully",
  "data": {
    "property": {
      "id": "PROP12345",
      "name": "Sample Property Alpha",
      "cpu": 8,
      "cpdu": 12,
      "mnb": 0,
      "meb": 200,
      "minRecharge": 150,
      "propertyCode": "AB12CD",
      "supportNumbers": ["+919834343434"],
      "supportEmails": ["support@example.com"],
      "monitoring": true
    }
  }
}

Update a property #

Updates property-level settings such as unit cost and minimum recharge.

POST/integration/property/configurescope: property.update

Body parameters

propertyIdstringRequired

alisteId received from the List all properties API, or your Client Property ID.

cpunumberOptional

Cost per unit at the property.

cpdunumberOptional

Cost per DG / inverter unit.

mnbnumberOptional

Minimum negative balance allowed.

mebnumberOptional

Minimum expected balance.

minRechargenumberOptional

Minimum recharge amount enforced on payment links.

referenceIdstringOptional

Update or set your client-side property ID.

Updating these values propagates to every room currently mirroring the property's configuration. Rooms that have been individually configured are left untouched.
Example. A property is set to cpu: 8 and has three rooms. Rooms A and B inherit the property default, while Room C was individually configured to cpu: 10 via Update a room. Sending { "propertyId": "PROP12345", "cpu": 9 } moves Rooms A and B to cpu: 9 automatically, while Room C keeps its own cpu: 10.
curl https://test.alistetechnologies.com/integration/property/configure \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "propertyId": "PROP12345",
    "cpu": 9,
    "minRecharge": 200
  }'
{
  "success": true,
  "message": "Property updated successfully",
  "data": {
    "property": {
      "id": "PROP12345",
      "name": "Sample Property Alpha",
      "cpu": 9,
      "cpdu": 12,
      "mnb": 0,
      "meb": 200,
      "minRecharge": 200,
      "supportNumbers": ["+919834343434"],
      "supportEmails": ["support@example.com"]
    }
  }
}

Retrieve a room #

Fetches a room's full configuration including live device connection state and a real-time current balance (today's spend already deducted).

POST/integration/room/detailsscope: rooms.view

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

Response highlights

balancenumber

Stored room balance.

currentBalancenumber

balance minus today's consumption — what the tenant effectively has right now.

devicesStatusarray

Per-device connected flag fetched live from the meter cloud.

monitoringboolean

true if every meter on the room is being monitored.

blockingReasonstring

"negativeBalance" when the room is currently blocked due to a negative balance; otherwise an empty string.

curl https://test.alistetechnologies.com/integration/room/details \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"roomId":"TEST001"}'
{
  "success": true,
  "message": "Room fetched successfully",
  "data": {
    "room": {
      "id": "TEST001",
      "name": "Room A-101",
      "cpu": 8, "cpdu": 12,
      "mnb": 0, "meb": 200,
      "minRecharge": 150,
      "balance": 540.25,
      "currentBalance": 528.12,
      "blocked": false,
      "blockingReason": "",
      "monitoring": true,
      "devices": ["M240000"],
      "devicesStatus": [
        { "deviceId": "M240000", "connected": true }
      ]
    }
  }
}

List room users #

Returns every tenant currently attached to a room.

POST/integration/room/users/detailsscope: rooms.view

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

curl https://test.alistetechnologies.com/integration/room/users/details \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"roomId":"TEST001"}'
{
  "success": true,
  "message": "Room fetched successfully",
  "data": {
    "room": {
      "roomId": "TEST001",
      "alisteRoomId": "66fe39d21cd53cdac238f8c0",
      "users": [
        {
          "userId": "CLIENT_USR_88421",
          "alisteUserId": "66fe39d23cd53cdac238f8c0",
          "name": "Aarav Mehta",
          "mobile": "9999999999"
        }
      ]
    }
  }
}

Update a room #

Override property-level defaults for a single room. Only the fields you send are updated.

POST/integration/room/configurescope: rooms.update

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

namestringOptional

Display name of the room.

cpunumberOptional

Cost per unit override.

cpdunumberOptional

Cost per DG / inverter unit.

mnbnumberOptional

Minimum negative balance allowed.

mebnumberOptional

Minimum expected balance.

minRechargenumberOptional

Minimum recharge amount.

referenceIdstringOptional

Replace your client-side room ID.

curl https://test.alistetechnologies.com/integration/room/configure \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "minRecharge": 250,
    "mnb": -100
  }'
{
  "success": true,
  "message": "Room updated successfully",
  "data": {
    "room": {
      "id": "TEST001",
      "name": "Room A-101",
      "cpu": 8,
      "cpdu": 12,
      "mnb": -100,
      "meb": 200,
      "balance": 540.25,
      "blocked": false,
      "devices": ["M240000"],
      "minRecharge": 250
    }
  }
}

Block or unblock a room #

Disconnects (or reconnects) the meter associated with a room. Blocking sends a power-cut command to the meter; the action is logged with the API key's identity and is reversible at any time.

POST/integration/room/blockUnblockscope: rooms.block / unblock

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

blockbooleanRequired

true to block, false to unblock.

controllerDetailsobjectOptional

Arbitrary metadata stored on the audit log (e.g. ticket reference, operator note).

curl https://test.alistetechnologies.com/integration/room/blockUnblock \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "block": true,
    "controllerDetails": { "reason": "Non-payment" }
  }'
{
  "success": true,
  "message": "Room blocked successfully",
  "data": {
    "room": {
      "id": "TEST001",
      "name": "Room A-101",
      "cpu": 8,
      "cpdu": 12,
      "mnb": 0,
      "meb": 200,
      "balance": 540.25,
      "blocked": true,
      "devices": ["M240000"],
      "minRecharge": 150
    }
  }
}

Room consumption #

Returns every deduction (energy and manual) on a room within a window. Dates must be UTC ISO-8601.

POST/integration/room/consumptionscope: deductions.view

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

startDatestring · ISO-8601Required

2025-01-15T00:00:00.000Z — inclusive.

endDatestring · ISO-8601Required

2025-01-31T23:59:59.999Z — exclusive.

Response highlights

isOfflineboolean

true when the deduction covers units the meter accumulated while disconnected, charged once it came back online — so startTime/endTime may span a longer window than a normal deduction.

curl https://test.alistetechnologies.com/integration/room/consumption \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "startDate": "2025-01-01T00:00:00.000Z",
    "endDate":   "2025-01-31T23:59:59.999Z"
  }'
{
  "success": true,
  "message": "Deductions fetched successfully",
  "data": {
    "deductions": [
      {
        "roomName": "Room A-101",
        "startTime": "2025-01-14T18:30:00.000Z",
        "endTime":   "2025-01-15T18:30:00.000Z",
        "amount": 42.50,
        "units": 5.31,
        "type": "Regular",
        "source": "energy",
        "isOffline": false,
        "deductionTime": "2025-01-15T18:30:05.000Z",
        "note": "",
        "userMessage": ""
      }
    ]
  }
}

Add user to room #

Adds a user to the specified room. If the user does not yet exist in Aliste, they are registered automatically and then attached to the room.

POST/integration/room/user/add

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

phoneNumberstringRequired

10-digit phone number. Only the last 10 digits are kept — prefixes are stripped.

firstNamestringRequired

First name of the tenant.

userIdstringRequired

Your unique user ID

lastNamestringOptional

Last name of the tenant.

emailstringOptional

Contact email for the tenant.

Errors

400
Room not found
No room matches the supplied ID for your client.
400
User already exists in this room
The phone number is already attached to this room.
400
User already exists in a room of a different property
The user is bound to a room in another property and must be removed first.
curl https://test.alistetechnologies.com/integration/room/user/add \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "phoneNumber": "9999999999",
    "firstName": "Aarav",
    "lastName": "Mehta",
    "email": "aarav@example.com",
    "userId": "CLIENT_USR_88421"
  }'
{
  "success": true,
  "message": "User added to the room successfully",
  "data": {}
}

Remove user from room #

Detaches a user from a room. The user remains in Aliste — only the room mapping is severed.

POST/integration/room/user/remove

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

phoneNumberstringRequired

10-digit phone number of the user to detach.

curl https://test.alistetechnologies.com/integration/room/user/remove \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "phoneNumber": "9999999999"
  }'
{
  "success": true,
  "message": "User removed from room",
  "data": {}
}

Update a user #

Updates the profile fields of an existing Aliste user. Identify the user by any unique identifier they were registered with (phone prefixed with +91, or your Client User ID). Only the fields you supply are changed.

POST/integration/user/update

Body parameters

userIdentifierstringRequired

Any unique identifier for the user — phone number (prefixed with +91), or your Client User ID.

first_namestringOptional

Updated first name of the user.

last_namestringOptional

Updated last name of the user.

emailstringOptional

Updated contact email for the user.

referenceIdstringOptional

Your unique user ID

Errors

400
user does not exist
No user in Aliste matches the supplied userIdentifier.
curl https://test.alistetechnologies.com/integration/user/update \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "userIdentifier": "+919999999999",
    "first_name": "Aarav",
    "last_name": "Mehta",
    "email": "aarav@example.com",
    "referenceId": "CLIENT_USR_88421"
  }'
{
  "success": true,
  "message": "User updated successfully",
  "data": {}
}

Create a recharge (SDK) #

Initiates a recharge and returns the PayU SDK parameters to open the PayU CheckoutPro screen inside your app. Use this when payment is collected in-app instead of via a hosted link. Accepts the same body as Create a recharge link; the response returns the SDK params and a tracking rechargeId instead of a paymentLink.

POST/integration/recharge/initiateThroughSDK
For SDK setup and how to launch the checkout, see PayU's official React Native CheckoutPro SDK guide. You don't need to build payUPaymentParams or payUCheckoutProConfig yourself — this API returns both, ready to pass straight into the SDK.

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

userIdentifierstringRequired

Tenant's user ID or phone (prefixed with +91).

amountnumberRequired

Recharge amount. Must be ≥ room.minRecharge.

notestringOptional

Internal note stored on the recharge.

Response fields

rechargeIdstring

Tracking ID of the recharge. Same value as payUPaymentParams.transactionId. Poll it via Retrieve a recharge or wait on the webhook.

payUPaymentParamsobject

Pass directly to the PayU CheckoutPro SDK. environment is "0" in production and "1" on test/staging.

payUCheckoutProConfigobject

UI/config object for the PayU CheckoutPro SDK.

Test PayU credentials to be sent from the client-side code

PayU key
zk2sQy
PayU salt
HhpUDRWc6KZvkLp0aph0TmoiRUZO47kP

Test card details

Number5123 4567 8901 2346
ExpiryAny future date — e.g. 05/27
CVV123 for success
OTP123456
curl https://test.alistetechnologies.com/integration/recharge/initiateThroughSDK \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "userIdentifier": "+919999999999",
    "amount": 1000,
    "note": "October recharge"
  }'
{
  "success": true,
  "message": "Payment initiated",
  "data": {
    "rechargeId": "66fe38d21cd53cdac238f8c0",
    "payUPaymentParams": {
      "key": "{payu-merchant-key}",
      "transactionId": "66fe38d21cd53cdac238f8c0",
      "amount": 1000,
      "productInfo": "{Client Name} SmartMeter Recharge",
      "firstName": "John",
      "email": "john@example.com",
      "phone": "9999999999",
      "ios_surl": "https://smartmeter.aliste.io/payment/success",
      "ios_furl": "https://smartmeter.aliste.io/payment/failed",
      "android_surl": "https://smartmeter.aliste.io/payment/success",
      "android_furl": "https://smartmeter.aliste.io/payment/failed",
      "environment": "0",
      "userCredential": "{payu-merchant-key}:{alisteUserId}",
      "additionalParam": {
        "udf1": "{clientId}",
        "udf2": "{propertyId}",
        "udf3": "{roomId}",
        "udf4": "{alisteUserId}",
        "udf5": "smartmeter-integration",
        "walletUrn": "1"
      }
    },
    "payUCheckoutProConfig": {
      "primaryColor": "#3b82f6",
      "secondaryColor": "#000000",
      "merchantName": "Alise Technologies",
      "merchantLogo": "A",
      "showExitConfirmationOnCheckoutScreen": true,
      "showExitConfirmationOnPaymentScreen": true,
      "cartDetails": [{ "Order": "Smart Recharge" }, { "Item": "Recharge" }],
      "paymentModesOrder": [
        { "UPI": "TEZ" },
        { "Wallets": "PAYTM" },
        { "EMI": "" },
        { "Wallets": "PHONEPE" }
      ],
      "surePayCount": 1,
      "merchantResponseTimeout": 10000,
      "autoSelectOtp": true,
      "autoApprove": false,
      "merchantSMSPermission": false,
      "showCbToolbar": true
    }
  }
}

Retrieve a recharge #

Look up the lifecycle and settlement details of a single recharge.

POST/integration/recharge/status

Body parameters

rechargeIdstringRequired

Returned from Create a recharge link or any webhook.

Response fields

statusenum

One of pending, success, failed.

amountnumber

Gross amount charged.

gatewayChargenumber

Payment-gateway fee deducted.

balanceAddednumber

Net amount credited to the room.

roomBalancenumber

Room balance after this recharge.

curl https://test.alistetechnologies.com/integration/recharge/status \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"rechargeId":"66fe38d21cd53cdac238f8c0"}'
{
  "success": true,
  "message": "Recharge fetched successfully",
  "data": {
    "status": "success",
    "amount": 1000,
    "gatewayCharge": 15,
    "paymentMode": "Card",
    "rechargeId": "66fe38d21cd53cdac238f8c0",
    "balanceAdded": 985,
    "rechargedAt": "2025-01-01T10:00:00.000Z",
    "createdAt":   "2025-01-01T10:00:00.000Z",
    "roomBalance": 2500.50,
    "phoneNumber": "9999999999",
    "roomId": "TEST001",
    "userId": "CLIENT_USR_88421",
    "userName": "Aarav Mehta",
    "metaData": {
      "alisteRoomId": "66fe39d21cd53cdac238f8c0",
      "alisteUserId": "66fe39d23cd53cdac238f8c0"
    }
  }
}

List recharges #

Lists every paid or failed recharge for a room in a date window, across PayU, Razorpay and manual entries.

POST/integration/room/rechargesscope: recharges.view

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

startDateISO-8601Required

UTC timestamp.

endDateISO-8601Required

UTC timestamp.

curl https://test.alistetechnologies.com/integration/room/recharges \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "startDate": "2025-01-01T00:00:00.000Z",
    "endDate":   "2025-01-31T23:59:59.999Z"
  }'
{
  "success": true,
  "message": "Recharges fetched successfully",
  "data": {
    "recharges": [
      {
        "roomName": "Room A-101",
        "tenantName": "Aarav Mehta",
        "paymentMode": "Card",
        "phone": "9999999999",
        "status": "paid",
        "transactionId": "66fe38d21cd53cdac238f8c0",
        "amount": 1000,
        "balanceAdded": 985,
        "gatewayCharges": 15,
        "rechargeDate": "2025-01-15T10:00:00.000Z",
        "userReason": "",
        "note": "October recharge"
      }
    ]
  }
}

Manual recharge #

Adds credit to a room balance without a payment gateway. Use for adjustments, cashback, or offline collections.

POST/integration/room/recharge/manual

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

amountnumberRequired

Credit amount. Must be ≥ 0.

notestringRequired

Internal/admin note.

userMessagestringRequired

Tenant-facing message shown on the transaction.

curl https://test.alistetechnologies.com/integration/room/recharge/manual \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "amount": 200,
    "note": "Goodwill credit for outage 14 Jan",
    "userMessage": "Credit for power outage"
  }'
{
  "success": true,
  "message": "Recharge created successfully",
  "data": {
    "room": {
      "id": "TEST001",
      "name": "Room A-101",
      "cpu": 8,
      "cpdu": 12,
      "mnb": 0,
      "meb": 200,
      "balance": 740.25,
      "blocked": false,
      "devices": ["M240000"],
      "minRecharge": 150
    }
  }
}

Manual deduction #

Pulls credit from a room balance. Use for penalties, CAM charges, or fixed-cost recoveries.

POST/integration/room/deduction/manual

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

amountnumberRequired

Amount to deduct. Must be ≥ 0.

notestringRequired

Internal note.

userMessagestringRequired

Tenant-facing reason.

sourcestringOptional

Defaults to Penalty. Pass an Aliste deduction source value to categorise.

curl https://test.alistetechnologies.com/integration/room/deduction/manual \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "amount": 150,
    "note": "CAM charges – Jan",
    "userMessage": "Common area maintenance",
    "source": "CAM"
  }'
{
  "success": true,
  "message": "Deduction created successfully",
  "data": {
    "room": {
      "id": "TEST001",
      "name": "Room A-101",
      "cpu": 8,
      "cpdu": 12,
      "mnb": 0,
      "meb": 200,
      "balance": 590.25,
      "blocked": false,
      "devices": ["M240000"],
      "minRecharge": 150
    }
  }
}

Device status #

Returns the live connection state of a smart meter. If the upstream meter cloud is unreachable, the call still returns success: true with connected: false — failures are normalised, not raised.

POST/integration/device/status

Body parameters

deviceIDstringRequired

The meter's serial identifier (e.g. M240000).

curl https://test.alistetechnologies.com/integration/device/status \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"deviceID":"M240000"}'
{
  "success": true,
  "message": "Device status fetched successfully",
  "data": { "connected": true }
}

Create a ticket #

Files a new support ticket against a room. The category and subcategory pair determines routing inside Aliste's support tooling.

POST/integration/ticket/create

Body parameters

roomIdstringRequired

alisteId received from the List all properties API, or your Client Room ID.

categorynumber · enumRequired

One of 0, 1, 2, 3, 4, 5, 6 — see matrix below.

subcategorynumber · enumRequired

One of 0, 1, 2 depending on the chosen category — see matrix below.

subjectstringOptional

Short title shown in the agent inbox.

descriptionstringOptional

Body of the ticket.

userIdentifierstringOptional

Tenant's userId or +91 phone number. If provided, must exist.

attachmentsURLsstring[]Optional

Publicly accessible media URLs.

Category & subcategory matrix

CatCategorySubSubcategory
0Other0Other
0Other1Raised By Toll Free
1Deductions0Over consumption
1Deductions1Cant see deduction
1Deductions2Power Disconnected
2Recharge0Recharge not reflected
2Recharge1Unable to recharge

Only a few rows are shown here for reference. Use the List ticket categories API to get the full, up-to-date list.

The same ticketId is returned when a matching ticket is already open. If a ticket for the same roomId, category, subcategory and userIdentifier already exists and is still in the Created state, the call returns that same ticketId instead of opening a new ticket. The description from the new call is appended to the existing description (separated by |), and any attachmentsURLs are added to the ticket's existing media array. The subject, however, is overwritten by the value in the new call (if one is sent). A different user in the same room raising the same category and subcategory always gets a new ticket. Likewise, once the ticket is moved out of Created e.g. ongoing or resolved by one of our customer support agent, the next call opens a fresh ticket.
curl https://test.alistetechnologies.com/integration/ticket/create \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "roomId": "TEST001",
    "category": 2,
    "subcategory": 0,
    "subject": "My recharge isn't reflecting",
    "description": "Paid ₹500 30 minutes ago — still not in balance.",
    "userIdentifier": "+919999999999"
  }'
{
  "success": true,
  "message": "Ticket raised successfully",
  "data": { "ticketId": "Tdfds34" }
}

List ticket categories #

Returns the live category / subcategory matrix accepted by Create a ticket, with each numeric value and its label. Fetch this instead of hardcoding the matrix — new categories and subcategories are added over time, and this endpoint always reflects the current set.

GET/integration/ticket/categories

Response fields

categoriesobject[]

One entry per category. Other (0) is always returned last.

categories[].categorynumber

Value to send as category when creating a ticket.

categories[].labelstring

Human-readable category name.

categories[].subcategoriesobject[]

Valid subcategories for this category, each with a numeric subcategory and a label.

curl https://test.alistetechnologies.com/integration/ticket/categories \
  -H "Authorization: Basic {token}"
{
  "success": true,
  "message": "Ticket categories fetched successfully",
  "data": {
    "categories": [
      {
        "category": 1,
        "label": "Deductions",
        "subcategories": [
          { "subcategory": 0, "label": "Over consumption" },
          { "subcategory": 1, "label": "Cant see deduction" },
          { "subcategory": 2, "label": "Power Disconnected" }
        ]
      },
      {
        "category": 0,
        "label": "Other",
        "subcategories": [
          { "subcategory": 0, "label": "Other" },
          { "subcategory": 1, "label": "Raised By Toll Free" }
        ]
      }
    ]
  }
}

Retrieve a ticket #

Pulls a ticket by its ticketId along with its activity timeline.

POST/integration/ticket/fetch

Body parameters

ticketIdstringRequired

The ID returned from Create a ticket.

curl https://test.alistetechnologies.com/integration/ticket/fetch \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"ticketId":"Tdfds34"}'
{
  "success": true,
  "message": "Ticket fetched successfully",
  "data": {
    "ticket": {
      "id": "Tdfds34",
      "subject": "My recharge isn't reflecting",
      "description": "Paid ₹500 30 minutes ago...",
      "userId": "CLIENT_USR_88421",
      "userName": "Aarav",
      "roomId": "TEST001",
      "userContact": "aarav@example.com",
      "createdAt": "2025-01-01T10:00:00.000Z",
      "attachments": [],
      "status": "created",
      "activity": [
        { "status": "created",  "comment": "", "timestamp": "2025-01-01T10:00:00.000Z" },
        { "status": "resolved", "comment": "Refund processed", "timestamp": "2025-01-01T11:30:00.000Z" }
      ],
      "metaData": {
        "alisteRoomId": "66fe39d21cd53cdac238f8c0",
        "alisteUserId": "66fe39d23cd53cdac238f8c0"
      }
    }
  }
}

List done payouts #

Returns every completed payout for the given properties between two dates, with full recharge breakdown and invoice details.

POST/integration/payouts/done

Body parameters

propertyIdsstring[]Required

List of alisteIds (received from the List all properties API) or your Client Property IDs.

startDateISO-8601Required

Inclusive lower bound on transactionDate.

endDateISO-8601Required

Inclusive upper bound on transactionDate.

Response fields

payoutIdstring

Unique identifier for the payout record.

transactionIdstring

Bank reference ID from the transfer.

rechargeAmountnumber

Sum of all recharges in this payout window.

transferredAmountnumber

Net amount actually wired.

extraPropertiesPayoutsarray

Payouts spanning properties outside your key's scope — only IDs are returned.

curl https://test.alistetechnologies.com/integration/payouts/done \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "propertyIds": ["PROP12345", "PROP12346"],
    "startDate": "2024-01-14T18:30:00.000Z",
    "endDate":   "2025-11-14T18:30:00.000Z"
  }'
{
  "success": true,
  "message": "Payout fetched successfully",
  "data": {
    "payouts": [
      {
        "payoutId": "507f1f77bcf86cd799439011",
        "transactionId": "TXN123456789",
        "transactionDate": "2025-01-15T00:00:00.000Z",
        "method": "imps",
        "rechargeAmount": 5000,
        "invoiceAmount": 1500,
        "adjustmentAmount": 100,
        "transferredAmount": 3400,
        "properties": [
          { "name": "Sample Property", "propertyId": "PROP12345", "alistePropertyId": "507f191e810c19729de860ea" }
        ],
        "rechargeBreakdown": [
          { "propertyId": "PROP12345", "alistePropertyId": "507f191e810c19729de860ea", "propertyName": "Sample Property", "amount": 5000 }
        ],
        "invoices": [
          { "propertyId": "PROP12345", "alistePropertyId": "507f191e810c19729de860ea", "propertyName": "Sample Property", "amount": 1500, "invoiceId": "INV987654321" }
        ],
        "comment": "Monthly payout for January",
        "startDate": "2025-01-01T00:00:00.000Z",
        "endDate":   "2025-01-31T23:59:59.999Z"
      }
    ],
    "extraPropertiesPayouts": [
      { "payoutId": "507f1f77bcf86cd799439012" }
    ]
  }
}

Pending payouts #

Returns the running pending amount per property — recharges collected since the last payout minus any outstanding invoices.

POST/integration/payouts/pending

Body parameters

propertyIdsstring[]Required

List of alisteIds (received from the List all properties API) or your Client Property IDs.

curl https://test.alistetechnologies.com/integration/payouts/pending \
  -H "Authorization: Basic {token}" \
  -H "Content-Type: application/json" \
  -d '{"propertyIds":["PROP12345","PROP12346"]}'
{
  "success": true,
  "message": "Payout fetched successfully",
  "data": [
    {
      "propertyId": "PROP12345",
      "alistePropertyId": "670000000000000000000001",
      "propertyName": "Sample Property 1",
      "startDate": "2025-09-25T10:00:00.000Z",
      "endDate":   "2025-10-02T10:00:00.000Z",
      "totalRecharges": 1200,
      "invoiceAmount":  800,
      "adjustmentAmount": 0,
      "pendingAmount":  400
    }
  ]
}

Managing webhooks #

The Webhooks page in the Smart Meter dashboard lets you configure, track, and manage your webhook integrations — the real-time notifications Aliste sends to your applications, keeping your platform in sync automatically.

These steps cover setting up webhooks from the dashboard UI. For the JSON payloads Aliste delivers to your endpoint, see the Recharge status and Ticket status event references below.
Always reply with 200 OK within 5 seconds. Aliste retries non-2xx responses with exponential backoff.

Open the webhooks tab #

Where to find the Webhooks page in the dashboard — the entry point for creating, viewing, and deleting webhooks.

  1. Open volta.aliste.io.
  2. Scroll down to the bottom of the dashboard.
  3. Click the Webhooks tab to open it.
Watch tutorial

Add a webhook #

Register a new webhook by entering its endpoint URL, authorization details, and a header key/value pair. The dashboard confirms once it's created.

  1. Open the Webhooks tab.
  2. Click the Add webhook button.
  3. Select the client.
  4. Enter a name.
  5. Enter the purpose.
  6. Enter the endpoint URL.
  7. Select the event.
  8. Click Add header.
  9. Select the header key.
  10. Enter the header value.
  11. Click Submit.
A new webhook is created, and the dashboard confirms the addition with a success message.
Watch tutorial

Edit a webhook #

Update an existing webhook's settings — endpoint details, content type, or event selections — and save the changes.

  1. Open the Webhooks tab.
  2. Click the edit button on the webhook you want to change.
  3. Update the details as needed.
  4. Click Submit.
The webhook is updated, and the dashboard confirms the change.
Watch tutorial

Change webhook status #

Toggle a webhook between active and inactive. Inactive webhooks stop receiving notifications until reactivated.

  1. Open the Webhooks tab.
  2. Click the status toggle to mark the webhook active.
  3. Click it again to mark the webhook inactive.
Watch tutorial

Delete a webhook #

Permanently remove a webhook. A confirmation prompt guards against accidental deletion.

  1. Open the Webhooks tab.
  2. Click the Delete button on the webhook you want to remove.
  3. Click No to cancel, or Yes to confirm and delete the webhook.
Watch tutorial

Webhook events #

Once a webhook is configured in the dashboard, Aliste pushes a JSON payload to your endpoint whenever a subscribed event fires. These are the payloads you'll receive.

Recharge status webhook #

Sent when a recharge transitions to success or failed. The payload schema is identical to the Retrieve a recharge response.

{
  "status": "success",
  "amount": 1000,
  "gatewayCharge": 15,
  "paymentMode": "Card",
  "rechargeId": "66fe38d21cd53cdac238f8c0",
  "balanceAdded": 985,
  "createdAt":   "2025-01-01T10:00:00.000Z",
  "rechargedAt": "2025-01-01T10:00:00.000Z",
  "roomBalance": 2500.50,
  "phoneNumber": "9999999999",
  "roomId": "TEST001",
  "userId": "CLIENT_USR_88421",
  "userName": "Aarav Mehta",
  "metaData": {
    "alisteRoomId": "66fe39d21cd53cdac238f8c0",
    "alisteUserId": "66fe39d23cd53cdac238f8c0"
  }
}

Ticket status webhook #

Pushed on every ticket status transition. The activity array contains the complete history. Observed statuses: created, in_progress, resolved, closed.

{
  "ticketId": "Tdfds34",
  "status": "resolved",
  "createdAt": "2025-01-01T10:00:00.000Z",
  "subject": "My recharge isn't reflecting",
  "description": "Paid ₹500 30 minutes ago...",
  "phoneNumber": "9999999999",
  "userId": "CLIENT_USR_88421",
  "category": 2,
  "subcategory": 0,
  "activity": [
    { "status": "created",     "comment": "",                "timestamp": "2025-01-01T10:00:00.000Z" },
    { "status": "in_progress", "comment": "Looking into it", "timestamp": "2025-01-01T10:15:00.000Z" },
    { "status": "resolved",    "comment": "Refund processed","timestamp": "2025-01-01T11:30:00.000Z" }
  ]
}

Test credentials #

Use this demo Basic auth token against the staging base URL to validate your integration end-to-end.

Authorization header
Basic MjJVeHFkN2o6Y0p3bmdYSFI4cTJGTzhuYm84YVYwRGZoMEl5eVRzd1A=
curl https://test.alistetechnologies.com/integration/room/details \
  -H "Authorization: Basic MjJVeHFkN2o6Y0p3bmdYSFI4cTJGTzhuYm84YVYwRGZoMEl5eVRzd1A=" \
  -H "Content-Type: application/json" \
  -d '{"roomId":"TEST001"}'

Demo data #

Rooms wired up on staging. Only TEST001 is currently active.

NameReference IDDevice IDStatus
001TEST001M240000● active
002TEST002M310000idle
003TEST003M320000idle
004TEST004H320000idle
005TEST005H310000idle

© Aliste Technologies · Volta Integration API