Do merge tags resolve inside Footers when used in custom themes?

Hi everyone,

I’m customizing a theme and using the Footers feature with the marker to move some footers above the items table:

<!--position:before-table-->
<p style="text-align: justify;">
  Con la presente… (example text) …
</p>

I’d like to insert merge tags inside these footers, e.g.:

@@Reference@@
@@Date@@
@@Amount@@
@@Accounts@@
%%Conto_Corrente%%

However, in my PDFs these tags doesn’t appear.

What I’ve tried

  • Verified that the same fields exist on the document (Reference, Date, Amount, Accounts, custom field “Conto Corrente”, etc.).
  • Tested both above-table and below-table footers.
  • Implemented a JavaScript resolver in the theme (parsing data.fields, data.table.totals, data.custom_fields, data.business.custom_fields, etc.), but the footer HTML that arrives in data.footers still contains the tags literally (so my assumption is that the theme receives the raw footer HTML without merge expansion).

Questions

  1. Are merge tags supposed to be resolved by Manager before the theme receives data.footers?
    Or is data.footers intentionally “raw” and merge replacement isn’t supported in this context?

  2. Which merge tags are officially supported inside Footers? Is there a list of fields/objects that resolve in footers (similar to email templates), and does it include custom fields from:

    • the document,
    • the business (company),
    • the recipient (customer/supplier)?
  3. If tags are supported, can you point me to the documentation and the exact syntax (e.g., @@Paid from@@ vs @@PaidFrom@@, spacing/underscore rules, case sensitivity)?

Environment / Repro

  • Footer content example:

    <!--position:before-table-->
    <p style="text-align: justify;">
      Con la presente… (example)… conto: %%Conto_Corrente%% — Riferimento: @@Reference@@ — Data: @@Date@@ — Importo: @@Amount@@ — Conti: @@Accounts@@
    </p>
    
  • The theme otherwise renders correctly (headers, items, totals, pre-footers positioning). Only the merge tags remain unresolved.

If I’m misunderstanding how Footers and merge tags are meant to work together, please let me know the correct approach. Thanks a lot!

<!--position:before-table-->
<p style="text-align: justify;">
  Con la presente… (example)… conto: %%Conto_Corrente%% — Riferimento: @@Reference@@ — Data: @@Date@@ — Importo: @@Amount@@ — Conti: @@Accounts@@
</p>

Since the theme employs a complete HTML structure, any text enclosed between the opening and closing HTML syntax tags, such as <p>TEXT</p>, will be treated as a regular text string. Consequently, characters like % or @ are also considered regular text string If you put it as you have done. Therefore, I believe that the merge tags intended for use in the Footer cannot be utilized within the theme as you have attempted.

even with the standard theme and a footer with only @@Accounts@@, it doesn’t work.

Yes, as I mentioned earlier, the @@ characters stored between the opening and closing HTML syntax tags will be treated as regular / plain text strings. Particularly, the <p>TEXT HERE</p> tag represents the syntax for creating paragraph text. Every character stored in the TEXT HERE part will be treated as a plain text string and will be rendered exactly as it is.

Sorry, my mistake. I wonted to show the account from which I am paying but it is not linked to @@accounts@@ but to @@PaidFrom@@
image

Maybe you can try to utilize JavaScript within the <script> tag in the theme you are creating. Because you said the account you want to retrieve is from @@PaidFrom@@, I assume the account is referring to Bank & Cash Accounts, is that right? It seems, however, by default the standard theme will not capture it. In my case, to achieve that, I fetch the Bank & Cash Account Name by utilizing the Manager API. The Manager API can be combine in the script to extract data that is not available in the theme from of certain module, such as Bank & Cash Accounts.

If you are accustomed to APIs, you can view the documentation here:

Footer Merge Tags work reliably and display their values correctly on both standard themes and custom themes.




You can view the list of supported tags in the Merge Tags section within the Footer Edit Form. Please note that only the tags listed there are recognized and usable.

Tested this using Desktop Edition v25.9.22.2812, and the tags rendered as expected.

Brother @Mabaega the use of these merge tags is applied in the Footers module as usual, correct? Without the need to alter the HTML code in the theme? Previously, brother @Davide provided a theme code snippet and incorporated the merge tags within the theme code. It shouldn’t be necessary, right?

I tried it using the footer the way it’s meant to be used. And yes, the merge tags work just fine.

