Skip to content

Ledger

A ledger is the book a company keeps its postings in, scoped to one company and one currency and linked to a chart-of-account record.

Base path: https://api-etl.akaun.com/core2/tnt/dm/erp/fi/ledgers

See ERP Core API for authentication, the response envelope, and shared query parameters.


Permissions

The access key’s owner needs one of these for each operation:

OperationPermissions (any one)
CreateAPI_TNT_DM_ERP_FI_MST_LEDGER_OWNER, API_TNT_DM_ERP_FI_MST_LEDGER_ADMIN, API_TNT_DM_ERP_FI_MST_LEDGER_CREATE
Read..._LEDGER_OWNER, ..._LEDGER_ADMIN, API_TNT_DM_ERP_FI_MST_LEDGER_READ
Update..._LEDGER_OWNER, ..._LEDGER_ADMIN, API_TNT_DM_ERP_FI_MST_LEDGER_UPDATE
Delete..._LEDGER_OWNER, ..._LEDGER_ADMIN, API_TNT_DM_ERP_FI_MST_LEDGER_DELETE

A tenant owner or admin passes all of these regardless.


Endpoints

OperationIntegration path (/etl-ep)Back-office path
CreatePOST /etl-epPOST /
UpdatePUT /etl-epPUT /
DeleteDELETE /etl-ep/{guid}DELETE /{guid}
List allGET /etl-epGET /
Get oneGET /etl-ep/{guid}GET /{guid}
QueryGET /etl-ep/queryGET /query

The LedgerContainer

Every request body and response data object is a LedgerContainer:

{
  "bl_fi_mst_ledger_hdr": { },
  "bl_fi_mst_ledger_exts": [ ]
}

bl_fi_mst_ledger_exts holds optional extension rows and may be omitted or empty.

bl_fi_mst_ledger_hdr

FieldTypeOn createDescription
guidUUIDOptionalGenerated if omitted. Required on update.
guid_compUUIDRequiredThe company this ledger belongs to.
obj_typestringRequiredPRM for the company’s primary ledger, SEC for a secondary one. See below.
namestringRecommendedDisplay name.
codestringRecommendedShort code.
ccy_codestringOptionalCurrency, e.g. MYR.
chart_of_acc_hdr_guidUUIDOptionalLink to a chart of accounts record. Not normally set.
property_jsonobjectOptionalArbitrary extra properties. Defaults to {}.
statusstringOptionalDefaults to ACTIVE.
namespacestringOptionalNamespace for multi-app tenants.
module_guidUUIDOptionalOwning module.
applet_guidUUIDOptionalOwning applet.
acl_configobjectOptionalAccess-control configuration.
acl_policyobjectOptionalAccess-control policy.
revisionUUIDOptionalGenerated if omitted, and regenerated on every update.
vrsnstringServer-assignedVersion marker.
created_datedatetimeServer-assigned on createMust be sent back on update.
updated_datedatetimeServer-assigned
created_by_subject_guidUUIDServer-assigned on createSet from the access key’s owner. Must be sent back on update.
updated_by_subject_guidUUIDServer-assignedSet from the access key’s owner.

Only guid_comp and obj_type are required on create. A request carrying just those two succeeds.

A company may have only one PRM ledger. Creating a second primary ledger for the same guid_comp fails with API_TNT_DM_ERP_FI_MST_LEDGER_HDR_OBJECT_PRIMARY_LEDGER_ALREADY_EXISTS. Since most companies already have theirs, a ledger you create through the API will normally be SEC.

Omitting obj_type entirely fails with API_TNT_DM_ERP_FI_MST_LEDGER_HDR_OBJECT_OBJ_TYPE_IS_NULL_OR_EMPTY.


Create a ledger

POST /core2/tnt/dm/erp/fi/ledgers/etl-ep
curl -X POST "https://api-etl.akaun.com/core2/tnt/dm/erp/fi/ledgers/etl-ep" \
  -H "AccessId: YOUR_ACCESS_ID" \
  -H "AccessKey: YOUR_ACCESS_KEY" \
  -H "tenantCode: YOUR_TENANT_CODE" \
  -H "Content-Type: application/json" \
  -d '{
    "bl_fi_mst_ledger_hdr": {
      "name": "Secondary Ledger MYR",
      "code": "GL-SEC-MYR",
      "guid_comp": "3f2a7c10-9b4e-4d61-8a22-1c5e7f9d0b33",
      "obj_type": "SEC",
      "ccy_code": "MYR"
    },
    "bl_fi_mst_ledger_exts": []
  }'

Response: 200 OK with the created container. guid, status and revision are filled in for you:

{
  "code": "OK_RESPONSE",
  "data": {
    "bl_fi_mst_ledger_hdr": {
      "guid": "c4f9a2e8-5b31-4c78-9d06-2a8f1e7b3c95",
      "name": "Secondary Ledger MYR",
      "code": "GL-SEC-MYR",
      "guid_comp": "3f2a7c10-9b4e-4d61-8a22-1c5e7f9d0b33",
      "obj_type": "SEC",
      "ccy_code": "MYR",
      "property_json": {},
      "status": "ACTIVE",
      "revision": "7a2c9e14-8f35-4b60-a1d7-3c8b5f2e9d04",
      "created_date": "2026-09-14T13:31:43.931410146Z",
      "created_by_subject_guid": "1c76c817-d6ac-4058-81f3-87805600e583"
    },
    "bl_fi_mst_ledger_exts": []
  },
  "message": ""
}

Update a ledger

PUT /core2/tnt/dm/erp/fi/ledgers/etl-ep

Read the record first, modify it, and send the whole thing back. Update validation expects fields that are assigned by the server on create, so a hand-built payload is likely to be rejected.

