{"id":7621,"date":"2026-09-25T16:01:51","date_gmt":"2026-09-25T09:01:51","guid":{"rendered":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/?p=7621"},"modified":"2026-09-25T16:01:51","modified_gmt":"2026-09-25T09:01:51","slug":"apitms_gdn","status":"publish","type":"post","link":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/","title":{"rendered":"TMS GDN Module"},"content":{"rendered":"<h5><strong>SKYBIZ API \u2014 TMS Module<\/strong><\/h5>\n<h3><strong>TMS GDN (Goods Delivery Note)<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The TMS GDN module allows you to retrieve, create, update, and delete Goods Delivery Note documents in SKYBIZ TMS. Each GDN has a <strong>header<\/strong> (document-level details such as origin\/destination and dates) and a nested <strong>items<\/strong> array (the line items being delivered). Supports <strong>read<\/strong>, <strong>create<\/strong>, <strong>update<\/strong>, and <strong>delete<\/strong> operations.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Endpoint:<\/strong> <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">\/apiv2\/modules\/tms_gdn.php<\/code><\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Required Permissions:<\/strong> TMS GDN \u2014 Read, TMS GDN \u2014 Create, TMS GDN \u2014 Update, TMS GDN \u2014 Delete (as applicable to the action used)<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Primary Key:<\/strong> <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">Doc1No<\/code> \u2014 unique per GDN document, and <strong>fixed<\/strong> once created (cannot be changed via <code>update<\/code>).<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Batch Limit:<\/strong> Maximum <strong>500 documents<\/strong> per request for <code>create<\/code>, <code>update<\/code>, and <code>delete<\/code>.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Data Wrapper Key:<\/strong> Documents for this module are wrapped under <code>gdn_data<\/code>.<\/p>\n<hr \/>\n<h3><strong>Header Fields<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">These are the only document-level (header) fields recognized by this module. Any other field name sent at the header level in a <code>create<\/code> or <code>update<\/code> request is rejected.<\/p>\n<div class=\"overflow-x-auto w-full px-2 mb-6\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Field<\/th>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Type<\/th>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>Doc1No<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Unique GDN document number. Primary key. Required for every action. <strong>Fixed<\/strong> \u2014 cannot be changed once created<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>DocDate<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Document date. Recommended format <code>YYYY-MM-DD<\/code> \u2014 also used by the <code>date_from<\/code>\/<code>date_to<\/code> read filters<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>DelivMode<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Delivery mode\/method for this GDN<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>FromLocCode<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Origin location code (e.g. warehouse\/shop the goods ship from)<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>FromLocName<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Origin location name<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>ToLocCode<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Destination location code (e.g. warehouse\/shop the goods ship to)<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>ToLocName<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Destination location name<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>DocumentType<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Document type classification for this GDN<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>OriginalDocNo<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Reference to an original\/source document, if any<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>AccountingDate<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Accounting date associated with this GDN<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>Remarks<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Header-level remarks\/notes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><strong>Line Fields (<code>items<\/code>)<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Each document carries a nested <code>items<\/code> array. These are the only fields recognized at the line level. A line&#8217;s internal sequence number is assigned automatically and is never sent or returned.<\/p>\n<div class=\"overflow-x-auto w-full px-2 mb-6\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Field<\/th>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Type<\/th>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>ItemCode<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Item code for this line<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>ItemName<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Item name for this line<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>Qty<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">float<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Quantity being delivered on this line. Returned as a float on read<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>ColorCode<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Colour code of the item variant on this line<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>ColorName<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Colour name of the item variant on this line<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>Size<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Size of the item variant on this line<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>UnitPrice<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">float<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Unit price for this line. Returned as a float on read<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>Amount<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">float<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Line amount (total for this line). Returned as a float on read<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>Remarks<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">string<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Line-level remarks\/notes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<hr \/>\n<h3><strong>Read TMS GDN<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Retrieves GDN documents, each returned with its header fields plus a nested <code>items<\/code> array. A document with no lines is still returned, with <code>items<\/code> as an empty array.<\/p>\n<h4>Base Request Structure<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"read\",\r\n  \"fields\": [\"Doc1No\", \"DocDate\", \"FromLocCode\", \"ToLocCode\"],\r\n  \"filters\": {\r\n    \"ToLocCode\": \"SHOP001\"\r\n  },\r\n  \"date_from\": \"2026-09-01\",\r\n  \"date_to\": \"2026-09-30\",\r\n  \"doc_nos\": [\"GDN-0001\", \"GDN-0002\"]\r\n}<\/pre>\n<h4>Request Parameters<\/h4>\n<div class=\"overflow-x-auto w-full px-2 mb-6\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Parameter<\/th>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Description<\/th>\n<th class=\"text-text-100 border-b-0.5 border-border-300\/60 py-2 pr-4 align-top font-bold\" scope=\"col\">Required<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>api_key<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Your API key<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Yes<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>api_secret<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Your API secret<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Yes<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>action<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Must be <code>\"read\"<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Yes<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>fields<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Array of <strong>header<\/strong> field names to return. Any name not in the Header Fields list is silently dropped. Omit or leave empty to return all header fields. Does not affect which line fields are returned \u2014 line fields are always returned in full<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">No<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>filters<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Object of <code>field: value<\/code> pairs, applied to header fields only. Each is an exact-match (<code>=<\/code>) condition, combined with AND. Keys outside the Header Fields list are ignored<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">No<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>date_from<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Return documents with <code>DocDate &gt;=<\/code> this date. Format <code>YYYY-MM-DD<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">No<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>date_to<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Return documents with <code>DocDate &lt;=<\/code> this date. Format <code>YYYY-MM-DD<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">No<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\"><code>doc_nos<\/code><\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">Array of specific <code>Doc1No<\/code> values to limit the read to. Combined with AND alongside any other filters\/date range<\/td>\n<td class=\"border-b-0.5 border-border-300\/30 py-2 pr-4 align-top\">No<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h4>Read Rules<\/h4>\n<ul>\n<li>Results are ordered by <code>Doc1No<\/code>, and each document&#8217;s lines are ordered by their internal sequence<\/li>\n<li><code>date_from<\/code> and <code>date_to<\/code> are both optional \u2014 unlike some modules, <strong>there is no maximum range enforced<\/strong> between them<\/li>\n<li><code>date_from<\/code>\/<code>date_to<\/code>, if provided, must match <code>YYYY-MM-DD<\/code> or the request is rejected<\/li>\n<li>No pagination \u2014 all matching documents are returned in a single response<\/li>\n<li>Filters and <code>fields<\/code> apply to the header only; every line field is always returned in full for each item<\/li>\n<li>If <code>fields<\/code> is provided but none of the values match a header field, the request is rejected with <code>\"No valid fields requested\"<\/code><\/li>\n<\/ul>\n<hr \/>\n<h3><strong>Example 1 \u2014 Get All GDNs (All Fields, No Filters)<\/strong><\/h3>\n<h4>Request<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"read\"\r\n}<\/pre>\n<h4>Example 2 \u2014 Filtered by Date Range and Destination<\/h4>\n<h4>Request<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"read\",\r\n  \"date_from\": \"2026-09-01\",\r\n  \"date_to\": \"2026-09-30\",\r\n  \"filters\": {\r\n    \"ToLocCode\": \"SHOP001\"\r\n  }\r\n}<\/pre>\n<h4>Sample Code for making an API READ request using php<\/h4>\n<pre>&lt;?php\r\nheader('Content-Type: application\/json');\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 1: CONFIGURATION\r\n\/\/ ============================================================\r\n\r\n$API_KEY = \"your-api-key\";\r\n$API_SECRET = \"your-api-secret\";\r\n$ACTION = \"read\";\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 2: ENDPOINT\r\n\/\/ ============================================================\r\n\r\n$BASE_URL = \"https:\/\/domain-name\/01\/clientportal\/apiv2\/modules\"; \/\/(replace it with your skybiz domain name url)\r\n$ENDPOINT = \"tms_gdn.php\";\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 3: REQUEST PARAMETERS (all optional)\r\n\/\/ ============================================================\r\n\r\n$DATE_FROM = \"2026-09-01\";\r\n$DATE_TO   = \"2026-09-30\";\r\n$FILTERS   = [\"ToLocCode\" =&gt; \"SHOP001\"];\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 4: BUILD PAYLOAD\r\n\/\/ ============================================================\r\n\r\n$payload = [\r\n    \"api_key\"    =&gt; $API_KEY,\r\n    \"api_secret\" =&gt; $API_SECRET,\r\n    \"action\"     =&gt; $ACTION,\r\n    \"date_from\"  =&gt; $DATE_FROM,\r\n    \"date_to\"    =&gt; $DATE_TO,\r\n    \"filters\"    =&gt; $FILTERS\r\n];\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 5: SEND REQUEST\r\n\/\/ ============================================================\r\n\r\n$url = rtrim($BASE_URL, '\/') . '\/' . ltrim($ENDPOINT, '\/');\r\n\r\n$ch = curl_init($url);\r\n\r\ncurl_setopt_array($ch, [\r\n    CURLOPT_RETURNTRANSFER =&gt; true,\r\n    CURLOPT_POST =&gt; true,\r\n    CURLOPT_POSTFIELDS =&gt; json_encode($payload),\r\n    CURLOPT_HTTPHEADER =&gt; ['Content-Type: application\/json'],\r\n    CURLOPT_TIMEOUT =&gt; 30,\r\n]);\r\n\r\n$response = curl_exec($ch);\r\n\r\nif ($response === false) {\r\n    echo json_encode([\r\n        \"status\" =&gt; \"error\",\r\n        \"timestamp\" =&gt; date(\"c\"),\r\n        \"request_id\" =&gt; uniqid(\"req_\"),\r\n        \"message\" =&gt; curl_error($ch)\r\n    ], JSON_PRETTY_PRINT);\r\n    curl_close($ch);\r\n    exit;\r\n}\r\n\r\ncurl_close($ch);\r\n\r\n$result = json_decode($response, true);\r\n\r\necho json_encode([\r\n    \"status\" =&gt; $result['status'] ?? \"error\",\r\n    \"timestamp\" =&gt; date(\"c\"),\r\n    \"request_id\" =&gt; $result['request_id'] ?? uniqid(\"req_\"),\r\n    \"data\" =&gt; $result['data'] ?? null,\r\n    \"message\" =&gt; $result['message'] ?? null\r\n], JSON_PRETTY_PRINT);<\/pre>\n<h4>Response (Success)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"timestamp\": \"2026-09-25T04:07:04+00:00\",\r\n  \"request_id\": \"req_69f2d56891e57\",\r\n  \"data\": {\r\n    \"requested_by\": \"your-api-key\",\r\n    \"mode\": \"2\",\r\n    \"total_returned\": 1,\r\n    \"data\": [\r\n      {\r\n        \"Doc1No\": \"GDN-0001\",\r\n        \"DocDate\": \"2026-09-10\",\r\n        \"DelivMode\": \"Truck\",\r\n        \"FromLocCode\": \"WH001\",\r\n        \"FromLocName\": \"Shah Alam Central Warehouse\",\r\n        \"ToLocCode\": \"SHOP001\",\r\n        \"ToLocName\": \"Sunway Pyramid Outlet\",\r\n        \"DocumentType\": \"GDN\",\r\n        \"OriginalDocNo\": \"\",\r\n        \"AccountingDate\": \"2026-09-10\",\r\n        \"Remarks\": \"Restock for weekend sale\",\r\n        \"items\": [\r\n          {\r\n            \"ItemCode\": \"STYLE001-RED-M\",\r\n            \"ItemName\": \"Classic Tee\",\r\n            \"Qty\": 20,\r\n            \"ColorCode\": \"RD\",\r\n            \"ColorName\": \"Red\",\r\n            \"Size\": \"M\",\r\n            \"UnitPrice\": 39.90,\r\n            \"Amount\": 798.00,\r\n            \"Remarks\": \"\"\r\n          }\r\n        ]\r\n      }\r\n    ]\r\n  }\r\n}<\/pre>\n<hr \/>\n<h3><strong>Create TMS GDN<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Creates one or more GDN documents, each with its header and its line items in a single call. All documents are validated before any are saved. If any document fails validation, the entire batch is rejected \u2014 nothing is inserted.<\/p>\n<h4>Field Rules<\/h4>\n<div class=\"overflow-x-auto w-full px-2 mb-6\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th>Field<\/th>\n<th>Level<\/th>\n<th>Rule<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>Doc1No<\/code><\/td>\n<td>Header<\/td>\n<td><strong>Compulsory.<\/strong> Must not be empty. Must not already exist \u2014 checked both within the request batch and against existing records<\/td>\n<\/tr>\n<tr>\n<td>Any other Header Field<\/td>\n<td>Header<\/td>\n<td>Optional. Blank if not provided<\/td>\n<\/tr>\n<tr>\n<td><code>items<\/code><\/td>\n<td>Header (nested array)<\/td>\n<td><strong>Compulsory.<\/strong> Must be present, must be an array, and must contain <strong>at least one<\/strong> line \u2014 an empty <code>items<\/code> array is rejected on create<\/td>\n<\/tr>\n<tr>\n<td>Any Line Field (<code>ItemCode<\/code>, <code>Qty<\/code>, etc.)<\/td>\n<td>Line<\/td>\n<td>Optional per field. <code>Qty<\/code>, <code>UnitPrice<\/code>, <code>Amount<\/code> default to <code>0<\/code> if omitted; the rest default to blank<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"callout callout-warning\" style=\"background: #fffbeb; border-left: 4px solid #f59e0b; padding: 12px 16px; margin: 16px 0;\">\n<p style=\"margin: 0;\">\u26a0\ufe0f <strong>Duplicate Check Order:<\/strong> The batch is first checked for duplicate <code>Doc1No<\/code> values within the same request, then checked against existing records in SKYBIZ. Either kind of duplicate fails the <strong>entire<\/strong> batch. Unrecognized fields \u2014 at either the header or the line level \u2014 also fail the whole batch, the same way a duplicate does.<\/p>\n<\/div>\n<h4>Base Create Request Structure<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"create\",\r\n  \"gdn_data\": {\r\n    \"documents\": [\r\n      {\r\n        \"Doc1No\": \"GDN-0001\",\r\n        \"DocDate\": \"2026-09-10\",\r\n        \"DelivMode\": \"Truck\",\r\n        \"FromLocCode\": \"WH001\",\r\n        \"FromLocName\": \"Shah Alam Central Warehouse\",\r\n        \"ToLocCode\": \"SHOP001\",\r\n        \"ToLocName\": \"Sunway Pyramid Outlet\",\r\n        \"DocumentType\": \"GDN\",\r\n        \"AccountingDate\": \"2026-09-10\",\r\n        \"Remarks\": \"Restock for weekend sale\",\r\n        \"items\": [\r\n          {\r\n            \"ItemCode\": \"STYLE001-RED-M\",\r\n            \"ItemName\": \"Classic Tee\",\r\n            \"Qty\": 20,\r\n            \"ColorCode\": \"RD\",\r\n            \"ColorName\": \"Red\",\r\n            \"Size\": \"M\",\r\n            \"UnitPrice\": 39.90,\r\n            \"Amount\": 798.00\r\n          }\r\n        ]\r\n      }\r\n    ]\r\n  }\r\n}<\/pre>\n<h4>Sample Code for making an API CREATE request using php<\/h4>\n<pre>&lt;?php\r\nheader('Content-Type: application\/json');\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 1: CONFIGURATION\r\n\/\/ ============================================================\r\n\r\n$API_KEY = \"your-api-key\";\r\n$API_SECRET = \"your-api-secret\";\r\n$ACTION = \"create\";\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 2: ENDPOINT\r\n\/\/ ============================================================\r\n\r\n$BASE_URL = \"https:\/\/domain-name\/01\/clientportal\/apiv2\/modules\"; \/\/(replace it with your skybiz domain name url)\r\n$ENDPOINT = \"tms_gdn.php\";\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 3: DATA KEY\r\n\/\/ ============================================================\r\n\r\n$DATA_KEY = \"gdn_data\";\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 4: BUILD YOUR DOCUMENTS ARRAY\r\n\/\/ ============================================================\r\n\r\n$DOCUMENTS = [];\r\n\r\n$DOCUMENTS[] = [\r\n    \"Doc1No\"         =&gt; \"GDN-0001\",\r\n    \"DocDate\"        =&gt; \"2026-09-10\",\r\n    \"DelivMode\"      =&gt; \"Truck\",\r\n    \"FromLocCode\"    =&gt; \"WH001\",\r\n    \"FromLocName\"    =&gt; \"Shah Alam Central Warehouse\",\r\n    \"ToLocCode\"      =&gt; \"SHOP001\",\r\n    \"ToLocName\"      =&gt; \"Sunway Pyramid Outlet\",\r\n    \"DocumentType\"   =&gt; \"GDN\",\r\n    \"AccountingDate\" =&gt; \"2026-09-10\",\r\n    \"Remarks\"        =&gt; \"Restock for weekend sale\",\r\n    \"items\"          =&gt; [\r\n        [\r\n            \"ItemCode\"  =&gt; \"STYLE001-RED-M\",\r\n            \"ItemName\"  =&gt; \"Classic Tee\",\r\n            \"Qty\"       =&gt; 20,\r\n            \"ColorCode\" =&gt; \"RD\",\r\n            \"ColorName\" =&gt; \"Red\",\r\n            \"Size\"      =&gt; \"M\",\r\n            \"UnitPrice\" =&gt; 39.90,\r\n            \"Amount\"    =&gt; 798.00\r\n        ]\r\n    ]\r\n];\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 5: CLIENT-SIDE COUNT CHECK (Please do not modify this)\r\n\/\/ ============================================================\r\n\r\n$totalDocuments = 0;\r\n\r\nforeach ($DOCUMENTS as $document) {\r\n    $totalDocuments++;\r\n\r\n    if (empty($document['Doc1No'])) {\r\n        echo json_encode([\r\n            \"status\" =&gt; \"REJECTED_BY_CLIENT\",\r\n            \"timestamp\" =&gt; date(\"c\"),\r\n            \"request_id\" =&gt; uniqid(\"req_\"),\r\n            \"message\" =&gt; \"CLIENT-SIDE REJECTION: Document at position {$totalDocuments} has empty Doc1No\",\r\n            \"action_required\" =&gt; \"Fix the document before sending to server\"\r\n        ], JSON_PRETTY_PRINT);\r\n        exit;\r\n    }\r\n\r\n    if (empty($document['items'])) {\r\n        echo json_encode([\r\n            \"status\" =&gt; \"REJECTED_BY_CLIENT\",\r\n            \"timestamp\" =&gt; date(\"c\"),\r\n            \"request_id\" =&gt; uniqid(\"req_\"),\r\n            \"message\" =&gt; \"CLIENT-SIDE REJECTION: Document '{$document['Doc1No']}' has no items\",\r\n            \"action_required\" =&gt; \"Every document needs at least one item on create\"\r\n        ], JSON_PRETTY_PRINT);\r\n        exit;\r\n    }\r\n}\r\n\r\nif ($totalDocuments &gt; 500) {\r\n    echo json_encode([\r\n        \"status\" =&gt; \"REJECTED_BY_CLIENT\",\r\n        \"timestamp\" =&gt; date(\"c\"),\r\n        \"request_id\" =&gt; uniqid(\"req_\"),\r\n        \"message\" =&gt; \"CLIENT-SIDE REJECTION: You have {$totalDocuments} documents. Maximum is 500.\",\r\n        \"your_document_count\" =&gt; $totalDocuments,\r\n        \"max_allowed\" =&gt; 500,\r\n        \"action_required\" =&gt; \"Reduce your documents to 500 or less BEFORE sending to server\"\r\n    ], JSON_PRETTY_PRINT);\r\n    exit;\r\n}\r\n\r\necho \"Sending {$totalDocuments} document(s) to server...\\n\\n\";\r\n\r\n\/\/ ============================================================\r\n\/\/ STEP 6: SEND REQUEST\r\n\/\/ ============================================================\r\n\r\n$url = rtrim($BASE_URL, '\/') . '\/' . ltrim($ENDPOINT, '\/');\r\n\r\n$payload = [\r\n    \"api_key\"    =&gt; $API_KEY,\r\n    \"api_secret\" =&gt; $API_SECRET,\r\n    \"action\"     =&gt; $ACTION,\r\n    $DATA_KEY    =&gt; [\"documents\" =&gt; $DOCUMENTS]\r\n];\r\n\r\n$ch = curl_init($url);\r\n\r\ncurl_setopt_array($ch, [\r\n    CURLOPT_RETURNTRANSFER =&gt; true,\r\n    CURLOPT_POST =&gt; true,\r\n    CURLOPT_POSTFIELDS =&gt; json_encode($payload),\r\n    CURLOPT_HTTPHEADER =&gt; ['Content-Type: application\/json'],\r\n    CURLOPT_TIMEOUT =&gt; 120,\r\n]);\r\n\r\n$response = curl_exec($ch);\r\ncurl_close($ch);\r\n\r\n$result = json_decode($response, true);\r\n\r\necho \"=== SERVER RESPONSE ===\\n\";\r\necho json_encode($result, JSON_PRETTY_PRINT);<\/pre>\n<h4>Response (Success)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"timestamp\": \"2026-09-25T10:30:00+08:00\",\r\n  \"request_id\": \"req_69fc0070d83cf\",\r\n  \"data\": {\r\n    \"requested_by\": \"your-api-key\",\r\n    \"mode\": \"2\",\r\n    \"summary\": {\r\n      \"total_documents\": 1,\r\n      \"inserted\": 1,\r\n      \"failed\": 0\r\n    },\r\n    \"successful_documents\": [\"GDN-0001\"],\r\n    \"failed_documents\": [],\r\n    \"fail_details\": {\r\n      \"duplicate_in_request\": [],\r\n      \"duplicate_gdns\": [],\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<h4>Response (Error \u2014 Missing Items)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"data\": {\r\n    \"summary\": { \"total_documents\": 1, \"inserted\": 0, \"failed\": 1 },\r\n    \"successful_documents\": [],\r\n    \"failed_documents\": [\"GDN-0001\"],\r\n    \"fail_details\": {\r\n      \"duplicate_in_request\": [],\r\n      \"duplicate_gdns\": [],\r\n      \"validation_errors\": {\r\n        \"EMPTY_ITEMS\": [\"Document 'GDN-0001': 'items' array cannot be empty on create\"]\r\n      }\r\n    }\r\n  }\r\n}<\/pre>\n<h4>Response (Error \u2014 Duplicate Doc1No)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"timestamp\": \"2026-09-25T10:30:00+08:00\",\r\n  \"request_id\": \"req_69fc03e446a20\",\r\n  \"data\": {\r\n    \"requested_by\": \"your-api-key\",\r\n    \"mode\": \"2\",\r\n    \"summary\": {\r\n      \"total_documents\": 1,\r\n      \"inserted\": 0,\r\n      \"failed\": 1\r\n    },\r\n    \"successful_documents\": [],\r\n    \"failed_documents\": [\"GDN-0001\"],\r\n    \"fail_details\": {\r\n      \"duplicate_in_request\": [],\r\n      \"duplicate_gdns\": [\r\n        {\r\n          \"doc1no\": \"GDN-0001\",\r\n          \"error\": \"GDN Doc1No already exists\"\r\n        }\r\n      ],\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<hr \/>\n<h3><strong>Update TMS GDN<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Updates one or more existing GDN documents, matched by <code>Doc1No<\/code>. Header fields are a <strong>partial update<\/strong> \u2014 only send the header fields you want to change. All documents are pre-validated before anything is written; if any document in the batch fails, the entire batch is rejected.<\/p>\n<div class=\"callout callout-warning\" style=\"background: #fef2f2; border-left: 4px solid #ef4444; padding: 12px 16px; margin: 16px 0;\">\n<p style=\"margin: 0;\">\ud83d\uded1 <strong>Critical \u2014 <code>items<\/code> is a full replace, not a merge:<\/strong> If you include the <code>items<\/code> key in an update document at all, <strong>every existing line on that GDN is deleted first<\/strong>, then replaced with whatever lines you sent. This applies even if <code>items<\/code> is an <strong>empty array<\/strong> \u2014 that will wipe all lines from the document, leaving it with zero items. To update header fields only and leave the existing lines untouched, simply omit the <code>items<\/code> key entirely from that document.<\/p>\n<\/div>\n<h4>Field Rules<\/h4>\n<div class=\"overflow-x-auto w-full px-2 mb-6\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th>Field<\/th>\n<th>Rule<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>Doc1No<\/code><\/td>\n<td><strong>Compulsory<\/strong> in every document \u2014 used to look up the record. <strong>Fixed<\/strong> \u2014 including it only identifies the row, it is never itself updated<\/td>\n<\/tr>\n<tr>\n<td>Any other Header Field<\/td>\n<td>Optional \u2014 include only the header fields you want to change<\/td>\n<\/tr>\n<tr>\n<td><code>items<\/code><\/td>\n<td>Optional. When present, <strong>replaces all existing lines<\/strong> for that document (see warning above). When omitted, existing lines are left as-is<\/td>\n<\/tr>\n<tr>\n<td>Any field not in the Header Fields or Line Fields list<\/td>\n<td>Not permitted \u2014 fails the whole batch<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h4>Pre-flight Validation (checked before any write, whole batch fails together)<\/h4>\n<ul>\n<li>Every document must have a non-empty <code>Doc1No<\/code><\/li>\n<li>No duplicate <code>Doc1No<\/code> within the same request batch<\/li>\n<li>No unrecognized header field names<\/li>\n<li>If <code>items<\/code> is present, it must be an array, and every line in it must use only recognized Line Fields \u2014 an unrecognized line field name fails the batch<\/li>\n<li>Every document must include at least one header field to update, or an <code>items<\/code> key \u2014 a document with neither is rejected as &#8220;nothing to update&#8221;<\/li>\n<li>Every <code>Doc1No<\/code> must already exist in SKYBIZ \u2014 if even one is not found, the whole batch is rejected<\/li>\n<\/ul>\n<div class=\"callout callout-warning\" style=\"background: #fffbeb; border-left: 4px solid #f59e0b; padding: 12px 16px; margin: 16px 0;\">\n<p style=\"margin: 0;\">\u26a0\ufe0f <strong>All-or-Nothing:<\/strong> A single bad document (not found, duplicate, unknown field, or nothing to update) causes <strong>every<\/strong> document in the request \u2014 including the valid ones \u2014 to fail.<\/p>\n<\/div>\n<h4>Base Update Request Structure \u2014 Header Fields Only (lines untouched)<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"update\",\r\n  \"gdn_data\": {\r\n    \"documents\": [\r\n      {\r\n        \"Doc1No\": \"GDN-0001\",\r\n        \"DelivMode\": \"Van\",\r\n        \"Remarks\": \"Rescheduled to next-day delivery\"\r\n      }\r\n    ]\r\n  }\r\n}<\/pre>\n<h4>Base Update Request Structure \u2014 Replacing Lines<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"update\",\r\n  \"gdn_data\": {\r\n    \"documents\": [\r\n      {\r\n        \"Doc1No\": \"GDN-0001\",\r\n        \"items\": [\r\n          {\r\n            \"ItemCode\": \"STYLE001-RED-M\",\r\n            \"ItemName\": \"Classic Tee\",\r\n            \"Qty\": 25,\r\n            \"ColorCode\": \"RD\",\r\n            \"ColorName\": \"Red\",\r\n            \"Size\": \"M\",\r\n            \"UnitPrice\": 39.90,\r\n            \"Amount\": 997.50\r\n          }\r\n        ]\r\n      }\r\n    ]\r\n  }\r\n}<\/pre>\n<h4>Sample Code for making an API UPDATE request using php<\/h4>\n<pre>&lt;?php\r\nheader('Content-Type: application\/json');\r\n\r\n$API_KEY = \"your-api-key\";\r\n$API_SECRET = \"your-api-secret\";\r\n$ACTION = \"update\";\r\n\r\n$BASE_URL = \"https:\/\/domain-name\/01\/clientportal\/apiv2\/modules\"; \/\/(replace it with your skybiz domain name url)\r\n$ENDPOINT = \"tms_gdn.php\";\r\n\r\n$DOCUMENTS = [];\r\n\r\n\/\/ Header-only update \u2014 omit 'items' entirely to leave existing lines untouched\r\n$DOCUMENTS[] = [\r\n    \"Doc1No\"    =&gt; \"GDN-0001\",\r\n    \"DelivMode\" =&gt; \"Van\",\r\n    \"Remarks\"   =&gt; \"Rescheduled to next-day delivery\"\r\n];\r\n\r\nif (count($DOCUMENTS) &gt; 500) {\r\n    echo json_encode([\r\n        \"status\" =&gt; \"REJECTED_BY_CLIENT\",\r\n        \"message\" =&gt; \"Maximum 500 documents per request.\"\r\n    ], JSON_PRETTY_PRINT);\r\n    exit;\r\n}\r\n\r\n$url = rtrim($BASE_URL, '\/') . '\/' . ltrim($ENDPOINT, '\/');\r\n\r\n$payload = [\r\n    \"api_key\"    =&gt; $API_KEY,\r\n    \"api_secret\" =&gt; $API_SECRET,\r\n    \"action\"     =&gt; $ACTION,\r\n    \"gdn_data\"   =&gt; [\"documents\" =&gt; $DOCUMENTS]\r\n];\r\n\r\n$ch = curl_init($url);\r\n\r\ncurl_setopt_array($ch, [\r\n    CURLOPT_RETURNTRANSFER =&gt; true,\r\n    CURLOPT_POST =&gt; true,\r\n    CURLOPT_POSTFIELDS =&gt; json_encode($payload),\r\n    CURLOPT_HTTPHEADER =&gt; ['Content-Type: application\/json'],\r\n    CURLOPT_TIMEOUT =&gt; 120,\r\n]);\r\n\r\n$response = curl_exec($ch);\r\ncurl_close($ch);\r\n\r\necho json_encode(json_decode($response, true), JSON_PRETTY_PRINT);<\/pre>\n<h4>Response (Success)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"timestamp\": \"2026-09-25T11:00:00+08:00\",\r\n  \"request_id\": \"req_69fc1234abcd\",\r\n  \"data\": {\r\n    \"requested_by\": \"your-api-key\",\r\n    \"mode\": \"2\",\r\n    \"summary\": {\r\n      \"total_documents\": 1,\r\n      \"updated\": 1,\r\n      \"not_found\": 0,\r\n      \"failed\": 0\r\n    },\r\n    \"successful_documents\": [\"GDN-0001\"],\r\n    \"not_found_documents\": [],\r\n    \"failed_documents\": [],\r\n    \"fail_details\": {\r\n      \"not_found\": [],\r\n      \"nothing_to_update\": [],\r\n      \"unknown_fields\": [],\r\n      \"unknown_item_fields\": [],\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<h4>Response (Error \u2014 GDN Not Found)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"data\": {\r\n    \"summary\": { \"total_documents\": 1, \"updated\": 0, \"not_found\": 1, \"failed\": 1 },\r\n    \"successful_documents\": [],\r\n    \"not_found_documents\": [\"GDN-9999\"],\r\n    \"failed_documents\": [\"GDN-9999\"],\r\n    \"fail_details\": {\r\n      \"not_found\": [\"GDN-9999\"],\r\n      \"nothing_to_update\": [],\r\n      \"unknown_fields\": [],\r\n      \"unknown_item_fields\": [],\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<h4>Response (Error \u2014 Unknown Line Field)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"data\": {\r\n    \"summary\": { \"total_documents\": 1, \"updated\": 0, \"not_found\": 0, \"failed\": 1 },\r\n    \"successful_documents\": [],\r\n    \"not_found_documents\": [],\r\n    \"failed_documents\": [\"GDN-0001\"],\r\n    \"fail_details\": {\r\n      \"not_found\": [],\r\n      \"nothing_to_update\": [],\r\n      \"unknown_fields\": [],\r\n      \"unknown_item_fields\": {\r\n        \"GDN-0001\": [\"item 1: Discount\"]\r\n      },\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<hr \/>\n<h3><strong>Delete TMS GDN<\/strong><\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Deletes one or more GDN documents, matched by <code>Doc1No<\/code> \u2014 this removes the header <strong>and<\/strong> all of its lines. This permanently removes the record \u2014 there is no undo. All documents are pre-validated before anything is deleted; if any document fails, the entire batch is rejected.<\/p>\n<h4>Pre-flight Validation (checked before any write, whole batch fails together)<\/h4>\n<ul>\n<li>Every document must have a non-empty <code>Doc1No<\/code><\/li>\n<li>No duplicate <code>Doc1No<\/code> within the same request batch<\/li>\n<li>Every <code>Doc1No<\/code> must already exist in SKYBIZ \u2014 if even one is not found, the whole batch is rejected and nothing is deleted<\/li>\n<\/ul>\n<h4>Base Delete Request Structure<\/h4>\n<pre>{\r\n  \"api_key\": \"your-api-key\",\r\n  \"api_secret\": \"your-api-secret\",\r\n  \"action\": \"delete\",\r\n  \"gdn_data\": {\r\n    \"documents\": [\r\n      { \"Doc1No\": \"GDN-0001\" },\r\n      { \"Doc1No\": \"GDN-0002\" }\r\n    ]\r\n  }\r\n}<\/pre>\n<h4>Sample Code for making an API DELETE request using php<\/h4>\n<pre>&lt;?php\r\nheader('Content-Type: application\/json');\r\n\r\n$API_KEY = \"your-api-key\";\r\n$API_SECRET = \"your-api-secret\";\r\n$ACTION = \"delete\";\r\n\r\n$BASE_URL = \"https:\/\/domain-name\/01\/clientportal\/apiv2\/modules\"; \/\/(replace it with your skybiz domain name url)\r\n$ENDPOINT = \"tms_gdn.php\";\r\n\r\n$DOCUMENTS = [\r\n    [\"Doc1No\" =&gt; \"GDN-0001\"],\r\n    [\"Doc1No\" =&gt; \"GDN-0002\"]\r\n];\r\n\r\nif (count($DOCUMENTS) &gt; 500) {\r\n    echo json_encode([\r\n        \"status\" =&gt; \"REJECTED_BY_CLIENT\",\r\n        \"message\" =&gt; \"Maximum 500 documents per request.\"\r\n    ], JSON_PRETTY_PRINT);\r\n    exit;\r\n}\r\n\r\n$url = rtrim($BASE_URL, '\/') . '\/' . ltrim($ENDPOINT, '\/');\r\n\r\n$payload = [\r\n    \"api_key\"    =&gt; $API_KEY,\r\n    \"api_secret\" =&gt; $API_SECRET,\r\n    \"action\"     =&gt; $ACTION,\r\n    \"gdn_data\"   =&gt; [\"documents\" =&gt; $DOCUMENTS]\r\n];\r\n\r\n$ch = curl_init($url);\r\n\r\ncurl_setopt_array($ch, [\r\n    CURLOPT_RETURNTRANSFER =&gt; true,\r\n    CURLOPT_POST =&gt; true,\r\n    CURLOPT_POSTFIELDS =&gt; json_encode($payload),\r\n    CURLOPT_HTTPHEADER =&gt; ['Content-Type: application\/json'],\r\n    CURLOPT_TIMEOUT =&gt; 120,\r\n]);\r\n\r\n$response = curl_exec($ch);\r\ncurl_close($ch);\r\n\r\necho json_encode(json_decode($response, true), JSON_PRETTY_PRINT);<\/pre>\n<h4>Response (Success)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"timestamp\": \"2026-09-25T11:15:00+08:00\",\r\n  \"request_id\": \"req_69fc9999ijkl\",\r\n  \"data\": {\r\n    \"requested_by\": \"your-api-key\",\r\n    \"mode\": \"2\",\r\n    \"summary\": {\r\n      \"total_documents\": 2,\r\n      \"deleted\": 2,\r\n      \"not_found\": 0,\r\n      \"failed\": 0\r\n    },\r\n    \"successful_documents\": [\"GDN-0001\", \"GDN-0002\"],\r\n    \"not_found_documents\": [],\r\n    \"failed_documents\": [],\r\n    \"fail_details\": {\r\n      \"not_found\": [],\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<h4>Response (Error \u2014 GDN Not Found)<\/h4>\n<pre>{\r\n  \"status\": \"response\",\r\n  \"data\": {\r\n    \"summary\": { \"total_documents\": 1, \"deleted\": 0, \"not_found\": 1, \"failed\": 1 },\r\n    \"successful_documents\": [],\r\n    \"not_found_documents\": [\"GDN-9999\"],\r\n    \"failed_documents\": [\"GDN-9999\"],\r\n    \"fail_details\": {\r\n      \"not_found\": [\"GDN-9999\"],\r\n      \"validation_errors\": []\r\n    }\r\n  }\r\n}<\/pre>\n<hr \/>\n<h3><strong>Rate Limits &amp; Quota<\/strong><\/h3>\n<ul>\n<li><strong>Rate limit:<\/strong> 5 requests per 10 seconds, enforced per IP address and per API key. Exceeding it returns HTTP 429 with <code>\"Rate limit exceeded\"<\/code><\/li>\n<li><strong>Monthly quota:<\/strong> checked only on <code>create<\/code>, counted as <strong>1 quota unit per header document<\/strong> (line item count does not affect quota usage). <code>read<\/code>, <code>update<\/code>, and <code>delete<\/code> are not quota-limited<\/li>\n<li><strong>Batch cap:<\/strong> 500 documents per request for <code>create<\/code>, <code>update<\/code>, and <code>delete<\/code> (not applicable to <code>read<\/code>)<\/li>\n<\/ul>\n<hr \/>\n<h3><strong>Error Responses<\/strong><\/h3>\n<h4>Missing API Credentials<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"API key and secret are required\"\r\n}<\/pre>\n<h4>Invalid API Credentials<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"Invalid API credentials\"\r\n}<\/pre>\n<h4>Expired API Key<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"API key expired on 2026-08-01. Please delete the expired credentials and create a new API key set to continue using the API.\"\r\n}<\/pre>\n<h4>Missing \/ Invalid Action<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"action is required. Use 'read', 'create', 'update', or 'delete'\"\r\n}<\/pre>\n<h4>Invalid date_from \/ date_to Format (READ)<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"Invalid date_from format. Use YYYY-MM-DD\"\r\n}<\/pre>\n<h4>No Permission for Action<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"tms_gdn update permission denied\"\r\n}<\/pre>\n<h4>Missing gdn_data \/ documents (CREATE \/ UPDATE \/ DELETE)<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"gdn_data.documents must be a non-empty array\"\r\n}<\/pre>\n<h4>Batch Limit Exceeded (CREATE \/ UPDATE \/ DELETE)<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"Maximum 500 documents allowed. You sent 600. Please split into multiple requests with max 500 documents each.\"\r\n}<\/pre>\n<h4>Monthly Quota Exceeded (CREATE only)<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"Quota exceeded! You have used 950 out of 1000 records this month. You requested 100 more records, but only 50 remaining. Please reduce your request or contact administrator to increase quota.\"\r\n}<\/pre>\n<h4>Rate Limit Exceeded<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"data\": {\r\n    \"key\": \"your-api-key\",\r\n    \"limit\": 5,\r\n    \"window_seconds\": 10\r\n  },\r\n  \"message\": \"Rate limit exceeded\"\r\n}<\/pre>\n<h4>No Valid Fields Requested (READ)<\/h4>\n<pre>{\r\n  \"status\": \"error\",\r\n  \"timestamp\": \"2026-09-25T10:46:15+08:00\",\r\n  \"request_id\": \"req_6612f3b9c21a7\",\r\n  \"message\": \"No valid fields requested\"\r\n}<\/pre>\n<hr \/>\n<h3><strong>Common Errors \u2014 TMS GDN Module<\/strong><\/h3>\n<div class=\"overflow-x-auto w-full px-2 mb-6\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th>Error Message<\/th>\n<th>Cause<\/th>\n<th>Fix<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>\"API key and secret are required\"<\/code><\/td>\n<td>Missing <code>api_key<\/code> or <code>api_secret<\/code><\/td>\n<td>Include both in the request<\/td>\n<\/tr>\n<tr>\n<td><code>\"Invalid action. Use 'read', 'create', 'update', or 'delete'\"<\/code><\/td>\n<td>Unsupported <code>action<\/code> value<\/td>\n<td>Use one of the four supported actions<\/td>\n<\/tr>\n<tr>\n<td><code>\"Invalid date_from format. Use YYYY-MM-DD\"<\/code> \/ <code>date_to<\/code> equivalent<\/td>\n<td>Date param supplied in the wrong format (READ)<\/td>\n<td>Use <code>YYYY-MM-DD<\/code>, e.g. <code>\"2026-09-01\"<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>\"gdn_data is required for create action\"<\/code> (or update\/delete)<\/td>\n<td>Missing <code>gdn_data<\/code> object<\/td>\n<td>Wrap your documents in <code>gdn_data.documents<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>\"Maximum 500 documents allowed...\"<\/code><\/td>\n<td>More than 500 documents in one create\/update\/delete request<\/td>\n<td>Split into batches of 500 or fewer<\/td>\n<\/tr>\n<tr>\n<td><code>\"Document with empty Doc1No found in batch\"<\/code> \/ <code>\"Missing Doc1No\"<\/code><\/td>\n<td>A document is missing <code>Doc1No<\/code><\/td>\n<td>Every document needs a non-empty <code>Doc1No<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>\"Duplicate Doc1No 'X' found in the same batch\"<\/code><\/td>\n<td>Same <code>Doc1No<\/code> sent twice in one request<\/td>\n<td>Remove the duplicate, or send it in a separate request<\/td>\n<\/tr>\n<tr>\n<td><code>\"'items' array is required for create\"<\/code> \/ <code>\"'items' array cannot be empty on create\"<\/code><\/td>\n<td><code>items<\/code> missing or empty on a create document<\/td>\n<td>Every new GDN needs at least one line item<\/td>\n<\/tr>\n<tr>\n<td><code>\"GDN Doc1No already exists\"<\/code><\/td>\n<td><code>Doc1No<\/code> already exists in SKYBIZ (CREATE)<\/td>\n<td>Use a unique <code>Doc1No<\/code>, or use <code>update<\/code> instead<\/td>\n<\/tr>\n<tr>\n<td><code>Doc1No<\/code> listed under <code>not_found_documents<\/code><\/td>\n<td><code>Doc1No<\/code> does not exist in SKYBIZ (UPDATE \/ DELETE)<\/td>\n<td>Check the document exists, or use <code>create<\/code> first<\/td>\n<\/tr>\n<tr>\n<td>Field name listed under <code>unknown_fields<\/code><\/td>\n<td>A field outside the Header Fields list was sent (UPDATE)<\/td>\n<td>Remove the field, or check spelling against the Header Fields table<\/td>\n<\/tr>\n<tr>\n<td>Field name listed under <code>unknown_item_fields<\/code><\/td>\n<td>A field outside the Line Fields list was sent inside <code>items<\/code><\/td>\n<td>Remove the field, or check spelling against the Line Fields table<\/td>\n<\/tr>\n<tr>\n<td><code>\"No updatable fields provided\"<\/code><\/td>\n<td>Document had no header fields to change and no <code>items<\/code> key (UPDATE)<\/td>\n<td>Include at least one header field to update, or an <code>items<\/code> array<\/td>\n<\/tr>\n<tr>\n<td>Lines unexpectedly gone after an update<\/td>\n<td><code>items<\/code> was sent as an empty array \u2014 this intentionally wipes all lines<\/td>\n<td>Omit <code>items<\/code> entirely if you only meant to change header fields<\/td>\n<\/tr>\n<tr>\n<td><code>\"No valid fields requested\"<\/code><\/td>\n<td><code>fields<\/code> array contains no recognized header field names (READ)<\/td>\n<td>Use field names from the Header Fields table<\/td>\n<\/tr>\n<tr>\n<td><code>\"tms_gdn read\/create\/update\/delete permission denied\"<\/code><\/td>\n<td>API key&#8217;s module permissions don&#8217;t include that action<\/td>\n<td>Enable the permission in the portal by contacting your SkyBiz Admin<\/td>\n<\/tr>\n<tr>\n<td><code>\"Rate limit exceeded\"<\/code><\/td>\n<td>More than 5 requests in a 10-second window<\/td>\n<td>Slow down request frequency \/ add retry backoff<\/td>\n<\/tr>\n<tr>\n<td><code>\"Quota exceeded!...\"<\/code><\/td>\n<td>Monthly record quota reached (CREATE only, 1 unit per header)<\/td>\n<td>Reduce batch size or contact administrator to raise quota<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>SKYBIZ API \u2014 TMS Module TMS GDN (Goods Delivery Note) The TMS GDN module allows you to retrieve, create, update, and delete Goods Delivery Note documents in SKYBIZ TMS. Each GDN has a header (document-level details such as origin\/destination and dates) and a nested items array (the line items being delivered). Supports read, create, update, ..<\/p>\n<div class=\"clear-fix\"><\/div>\n<p><a href=\"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/\" title=\"read more...\">Read more<\/a><\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[230],"tags":[],"class_list":["post-7621","post","type-post","status-publish","format-standard","hentry","category-1014-tms-gdn"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TMS GDN Module - SKYBIZ Cloud ERP Support<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TMS GDN Module - SKYBIZ Cloud ERP Support\" \/>\n<meta property=\"og:description\" content=\"SKYBIZ API \u2014 TMS Module TMS GDN (Goods Delivery Note) The TMS GDN module allows you to retrieve, create, update, and delete Goods Delivery Note documents in SKYBIZ TMS. Each GDN has a header (document-level details such as origin\/destination and dates) and a nested items array (the line items being delivered). Supports read, create, update, ..Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/\" \/>\n<meta property=\"og:site_name\" content=\"SKYBIZ Cloud ERP Support\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-25T09:01:51+00:00\" \/>\n<meta name=\"author\" content=\"team 03\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"team 03\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/\"},\"author\":{\"name\":\"team 03\",\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/#\\\/schema\\\/person\\\/f3a2bcb10e55b23238c1b160bb06d9a9\"},\"headline\":\"TMS GDN Module\",\"datePublished\":\"2026-09-25T09:01:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/\"},\"wordCount\":1687,\"articleSection\":[\"1014. TMS GDN\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/\",\"url\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/\",\"name\":\"TMS GDN Module - SKYBIZ Cloud ERP Support\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/#website\"},\"datePublished\":\"2026-09-25T09:01:51+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/#\\\/schema\\\/person\\\/f3a2bcb10e55b23238c1b160bb06d9a9\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/apitms_gdn\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TMS GDN Module\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/#website\",\"url\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/\",\"name\":\"SKYBIZ Cloud ERP Support\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/#\\\/schema\\\/person\\\/f3a2bcb10e55b23238c1b160bb06d9a9\",\"name\":\"team 03\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ed4575e459e48798469dd7ea3f93c83386ac432dd3bfebbf7d56837d067cbb88?s=96&d=blank&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ed4575e459e48798469dd7ea3f93c83386ac432dd3bfebbf7d56837d067cbb88?s=96&d=blank&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ed4575e459e48798469dd7ea3f93c83386ac432dd3bfebbf7d56837d067cbb88?s=96&d=blank&r=g\",\"caption\":\"team 03\"},\"sameAs\":[\"http:\\\/\\\/skybiz.com.my\"],\"url\":\"https:\\\/\\\/aisupport.skybizglobal.com\\\/skybizclouderp\\\/author\\\/team03skybiz-com-my\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TMS GDN Module - SKYBIZ Cloud ERP Support","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"TMS GDN Module - SKYBIZ Cloud ERP Support","og_description":"SKYBIZ API \u2014 TMS Module TMS GDN (Goods Delivery Note) The TMS GDN module allows you to retrieve, create, update, and delete Goods Delivery Note documents in SKYBIZ TMS. Each GDN has a header (document-level details such as origin\/destination and dates) and a nested items array (the line items being delivered). Supports read, create, update, ..Read more","og_url":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/","og_site_name":"SKYBIZ Cloud ERP Support","article_published_time":"2026-09-25T09:01:51+00:00","author":"team 03","twitter_card":"summary_large_image","twitter_misc":{"Written by":"team 03","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/#article","isPartOf":{"@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/"},"author":{"name":"team 03","@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/#\/schema\/person\/f3a2bcb10e55b23238c1b160bb06d9a9"},"headline":"TMS GDN Module","datePublished":"2026-09-25T09:01:51+00:00","mainEntityOfPage":{"@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/"},"wordCount":1687,"articleSection":["1014. TMS GDN"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/","url":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/","name":"TMS GDN Module - SKYBIZ Cloud ERP Support","isPartOf":{"@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/#website"},"datePublished":"2026-09-25T09:01:51+00:00","author":{"@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/#\/schema\/person\/f3a2bcb10e55b23238c1b160bb06d9a9"},"breadcrumb":{"@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/apitms_gdn\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/"},{"@type":"ListItem","position":2,"name":"TMS GDN Module"}]},{"@type":"WebSite","@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/#website","url":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/","name":"SKYBIZ Cloud ERP Support","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/#\/schema\/person\/f3a2bcb10e55b23238c1b160bb06d9a9","name":"team 03","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ed4575e459e48798469dd7ea3f93c83386ac432dd3bfebbf7d56837d067cbb88?s=96&d=blank&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ed4575e459e48798469dd7ea3f93c83386ac432dd3bfebbf7d56837d067cbb88?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ed4575e459e48798469dd7ea3f93c83386ac432dd3bfebbf7d56837d067cbb88?s=96&d=blank&r=g","caption":"team 03"},"sameAs":["http:\/\/skybiz.com.my"],"url":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/author\/team03skybiz-com-my\/"}]}},"_links":{"self":[{"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/posts\/7621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/comments?post=7621"}],"version-history":[{"count":1,"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/posts\/7621\/revisions"}],"predecessor-version":[{"id":7622,"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/posts\/7621\/revisions\/7622"}],"wp:attachment":[{"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/media?parent=7621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/categories?post=7621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aisupport.skybizglobal.com\/skybizclouderp\/wp-json\/wp\/v2\/tags?post=7621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}