If @Davide meant putting the footer tags directly into the theme code, those won’t be recognized. They’ll just show up as plain text.
Footer tags only work inside the actual Footer module.

But if we want to show more detailed data in our custom theme, we can tap into API3 using postMessage. That way, we can pull in extra info from Manager that merge tags alone can’t provide.

Here’s a quick example of how to grab full invoice data:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <title>Invoice Enricher</title>
  <style>
    body {
      font-family: monospace;
      background: #111;
      color: #0f0;
      padding: 1rem;
    }
    pre {
      white-space: pre-wrap;
      word-break: break-word;
    }
  </style>
</head>
<body>
  <h3>🔄 Loading and enriching invoice data...</h3>
  <pre id="output">Waiting for invoice key...</pre>

  <script>
    const output = document.getElementById("output");
    const pendingRequests = {};

    const generateRequestId = () => crypto.randomUUID();

    const makeManagerApiRequest = (path, method = "GET", body = null) =>
      new Promise((resolve, reject) => {
        const requestId = generateRequestId();
        console.log(`📡 API Request: [${method}] ${path}`, body ?? "");
        pendingRequests[requestId] = { resolve, reject, path, method };
        window.parent.postMessage({ type: "api-request", requestId, path, method, body }, "*");
      });

    const safeFetch = async (path, method = "GET", body = null) => {
      try {
        const result = await makeManagerApiRequest(path, method, body);
        return result;
      } catch (err) {
        console.error(`❌ API Error on [${method}] ${path}: ${err.message}`);
        return null;
      }
    };

    const apiFetchers = {
      businessDetails: () => safeFetch("/api3/business-details-form"),
      customer: (id) => id ? safeFetch(`/api3/customer-form/${id}`) : null,
      item: async (id) => {
        if (!id) return null;
        for (const p of ["/api3/inventory-item-form", "/api3/non-inventory-item-form", "/api3/inventory-kit-form"]) {
          const data = await safeFetch(`${p}/${id}`);
          if (data) return data;
        }
        return null;
      },
      taxCode: (id) => id ? safeFetch(`/api3/tax-code-form/${id}`) : null,
      reportingCategory: (id) => id ? safeFetch(`/api3/tax-code-reporting-category-form/${id}`) : null,
      taxAmountReportingCategory: (id) => id ? safeFetch(`/api3/tax-amount-reporting-category-form/${id}`) : null,
      salesInvoiceRef: async (id) => {
        if (!id) return null;
        const si = await safeFetch(`/api3/sales-invoice-form/${id}`);
        return si ? {
          issueDate: si.issueDate,
          reference: si.reference,
          fbrInvoiceNumber: si.customFields2?.strings?.["24b11f97-46d7-472e-ad4b-e99fbed9197e"] ?? null
        } : null;
      }
    };

    const enrichInvoice = async (invoice) => {
      const enriched = { ...invoice };
      enriched.businessDetails = await apiFetchers.businessDetails();
      enriched.customer = await apiFetchers.customer(enriched.customer);

      if (Array.isArray(enriched.lines)) {
        for (const line of enriched.lines) {
          line.item = await apiFetchers.item(line.item);
          line.taxCode = await apiFetchers.taxCode(line.taxCode);
          if (line.taxCode?.reportingCategory) {
            line.taxCode.reportingCategory = await apiFetchers.reportingCategory(line.taxCode.reportingCategory);
          }
          if (line.taxCode?.taxAmountReportingCategory) {
            line.taxCode.taxAmountReportingCategory = await apiFetchers.taxAmountReportingCategory(line.taxCode.taxAmountReportingCategory);
          }
        }
      }

      if (enriched.salesInvoice) {
        enriched.salesInvoice = await apiFetchers.salesInvoiceRef(enriched.salesInvoice);
      }

      return enriched;
    };

    window.addEventListener("message", async (event) => {
      if (event.source !== window.parent) return;
      const data = event.data;

      if (data.type === "context-response") {
        const ctx = data.body;
        const invoiceKey = ctx.Key || ctx.key || ctx.ID || ctx.Id || ctx.id;

        if (!invoiceKey) {
          output.textContent = "❌ Invoice key not found in context.";
          return;
        }

        output.textContent = `🔑 Found invoice key: ${invoiceKey}\n⏳ Fetching full invoice...`;

        try {
          const fullInvoice = await makeManagerApiRequest(`/api3/sales-invoice-form/${invoiceKey}`);
          output.textContent = "📦 Full invoice received. Enriching data...";
          const enriched = await enrichInvoice(fullInvoice);

          output.textContent = JSON.stringify({ context: ctx, full: enriched }, null, 2);
          console.log("✅ Enriched Invoice:", enriched);
        } catch (err) {
          output.textContent = `❌ Error: ${err.message}`;
          console.error(err);
        }
      }

      if (data.type === "api-response") {
        const { requestId, body, status, statusText } = data;
        const pending = pendingRequests[requestId];
        if (pending) {
          const { path, method } = pending;
          if (status >= 400) {
            console.error(`❌ API Response Error [${method}] ${path} → HTTP ${status}: ${statusText}`);
            pending.reject(new Error(`HTTP ${status}: ${statusText || "Request failed"}`));
          } else {
            console.log(`📥 API Response Success [${method}] ${path} → HTTP ${status}`);
            pending.resolve(body);
          }
          delete pendingRequests[requestId];
        }
      }
    });

    window.addEventListener("load", () => {
      window.parent.postMessage({ type: "context-request" }, "*");
    });
  </script>