On update, obj_type, created_date and created_by_subject_guid are all required alongside guid. Omitting them returns three errors at once:

API_TNT_DM_ERP_FI_MST_LEDGER_HDR_OBJECT_OBJ_TYPE_IS_NULL_OR_EMPTY
API_TNT_DM_ERP_FI_MST_LEDGER_HDR_OBJECT_CREATED_DATE_IS_NULL_OR_EMPTY
API_TNT_DM_ERP_FI_MST_LEDGER_HDR_OBJECT_CREATED_BY_SUBJECT_GUID_IS_NULL

Fields you leave out are not preserved, so round-tripping the record is the reliable approach.

# 1. read it
curl -s "https://api-etl.akaun.com/core2/tnt/dm/erp/fi/ledgers/etl-ep/c4f9a2e8-5b31-4c78-9d06-2a8f1e7b3c95" \
  -H "AccessId: YOUR_ACCESS_ID" \
  -H "AccessKey: YOUR_ACCESS_KEY" \
  -H "tenantCode: YOUR_TENANT_CODE"

# 2. change what you need inside data.bl_fi_mst_ledger_hdr, keep every other field,
#    then send the whole container back
curl -X PUT "https://api-etl.akaun.com/core2/tnt/dm/erp/fi/ledgers/etl-ep" \
  -H "AccessId: YOUR_ACCESS_ID" \
  -H "AccessKey: YOUR_ACCESS_KEY" \
  -H "tenantCode: YOUR_TENANT_CODE" \
  -H "Content-Type: application/json" \
  -d '{
    "bl_fi_mst_ledger_hdr": {
      "guid": "c4f9a2e8-5b31-4c78-9d06-2a8f1e7b3c95",
      "name": "Secondary Ledger MYR (revised)",
      "code": "GL-SEC-MYR",
      "guid_comp": "3f2a7c10-9b4e-4d61-8a22-1c5e7f9d0b33",
      "obj_type": "SEC",
      "ccy_code": "MYR",
      "status": "ACTIVE",
      "revision": "7a2c9e14-8f35-4b60-a1d7-3c8b5f2e9d04",
      "created_date": "2026-09-14T13:31:43.931410146Z",
      "created_by_subject_guid": "1c76c817-d6ac-4058-81f3-87805600e583"
    },
    "bl_fi_mst_ledger_exts": []
  }'

Permission on update is also checked against the specific ledger, so a user granted ..._UPDATE on one ledger only cannot modify another.


Delete a ledger

DELETE /core2/tnt/dm/erp/fi/ledgers/etl-ep/{guid}
curl -X DELETE "https://api-etl.akaun.com/core2/tnt/dm/erp/fi/ledgers/etl-ep/c4f9a2e8-5b31-4c78-9d06-2a8f1e7b3c95" \
  -H "AccessId: YOUR_ACCESS_ID" \
  -H "AccessKey: YOUR_ACCESS_KEY" \
  -H "tenantCode: YOUR_TENANT_CODE"

Response

{ "code": "OK_RESPONSE", "data": true, "message": "" }

Returns 404 with CLIENT_VALIDATION_GUID_DOES_NOT_EXIST if no such ledger exists.

A PRM ledger cannot be deleted. A company’s primary ledger is protected, and the attempt is returned as 404 CLIENT_VALIDATION_GUID_DOES_NOT_EXIST, the same response as a GUID that does not exist. If a delete returns 404 on a ledger you know is there, check its obj_type.

List all ledgers

GET /core2/tnt/dm/erp/fi/ledgers/etl-ep

Returns every ledger the key’s owner may read, as a streamed array. There is no paging on this endpoint. Use /etl-ep/query when you need to page.


Get one ledger

GET /core2/tnt/dm/erp/fi/ledgers/etl-ep/{guid}

Returns a single LedgerContainer, 403 if the key’s owner lacks read permission on that record, or 404 if it does not exist.


Query ledgers

GET /core2/tnt/dm/erp/fi/ledgers/etl-ep/query

In addition to the shared query parameters:

ParameterTypeDescription
guid_compUUIDFilter by company.
ccy_codestringFilter by currency.
chart_of_acc_hdr_guidUUIDFilter by chart-of-account record.
namestringExact name match.
codestringExact code match.
obj_typestringFilter by ledger type.
guidsUUID setFetch a specific set of ledgers. Repeat the parameter.
hdr_guidUUIDFilter extension rows by their header.
namespacestringFilter by namespace.
module_guidUUIDFilter by module.
applet_guidUUIDFilter by applet.
ext_guidsUUID setFilter by extension GUIDs. Repeat the parameter.
revisionUUIDFilter by revision.
vrsnstringFilter by version.
curl -G "https://api-etl.akaun.com/core2/tnt/dm/erp/fi/ledgers/etl-ep/query" \
  -H "AccessId: YOUR_ACCESS_ID" \
  -H "AccessKey: YOUR_ACCESS_KEY" \
  -H "tenantCode: YOUR_TENANT_CODE" \
  --data-urlencode "ccy_code=MYR" \
  --data-urlencode "status=ACTIVE" \
  --data-urlencode "limit=50" \
  --data-urlencode "calcTotalRecords=true"

Response

{
  "code": "OK_RESPONSE",
  "data": [
    {
      "bl_fi_mst_ledger_hdr": {
        "guid": "c4f9a2e8-5b31-4c78-9d06-2a8f1e7b3c95",
        "name": "General Ledger MYR",
        "code": "GL-MYR",
        "ccy_code": "MYR",
        "status": "ACTIVE"
      },
      "bl_fi_mst_ledger_exts": []
    }
  ],
  "totalRecords": 3,
  "offset": 0,
  "limit": 50,
  "message": ""
}
Last updated on