</body>
</html>

Result :

🔄 Loading and enriching invoice data...
{
  "context": {
    "type": "salesinvoice",
    "key": "e29fb8e0-f239-4abd-bd45-6134834e8b75",
    "custom_theme": "a3eccec0-6993-452c-ad3d-5a7a08203dea",
    "direction": "ltr",
    "title": "Invoice",
    "description": null,
    "reference": "7",
    "emphasis": {
      "text": "Overdue",
      "positive": false,
      "negative": true
    },
    "fields": [
      {
        "key": "InvoiceDate",
        "label": "Invoice date",
        "text": "7/19/2025",
        "emphasis": false
      },
      {
        "key": "DueDate",
        "label": "Due date",
        "text": "7/19/2025",
        "emphasis": false
      },
      {
        "key": "InvoiceNumber",
        "label": "Invoice number",
        "text": "7",
        "emphasis": false
      }
    ],
    "custom_fields": [
      {
        "key": "",
        "label": "Total amount in words",
        "text": "Eight hundred and fifty-two and 50/100",
        "value": null,
        "displayAtTheTop": false
      }
    ],
    "table": {
      "columns": [
        {
          "label": "Item",
          "align": "start",
          "nowrap": false,
          "total": false,
          "emphasis": false,
          "minWidth": false,
          "alwaysShow": false,
          "sum": null,
          "sumText": null
        },
        {
          "label": "Description",
          "align": "start",
          "nowrap": false,
          "total": false,
          "emphasis": false,
          "minWidth": false,
          "alwaysShow": false,
          "sum": null,
          "sumText": null
        },
        {
          "label": "PCS",
          "align": "center",
          "nowrap": true,
          "total": true,
          "emphasis": false,
          "minWidth": false,
          "alwaysShow": false,
          "sum": 3,
          "sumText": "3"
        },
        {
          "label": "Unit price",
          "align": "right",
          "nowrap": true,
          "total": false,
          "emphasis": false,
          "minWidth": false,
          "alwaysShow": false,
          "sum": null,
          "sumText": null
        },
        {
          "label": "Price",
          "align": "right",
          "nowrap": true,
          "total": true,
          "emphasis": false,
          "minWidth": false,
          "alwaysShow": false,
          "sum": 800,
          "sumText": "800.00"
        },
        {
          "label": "Discount",
          "align": "right",
          "nowrap": true,
          "total": false,
          "emphasis": false,
          "minWidth": false,
          "alwaysShow": false,
          "sum": null,
          "sumText": null
        },
        {
          "label": "Total",
          "align": "right",
          "nowrap": true,
          "total": false,
          "emphasis": true,
          "minWidth": false,
          "alwaysShow": true,
          "sum": null,
          "sumText": null
        }
      ],
      "rows": [
        {
          "cells": [
            {
              "value": null,
              "canBeHidden": false,
              "text": "Item 01"
            },
            {
              "value": null,
              "canBeHidden": false,
              "text": "desc1============"
            },
            {
              "value": 2,
              "canBeHidden": false,
              "text": "2"
            },
            {
              "value": 200,
              "canBeHidden": false,
              "text": "200.00"
            },
            {
              "value": 400,
              "canBeHidden": false,
              "text": "400.00"
            },
            {
              "value": 10,
              "canBeHidden": false,
              "text": "10.00"
            },
            {
              "value": 390,
              "canBeHidden": false,
              "text": "390.00"
            }
          ]
        },
        {
          "cells": [
            {
              "value": null,
              "canBeHidden": false,
              "text": "Item 02"
            },
            {
              "value": null,
              "canBeHidden": false,
              "text": "desc2============"
            },
            {
              "value": 1,
              "canBeHidden": false,
              "text": "1"
            },
            {
              "value": 400,
              "canBeHidden": false,
              "text": "400.00"
            },
            {
              "value": 400,
              "canBeHidden": false,
              "text": "400.00"
            },
            {
              "value": 15,
              "canBeHidden": false,
              "text": "15.00"
            },
            {
              "value": 385,
              "canBeHidden": false,
              "text": "385.00"
            }
          ]
        }
      ],
      "totals": [
        {
          "class": "",
          "key": "",
          "label": "Sub-total",
          "text": "775.00",
          "number": 775,
          "emphasis": false
        },
        {
          "class": "taxAmount",
          "key": "",
          "label": "10% VAT",
          "text": "77.50",
          "number": 77.5,
          "emphasis": false
        },
        {
          "class": "",
          "key": "Total",
          "label": "Total",
          "text": "852.50",
          "number": 852.5,
          "emphasis": true
        },
        {
          "class": "",
          "key": "",
          "label": "Credit Note — 1 — 7/27/2025",
          "text": "- 660.00",
          "number": 0,
          "emphasis": false
        },
        {
          "class": "",
          "key": "",
          "label": "Balance due",
          "text": "192.50",
          "number": 0,
          "emphasis": true
        }
      ]
    },
    "business": {
      "logo": null,
      "name": "My Company Name",
      "address": "My Company Address",
      "country": "en-PK",
      "custom_fields": []
    },
    "recipient": {
      "code": null,
      "name": "Customer 01",
      "address": "asfdasdfsadfsadfsadfsdfs",
      "email": "asfdasdfa@asdfasdf.net",
      "telephone": null
    },
    "timestamp": 638943120617805600,
    "footers": [
      "<p>Normal Tags</p>\n<p>Image:\t\t<br />\nAttachment:\tis not checked\t<br />\nIssue date:\t7/19/2025\t<br />\nDue date:\t7/19/2025\t<br />\nReference:\t7\t<br />\nSales Quote:\t\t<br />\nSales Order:\t\t<br />\nCustomer:\tCustomer 01\t<br />\nDescription:\t\t<br />\nProject:\t\t<br />\nDivision:\t\t<br />\nClosed invoice:\tis not checked\t<br />\nWithholding tax:\t\t<br />\nDiscount:\t25.00\t<br />\nInvoice Amount:\t852.50\t<br />\nCost of sales:\t0.00\t<br />\nBalance due:\t192.50\t<br />\nDays to Due Date:\t\t<br />\nDays overdue:\t67\t<br />\nStatus:\tOverdue\t<br />\nTimestamp:\t9/24/2025 7:01:01 PM</p>\n<hr />\n<p>Tag From Custom Field</p>\n<p>Application Version\tV123456789809</p>\n"
    ],
    "serviceLink": "",
    "legacyQrCodeForSaudiArabia": false,
    "EmailVariables": {}
  },
  "full": {
    "issueDate": "2025-07-19T00:00:00",
    "dueDate": 0,
    "dueDateDays": null,
    "dueDateDate": null,
    "reference": "7",
    "quoteNumber": null,
    "orderNumber": null,
    "customer": {
      "name": "Customer 01",
      "code": null,
      "creditLimit": 0,
      "currency": null,
      "billingAddress": "asfdasdfsadfsadfsadfsdfs",
      "deliveryAddress": "asdfsadfsadfsadfsdf",
      "email": "asfdasdfa@asdfasdf.net",
      "division": null,
      "controlAccount": null,
      "hasDefaultDueDateDays": false,
      "defaultDueDateDays": null,
      "hasDefaultHourlyRate": false,
      "defaultHourlyRate": 0,
      "inactive": false,
      "customFields": null,
      "customFields2": {
        "strings": null,
        "decimals": null,
        "dates": null,
        "booleans": null,
        "stringArrays": null,
        "images": null
      }
    },
    "salesQuote": null,
    "salesOrder": null,
    "billingAddress": null,
    "exchangeRate": 0,
    "exchangeRateIsInverse": false,
    "description": null,
    "lines": [
      {
        "item": {
          "itemCode": null,
          "itemName": "Item 01",
          "unitName": "PCS",
          "valuationMethod": 0,
          "division": null,
          "controlAccount": null,
          "reorderPoint": false,
          "qtyDesired": 0,
          "customIncomeAccount": false,
          "incomeAccount": null,
          "customExpenseAccount": false,
          "expenseAccount": null,
          "hasDefaultLineDescription": false,
          "defaultLineDescription": null,
          "hasDefaultPurchaseUnitPrice": false,
          "defaultPurchaseUnitPrice": 0,
          "hasDefaultSalesUnitPrice": false,
          "defaultSalesUnitPrice": 0,
          "hasDefaultDivision": false,
          "defaultDivision": null,
          "hasDefaultTaxCode": false,
          "defaultTaxCode": null,
          "hideItemNameOnPrintedDocuments": false,
          "inactive": false,
          "customFields": null,
          "customFields2": {
            "strings": {
              "a223489a-6a79-423f-a63d-b2357b18c5a4": "1234"
            },
            "decimals": null,
            "dates": null,
            "booleans": null,
            "stringArrays": null,
            "images": null
          }
        },
        "account": null,
        "capitalAccount": null,
        "subAccount": null,
        "specialAccount": null,
        "fixedAsset": null,
        "intangibleAsset": null,
        "lineDescription": "desc1============",
        "customFields": {},
        "customFields2": {
          "strings": {},
          "decimals": {},
          "dates": {},
          "booleans": {},
          "stringArrays": {},
          "images": {}
        },
        "qty": 2,
        "salesUnitPrice": 200,
        "currencyAmount": 0,
        "discountPercentage": 10,
        "discountAmount": 10,
        "taxCode": {
          "name": "PPN 10%",
          "label": "10% VAT",
          "reportingCategory": null,
          "reportingCategoryReversed": null,
          "taxRate": 2,
          "type": 0,
          "rate": 10,
          "account": null,
          "taxAmountReportingCategory": null,
          "taxAmountReversedReportingCategory": null,
          "components": [
            {
              "name": null,
              "componentRate": 0,
              "componentAccount": null,
              "componentTaxAmountReportingCategory": null,
              "componentTaxAmountReversedReportingCategory": null
            }
          ],
          "reverseCharged": false,
          "customSalesInvoiceTitle": false,
          "salesInvoiceTitle": null,
          "customCreditNoteTitle": false,
          "creditNoteTitle": null,
          "inactive": false,
          "customFields": null,
          "customFields2": {
            "strings": null,
            "decimals": null,
            "dates": null,
            "booleans": null,
            "stringArrays": null,
            "images": null
          }
        },
        "project": null,
        "division": null
      },
      {
        "item": {
          "itemCode": null,
          "itemName": "Item 02",
          "unitName": "PCS",
          "valuationMethod": 0,
          "division": null,
          "controlAccount": null,
          "reorderPoint": false,
          "qtyDesired": 0,
          "customIncomeAccount": false,
          "incomeAccount": null,
          "customExpenseAccount": false,
          "expenseAccount": null,
          "hasDefaultLineDescription": false,
          "defaultLineDescription": null,
          "hasDefaultPurchaseUnitPrice": false,
          "defaultPurchaseUnitPrice": 0,
          "hasDefaultSalesUnitPrice": false,
          "defaultSalesUnitPrice": 0,
          "hasDefaultDivision": false,
          "defaultDivision": null,
          "hasDefaultTaxCode": false,
          "defaultTaxCode": null,
          "hideItemNameOnPrintedDocuments": false,
          "inactive": false,
          "customFields": null,
          "customFields2": {
            "strings": {
              "a223489a-6a79-423f-a63d-b2357b18c5a4": "1234"
            },
            "decimals": null,
            "dates": null,
            "booleans": null,
            "stringArrays": null,
            "images": null
          }
        },
        "account": null,
        "capitalAccount": null,
        "subAccount": null,
        "specialAccount": null,
        "fixedAsset": null,
        "intangibleAsset": null,
        "lineDescription": "desc2============",
        "customFields": {},
        "customFields2": {
          "strings": {},
          "decimals": {},
          "dates": {},
          "booleans": {},
          "stringArrays": {},
          "images": {}
        },
        "qty": 1,
        "salesUnitPrice": 400,
        "currencyAmount": 0,
        "discountPercentage": 15,
        "discountAmount": 15,
        "taxCode": {
          "name": "PPN 10%",
          "label": "10% VAT",
          "reportingCategory": null,
          "reportingCategoryReversed": null,
          "taxRate": 2,
          "type": 0,
          "rate": 10,
          "account": null,
          "taxAmountReportingCategory": null,
          "taxAmountReversedReportingCategory": null,
          "components": [
            {
              "name": null,
              "componentRate": 0,
              "componentAccount": null,
              "componentTaxAmountReportingCategory": null,
              "componentTaxAmountReversedReportingCategory": null
            }
          ],
          "reverseCharged": false,
          "customSalesInvoiceTitle": false,
          "salesInvoiceTitle": null,
          "customCreditNoteTitle": false,
          "creditNoteTitle": null,
          "inactive": false,
          "customFields": null,
          "customFields2": {
            "strings": null,
            "decimals": null,
            "dates": null,
            "booleans": null,
            "stringArrays": null,
            "images": null
          }
        },
        "project": null,
        "division": null
      }
    ],
    "hasLineNumber": false,
    "hasLineDescription": true,
    "discount": true,
    "discountType": 1,
    "amountsIncludeTax": false,
    "rounding": false,
    "roundingMethod": 0,
    "withholdingTax": false,
    "withholdingTaxType": 0,
    "withholdingTaxPercentage": 0,
    "withholdingTaxAmount": 0,
    "earlyPaymentDiscount": false,
    "earlyPaymentDiscountType": 0,
    "earlyPaymentDiscountRate": 0,
    "earlyPaymentDiscountAmount": 0,
    "earlyPaymentDiscountDays": null,
    "latePaymentFees": false,
    "latePaymentFeesPercentage": 0,
    "totalAmountInWords": true,
    "totalAmountInBaseCurrency": false,
    "bilingual": false,
    "hasSalesInvoiceCustomTitle": false,
    "salesInvoiceCustomTitle": null,
    "hasSalesInvoiceCustomTheme": true,
    "salesInvoiceCustomTheme": "a3eccec0-6993-452c-ad3d-5a7a08203dea",
    "automaticReference": false,
    "hideDueDate": false,
    "hideBalanceDue": false,
    "closedInvoice": false,
    "showItemImages": false,
    "showTaxAmountColumn": false,
    "alsoActsAsDeliveryNote": false,
    "salesInventoryLocation": null,
    "hasSalesInvoiceFooters": true,
    "salesInvoiceFooters": [
      "7f9aebf5-c8b9-4c8a-b582-56b741439f9e"
    ],
    "hasRelay": false,
    "relay": null,
    "customFields": {},
    "customFields2": {
      "strings": {
        "9b38f0eb-ff07-4a73-9192-e6fde7a6b24c": "V123456789809"
      },
      "decimals": {},
      "dates": {},
      "booleans": {},
      "stringArrays": {},
      "images": {}
    },
    "businessDetails": {
      "name": "My Company Name",
      "address": "My Company Address",
      "country": "en-PK",
      "customFields": null,
      "customFields2": {
        "strings": {
          "9b38f0eb-ff07-4a73-9192-e6fde7a6b24c": ""
        },
        "decimals": null,
        "dates": null,
        "booleans": null,
        "stringArrays": null,
        "images": null
      }
    }
  }
}

API3? Has the API Manager now reached version 3?

API3 was specifically introduced for use within Manager-Extensions, and while the path structure remains the same as API2, the way it’s used is quite different.

Instead of making direct HTTP requests like in API2, API3 communicates via postMessage from within the iframe.

Oh, so that’s what it means, I understand. Given the current theme structure that uses iframe, and now there’s this new Extension feature. The endpoint remains the same as the one used in API2, is that correct?

Exactly! As shown in my theme example, it successfully retrieves invoice data along with all related entities—such as Customer, Item, TaxCode, and Business Details—using the same endpoints as API2.

I see. Thanks for the information Bro.