Download OpenAPI specification:
Action-based Web API for Excellent Books ERP Portal operations.
Unlike traditional REST APIs with multiple endpoints, WebExcellentAPI uses a single endpoint with an action parameter that determines the operation:
GET/POST /WebExcellentAPI.hal?action={action_name}&{parameters}
https://your-server:port/WebExcellentAPI.hal
HTTP Basic Authentication (same credentials as REST API)
curl -u username:password "https://server:port/WebExcellentAPI.hal?action=login"
Cookie-Based Sessions (Recommended for Performance):
After initial Basic Auth, use the returned HSESSION cookie for subsequent requests to reduce server load significantly.
# Initial request with Basic Auth - save cookies
curl -u username:password "https://server:port/WebExcellentAPI.hal?action=login" -c cookies.txt
# Subsequent requests - use cookie only
curl "https://server:port/WebExcellentAPI.hal?action=pastespecial®ister=INVc&id=laptop" \
-H "Cookie: HSESSION=CC1AC3C5-DAC9C590-DA4FD41F-1E820CB7-C1713CC8"
See REST API documentation for full session configuration details.
<data> or <res> elements<error> element or errstr attribute?action=login
?action=deactivate&usercode=API
?action=delete®ister=IVVc&id=12345
?action=deleterow®ister=IVVc&id=12345:2,3 (id format: {SerNr}:{rows})
?action=insertrow®ister=IVVc&id=12345:1:1 (id format: {SerNr}:{afterRow}:{rowType})
?action=posttext®ister=MailVc&id=12345 (POST with body)
?action=document®ister=IVVc&id=12345&doccode=INV
?action=document®ister=ORVc&id=54321&doccode=ORD&language=est
?action=action®ister=doupload®name=IVVc&id=12345 (POST with file)
?action=action®ister=getattachlist®name=IVVc&id=12345
?action=action®ister=getfile®name=IVVc&id=12345&file={uuid}
?action=action®ister=deleteattachment®name=IVVc&id=12345&file={uuid}
?action=action®ister=checkapprovalstatus®name=ActVc&id=12345
?action=action®ister=sendforapproval®name=IVVc&id=12345
?action=action®ister=approveactivity&id=12345&usercode=JOHN
?action=action®ister=rejectactivity&id=12345&usercode=JOHN
?action=action®ister=cancelapproval®name=IVVc&id=12345
?action=action®ister=createsigningactivity®name=ORVc&id=12345
?action=action®ister=createsigningsess&id=12345
?action=action®ister=startsigning&id=12345
?action=action®ister=cancelsigning&id=12345®name=ActVc
?action=action®ister=getactivitydata&id=12345
?action=action®ister=getcomments&id=12345
?action=action®ister=addcomment&id=12345 (POST with comment)
?action=action®ister=settaskdescription&id=12345 (POST with text)
?action=pastespecial®ister=INVc&id=laptop
?action=pastespecial®ister=CUVc&id=acme&compno=2
?action=pastespecial®ister=AllCUVc&id=john
Note: pastespecial uses id parameter for search text. Returns max 50 results.
Search fields: INVc (Code, Name), CUVc/VEVc/AllCUVc (Code, Name, RegNr1), UserVc (Code, Name).
POST ?action=windowactions (with Base64-encoded JSON body)
POST ?action=windowactions&usercode=JOHN (for __new with user defaults)
POST ?action=activeeditfields (get editable fields state)
?register=IVVc&sd=2024-01-01&ed=2024-12-31&perpage=50
?register=ActVc&search=pending&sortkey=TransDate&order=descending
?register=CUVc&page=1&perpage=100
?register=Kanban&usercode=JOHN
POST /WebExcellentAPI.hal?action=report
Content-Type: application/json
{"reportwindow": "INEClass", "lang": "EST", "spec": {"d1": "31.12.2025"}, "repname": "InvValRn"}
?action=action®ister=getemployeeinfo&empcode=EMP001
?action=action®ister=getvacationbalance&empcode=EMP001
?action=action®ister=getemptimeplan&empcode=EMP001&sd=2024-01-01&ed=2024-01-31
?action=action®ister=getportalusers
?action=action®ister=getallusers
?action=action®ister=getnotifications&usercode=JOHN
?action=action®ister=getdashboardkpi
?action=action®ister=copyrecord®name=IVVc&id=12345
?action=action®ister=unokrecord®name=IVVc&id=12345&usercode=JOHN
?action=action®ister=getbilinks&usercode=JOHN
?action=action®ister=getactivitytypes
These parameters can be used with any WebExcellentAPI action:
| Parameter | Description |
|---|---|
compno |
Company number (for multi-company databases). If not specified, uses current/default company. |
usercode |
User code for user-specific operations |
portalcc |
Country code for country-specific features (est = Estonia, lat = Latvia) |
Example with company number:
?action=pastespecial®ister=INVc&id=laptop&compno=2
?action=action®ister=getattachlist®name=IVVc&id=12345&compno=3
Authenticates and returns system configuration including supported features, date formats, and version info.
Example Request:
GET /WebExcellentAPI.hal?action=login
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Example Response:
<res>
<dateformat>YYYY-MM-DD</dateformat>
<dec_separator>,</dec_separator>
<apiversion>2.1</apiversion>
<version>8.5</version>
<supported>
<activities>1</activities>
<invoices>1</invoices>
<attachments>1</attachments>
<hassigning>1</hassigning>
</supported>
</res>
| action required | string Value: "login" |
Record manipulation operations including delete, row operations, and text posting.
Actions: delete, deleterow, insertrow, posttext
Supported Registers:
Deletes a record from the specified register.
Example Request:
GET /WebExcellentAPI.hal?action=delete®ister=IVVc&id=12345
Example Response (Success):
<data><res errstr=""/></data>
Example Response (Error):
<data><res errstr="Record is locked"/></data>
| action required | string Value: "delete" |
| register required | string Enum: "IVVc" "VIVc" "ORVc" "QTVc" "ActVc" "CUVc" "EPOrderDocVc" Register to delete from |
| id required | string Record ID (SerNr) |
Deletes specific rows from a multi-row record (invoice, order, etc.).
Important: The id parameter uses a colon-separated format: {SerNr}:{rows}
Example Request:
GET /WebExcellentAPI.hal?action=deleterow®ister=IVVc&id=12345:2,3,5
12345 = Record SerNr2,3,5 = Row numbers to delete (1-based, comma-separated)Multiple rows can be deleted in a single request.
| action required | string Value: "deleterow" |
| register required | string Enum: "IVVc" "ORVc" "VIVc" "ActVc" "EXCExternalSignersVc" "EXCSignSessVc" "EPOrderDocVc" |
| id required | string Example: id=12345:2,3 Format: {SerNr}:{rows} - Record ID and comma-separated row numbers |
Inserts a new empty row into a multi-row record.
Important: The id parameter uses a colon-separated format: {SerNr}:{afterRow}:{rowType}
Example Request:
GET /WebExcellentAPI.hal?action=insertrow®ister=IVVc&id=12345:1:1
12345 = Record SerNr1 = Insert after row number (0 = at beginning)1 = Row type (stp field value, typically 1 for normal item row)Common row types (stp):
1 = Normal item row2 = Text/comment row3 = Credit row| action required | string Value: "insertrow" |
| register required | string Enum: "IVVc" "VIVc" "EXCExternalSignersVc" "EXCSignSessVc" |
| id required | string Example: id=12345:1:1 Format: {SerNr}:{afterRow}:{rowType} - Record ID, row position, and row type |
Posts text/HTML content to a record's text field (e.g., email body, document text).
Example Request:
POST /WebExcellentAPI.hal?action=posttext®ister=MailVc&id=12345
Content-Type: application/x-www-form-urlencoded
set_field.Math=<p>Email body content here</p>
| action required | string Value: "posttext" |
| register required | string Enum: "MailVc" "EPOrderDocVc" |
| id required | string |
| set_field.Math | string Text/HTML content |
Document generation and PDF printing.
Actions: document
Supported Registers: IVVc, VIVc, ORVc, QTVc, EPOrderDocVc
Generates a PDF document for printing or download.
Example Request:
GET /WebExcellentAPI.hal?action=document®ister=IVVc&id=12345&doccode=INV
Example Response:
<data>
<file>
<name>Invoice_12345.pdf</name>
<base64>JVBERi0xLjQK...</base64>
</file>
</data>
The base64 field contains the PDF file encoded in base64.
| action required | string Value: "document" |
| register required | string Enum: "IVVc" "VIVc" "ORVc" "QTVc" "EPOrderDocVc" |
| id required | string |
| doccode | string Document template code |
| language | string Enum: "est" "lat" "eng" Document language |
File upload, download, listing, and deletion.
Sub-actions (via action=action):
doupload - Upload file attachment (POST)getattachlist - List attachments for recordgetfile - Download attachment by UUIDdeleteattachment - Remove attachmentgetrecordlinks - Get linked recordssendemail - Email document with PDF attachmentSupported Registers: IVVc, VIVc, QTVc, StockTakeVc, ORVc, ActVc, CUVc, EPOrderDocVc
File Size Limit:
Maximum upload size is configured in Excellent Books:
Technics > Registers > Program Settings > Web tab > Max Web Post Size
File Format:
Files are transferred as Base64-encoded content wrapped in XML. The root element is <file> (no outer <root> wrapper):
<?xml version="1.0" encoding="UTF-8"?>
<file><filename>document.pdf</filename><base64>...</base64></file>
Endpoint:
POST /WebExcellentAPI.hal?action=action®ister=doupload®name=IVVc&id=2525040
Request Body:
<?xml version="1.0" encoding="UTF-8"?>
<file>
<filename>invoice_scan.pdf</filename>
<base64>JVBERi0xLjQK...base64_encoded_content...</base64>
</file>
Note: The XML root element is
<file>directly. Do NOT wrap it in an outer<root>element.
Parameters:
action=action - Required for sub-action callsregister=doupload - The sub-action to executeregname=IVVc - Target register (IVVc, VIVc, ORVc, CUVc, etc.)id=2525040 - SerNr of the record to attach file tocurl Example:
curl -X POST "https://server:port/WebExcellentAPI.hal?action=action®ister=doupload®name=IVVc&id=2525040" \
-u username:password \
-H "Content-Type: application/xml" \
-d '<?xml version="1.0" encoding="UTF-8"?><file><filename>document.pdf</filename><base64>JVBERi0xLjQK...</base64></file>'
Success Response:
<data><res errstr="" uuid="a1b2c3d4-e5f6-7890-abcd-ef1234567890"/></data>
The returned uuid identifies the uploaded file for later use with getfile or deleteattachment.
Sends email with document PDF attachment to the customer/contact. Prerequisites:
?action=action®ister=sendemail®name=IVVc&id=10001&usercode=JOHN
Supported registers for sendemail: IVVc, ORVc, QTVc
Returns list of records linked to the specified record (e.g., orders linked to invoice).
?action=action®ister=getrecordlinks®name=IVVc&id=10001
Uploads a file attachment to a record.
Example Request:
POST /WebExcellentAPI.hal?action=action®ister=doupload®name=IVVc&id=12345
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<file>
<filename>receipt.pdf</filename>
<base64>JVBERi0xLjQK...</base64>
</file>
Important: The XML root element is
<file>directly. Do NOT wrap it in an outer<root>element — the upload will silently succeed (HTTP 200) but no file is stored.
Example Response:
<data><res errstr="" uuid="a1b2c3d4-e5f6-7890-abcd-ef1234567890"/></data>
| action required | string Value: "action" |
| register required | string Value: "doupload" |
| regname required | string Enum: "IVVc" "VIVc" "QTVc" "StockTakeVc" "ORVc" "ActVc" "CUVc" "EPOrderDocVc" "EPShiftSheetVc" Target register |
| id required | string |
| filename | string |
| base64 | string Base64-encoded file content |
Returns list of all attachments for a record.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getattachlist®name=IVVc&id=12345
Example Response:
<data>
<attachment uuid="a1b2c3d4..." filename="receipt.pdf" size="102400" date="2024-01-15"/>
<attachment uuid="e5f67890..." filename="photo.jpg" size="51200" date="2024-01-16"/>
</data>
| action required | string Value: "action" |
| register required | string Value: "getattachlist" |
| regname required | string |
| id required | string |
Downloads an attachment file by UUID.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getfile®name=IVVc&id=12345&file=a1b2c3d4-e5f6-7890-abcd-ef1234567890
| action required | string Value: "action" |
| register required | string Value: "getfile" |
| regname required | string |
| id required | string |
| file required | string <uuid> File UUID |
Approval workflow operations for documents and activities.
Sub-actions (via action=action):
checkapprovalstatus - Get current approval statesendforapproval - Submit for approvalapproveactivity - Approve recordrejectactivity - Reject recordcancelapproval - Cancel pending approvalsignactivity - Sign approved recordApproval Status Codes:
Returns the current approval status of a record.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=checkapprovalstatus®name=IVVc&id=12345
Example Response:
<data>
<res errstr="" regname="IVVc"/>
<DummyVc>
<hasapprovals>1</hasapprovals>
<approvalstatus>3</approvalstatus>
<message>Waiting for approval from MANAGER</message>
<cancancel>1</cancancel>
</DummyVc>
</data>
Status Codes:
| action required | string Value: "action" |
| register required | string Value: "checkapprovalstatus" |
| regname required | string Enum: "ActVc" "IVVc" "VIVc" "ORVc" "QTVc" "EPOrderDocVc" "OPVc" |
| id required | string |
Submits a record to the approval workflow.
Supported registers: IVVc, VIVc, ORVc, QTVc, ActVc, EPOrderDocVc, OPVc
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=sendforapproval®name=IVVc&id=12345
| action required | string Value: "action" |
| register required | string Value: "sendforapproval" |
| regname required | string Enum: "IVVc" "VIVc" "ORVc" "QTVc" "ActVc" "EPOrderDocVc" "OPVc" |
| id required | string |
Approves a record pending approval.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=approveactivity&id=12345&usercode=MANAGER
| action required | string Value: "action" |
| register required | string Value: "approveactivity" |
| id required | string |
| usercode required | string Approver's user code |
Rejects a record pending approval.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=rejectactivity&id=12345&usercode=MANAGER
| action required | string Value: "action" |
| register required | string Value: "rejectactivity" |
| id required | string |
| usercode required | string |
Digital signing operations using Dokobit integration.
Sub-actions (via action=action):
createsigningactivity - Create signing activity for documentcreatesigningsess - Create signing sessionstartsigning - Initiate signing processcancelsigning - Cancel signing sessionSupported for: ORVc, IVVc, EPOrderDocVc, EPContractVc
Creates a digital signing activity for a document (Dokobit integration).
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=createsigningactivity®name=ORVc&id=12345
| action required | string Value: "action" |
| register required | string Value: "createsigningactivity" |
| regname required | string Enum: "ORVc" "IVVc" "EPOrderDocVc" "EPContractVc" "EPTS2Vc" |
| id required | string |
Initiates the digital signing process for a signer.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=startsigning&id=12345
Returns a URL to redirect the user to the Dokobit signing interface.
| action required | string Value: "action" |
| register required | string Value: "startsigning" |
| id required | string Signing activity or session SerNr |
| usercode | string User code (optional, uses session user if not specified) |
Activity and task management operations.
Sub-actions (via action=action):
getactivitydata - Get activity detailsgetcomments - Get activity commentsaddcomment - Add comment to activitysettaskdescription - Update task descriptiongetactivitytypes - List available activity typesPaste special, search, and field trigger operations.
Actions: pastespecial, windowactions, activeeditfields
Search for records to populate lookup fields.
Supported Registers: INVc, CUVc, VEVc, AllCUVc, UserVc
Simulates field changes in the UI, executing business logic and returning computed values. This is useful for building custom form UIs that need real-time field calculations without saving the record.
Supported Registers: INVc, IVVc, ORVc, CUVc, ActVc, QTVc, VIVc
How it works:
Use Cases:
Special Fields:
__new - Initialize a new empty record with defaults__copy - Duplicate an existing recordReturns which fields are currently editable based on record state.
Supported Registers: ORVc, CUVc
Use Cases:
Searches for records to use in paste special / lookup fields.
Note: This endpoint uses the id parameter for the search text (not search).
Returns a maximum of 50 results (hardcoded limit, pagination not supported).
Searchable Fields by Register:
| Register | Fields Searched |
|---|---|
| INVc | Code, Name |
| CUVc | Code, Name, RegNr1 |
| VEVc | Code, Name, RegNr1 (vendors only) |
| AllCUVc | Code, Name, RegNr1 (all contacts) |
| UserVc | Code, Name |
Search Behavior:
id=laptop dell matches items containing BOTH "laptop" AND "dell"Example Request:
GET /WebExcellentAPI.hal?action=pastespecial®ister=INVc&id=laptop
GET /WebExcellentAPI.hal?action=pastespecial®ister=CUVc&id=ACME&compno=2
Example Response:
<data>
<INVc>
<Code>LAPTOP01</Code>
<Name>Dell Laptop 15"</Name>
<UPrice1>899.00</UPrice1>
</INVc>
<INVc>
<Code>LAPTOP02</Code>
<Name>HP Laptop 14"</Name>
<UPrice1>749.00</UPrice1>
</INVc>
</data>
| action required | string Value: "pastespecial" |
| register required | string Enum: "INVc" "CUVc" "VEVc" "AllCUVc" "UserVc" Register to search in |
| id required | string Search text. Searched fields depend on register:
|
| compno | integer Company number (for multi-company databases) |
| bfilter | string Additional filter (only for INVc) |
Simulates a field value change in the UI and returns the record with all computed/derived fields updated. This is the core API for building custom form UIs that need real-time field calculations.
The request body must be Base64-encoded JSON (reversed byte order, then Base64).
Supported Registers: INVc, IVVc, ORVc, CUVc, ActVc, QTVc, VIVc, EPOrderDocVc, OPVc, IPVc
{
"vcname": "IVVc",
"fieldname": "CustCode",
"value": "ACME",
"rowindex": -1,
"headerfields": "CustCode:1,PayDeal:1,Addr0:1,CurncyCode:1",
"rowfields": "ArtCode:1,Quant:5,Price:5,Sum:5",
"values": {
"header": {
"CustCode": "ACME",
"InvDate": "2024-01-15"
},
"rows": [
{"stp": 1, "ArtCode": "ITEM01", "Quant": "2", "Price": "100.00"}
]
}
}
Field Type Codes (in headerfields/rowfields):
| Field | Triggers | Description |
|---|---|---|
Width |
Volume recalculation | Recalculates item volume via CalcINFields |
Height |
Volume recalculation | Recalculates item volume via CalcINFields |
Depth |
Volume recalculation | Recalculates item volume via CalcINFields |
Density |
NetWeight recalculation | If Volume and Density are set, recalculates NetWeight = Volume × Density |
NetWeight |
Density recalculation | If Volume and NetWeight are set, recalculates Density = NetWeight / Volume |
__new |
All defaults | Creates new empty item record with defaults |
__copy |
Duplicate record | Copies existing item (reads by Code from id field) |
| Field | Triggers | Description |
|---|---|---|
CustCode |
Address, PayDeal, Language, Region, SalesMan | Loads customer defaults |
ArtCode |
Price, VATCode, Description, SalesAcc | Loads item defaults |
Quant |
Sum, row recalculation | Recalculates line total |
Price |
Sum, row recalculation | Recalculates line total |
CurncyCode |
FrRate, ToRateB1, ToRateB2, BaseSum4 | Updates exchange rates |
PayDeal |
PayDate, PriceList | Loads payment terms |
InvDate |
Exchange rates, periods | Updates date-dependent values |
VATCode |
VAT calculation | Recalculates VAT |
Sum |
vRebate back-calculation | Calculates discount from sum |
SerialNr |
Dimensions, quantity | Loads serial number data |
UnitCode |
UnitFactor calculations | Updates unit conversions |
Location |
Stock validation | Validates stock location |
__new |
All defaults | Creates new empty invoice |
__copy |
Duplicate record | Copies existing invoice |
| Field | Triggers | Description |
|---|---|---|
CustCode |
Address, PayDeal, SalesMan | Loads customer defaults |
ArtCode |
Price, VATCode, Description | Loads item defaults |
Quant |
Sum, Price recalculation | Recalculates line (may update price for quantity discounts) |
Price |
Sum recalculation | Recalculates line total |
PlanShip |
Delivery date, PriceList | Updates planned shipment |
SerialNr |
Item, Location, Dimensions | Loads serial number and item |
__new |
All defaults | Creates new empty order |
__copy |
Duplicate record | Copies existing order |
| Field | Triggers | Description |
|---|---|---|
RegNr2 |
VAT validation | Validates registration number |
Name |
Search/validation | Name processing |
Person |
Mobile from contact relation | Loads contact person mobile |
CountryCode |
Address format | Updates address format |
IBANCode |
IBAN validation | Validates bank account |
VATNr |
VAT law validation | Validates VAT number |
__new |
All defaults | Creates new contact |
__copy |
Duplicate record | Copies existing contact |
| Field | Triggers | Description |
|---|---|---|
CUCode |
CUName, Phone, Contact | Loads customer info |
PRCode |
Project defaults | Loads project info |
ItemCode |
Item defaults in activity | Loads item info |
Contact |
Phone | Loads phone from customer relation |
ActType |
Default values | Loads activity type defaults |
ActState |
(no-op) | State field, no side effects |
TransDate |
EndDate, CostTime | Calculates duration |
EndDate |
Duration recalculation | Updates time calculations |
StartTime |
CostTime calculation | Recalculates duration |
EndTime |
CostTime calculation | Recalculates duration |
ActResult |
EndTime, CostTime | Closes activity |
TextCode |
Row text | Fills row Text from TextTypeVc |
MainPersons |
Expands user codes | Expands group codes to individual users |
CCPersons |
Expands user codes | Expands CC group codes to individual users |
SerialNr |
Item, dimensions | Loads item/dimension from serial number |
SVOSerNr |
CUCode, Contact, Phone | Loads service order customer info |
ProdOpSerNr |
ArtCode | Sets labour cost item from production settings |
__new |
All defaults | Creates new activity (sets MainPersons from usercode param) |
__copy |
Duplicate record | Copies existing activity (id = SerNr) |
__prepareActivity |
From source record | Creates activity linked to order/invoice (ORVc, IVVc, QTVc, VIVc, CUVc) |
| Field | Triggers | Description |
|---|---|---|
CustCode |
Address, PayDeal, PriceList | Loads customer defaults |
ArtCode |
Price, VATCode, Description | Loads item defaults |
Quant |
Sum, Price recalculation | Recalculates line |
Price |
Sum recalculation | Recalculates line total |
PriceList |
Item prices update | Updates all row prices |
QTDate |
Validity dates | Updates related dates |
__new |
All defaults | Creates new quotation |
__copy |
Duplicate record | Copies existing quotation |
| Field | Triggers | Description |
|---|---|---|
VECode |
VAT codes, Objects | Loads vendor defaults |
PayVal |
VATVal calculation | Recalculates VAT |
AccNumber |
Objects, defaults | Loads account defaults |
VATCode |
VAT calculation | Updates VAT amounts |
Sum |
Totals recalculation | Recalculates totals |
PayDeal |
DueDate | Loads payment terms |
CredInv |
Rate, POSerNr | Loads credit invoice source |
__new |
All defaults | Creates new purchase invoice |
__copy |
Duplicate record | Copies existing invoice |
| Field | Triggers | Description |
|---|---|---|
ShortSign |
Signature | Looks up full name from UserVc by ShortSign code |
OrdType |
Order type defaults | Pastes order type fields |
LTxtCode |
Text fields | Pastes long-text code fields |
FilterType |
Employee list | Reloads employee rows filtered by type (LAT and EST) |
FilterString |
Employee list | Reloads employee rows filtered by string (LAT and EST) |
EmpCodeRow |
Row employee defaults | Pastes employee data into matrix row (LAT and EST) |
__new |
All defaults | Creates new empty order document |
__copy |
Duplicate record | Copies existing order document (id = SerNr) |
| Field | Triggers | Description |
|---|---|---|
VISerNr |
Invoice row fill | Pastes vendor invoice into payment row |
InstNr |
Installment fill | Pastes installment into payment row |
BankCurncy |
Currency defaults | Loads bank currency defaults |
PayMode |
Payment method | Loads payment mode defaults (header or row) |
TransDate |
Date-dependent values | Updates exchange rates and periods |
PayDate |
Date-dependent values | Alias for TransDate trigger |
PayCurCode |
Payment currency | Updates payment currency rates |
CurPayVal |
Currency calculation | Recalculates currency amounts |
Coef |
BankVal recalculation | Recalculates bank value from coefficient |
VECode |
Vendor defaults + RecVal + sumup | Loads vendor defaults into row, updates receive value and recalculates totals |
PrepayNr |
Prepayment fill + RecVal + sumup | Links payment row to prepayment, updates receive value and recalculates totals |
RecCurncy |
Receive currency | Updates receive currency |
RecVal |
Receive value | Updates receive amount |
BankVal |
Bank value | Updates bank value |
B1BankVal |
Base currency 1 value | Syncs bank value if base currency matches |
BankFeeVal |
Fee calculation | Updates bank fee amounts |
VATCode |
VAT calculation | Recalculates VAT |
ChequeNr |
Cheque lookup | Loads cheque details |
OrderNr |
Order reference | Links payment to order |
FrRateBankVal |
Exchange rate | Recalculates from/to rates |
ToRateB1BankVal |
Exchange rate | Recalculates bank value from rate |
__new |
All defaults | Creates new empty outgoing payment |
__copy |
Duplicate record | Copies existing payment (id = SerNr) |
| Field | Triggers | Description |
|---|---|---|
InstNr |
Installment fill + sumup | Pastes installment and recalculates totals |
InvoiceNr |
Invoice fill + sumup | Pastes invoice into receipt row |
InvoiceOfficialSerNr |
Invoice lookup | Pastes invoice by official serial number |
BankCurncy |
Currency defaults | Loads bank currency defaults |
TransDate |
Date-dependent values | Updates exchange rates and periods |
PayMode |
Payment method | Loads payment mode defaults |
PayCurCode |
Payment currency | Updates payment currency rates |
CurPayVal |
Currency calculation | Recalculates currency amounts |
Coef |
Rate recalculation | Recalculates amounts using coefficient |
CUPNr |
Purchase order + RecVal + sumup | Links receipt to purchase order row, updates receive value and recalculates totals |
OrderNr |
Sales order | Links receipt to sales order |
CustCode |
Customer defaults | Loads customer info into row |
PayDate |
Due date | Updates payment due date |
RecCurncy |
Receive currency | Updates receive currency + sumup |
RecVal |
Receive value | Updates receive amount + sumup |
ChequeNr |
Cheque lookup | Loads cheque details |
BankVal |
Bank value | Updates bank value |
B1BankVal |
Base currency 1 value | Updates B1 bank value |
VATCode |
VAT calculation | Recalculates VAT |
ToRateB1BankVal |
Exchange rate | Recalculates bank values from rate |
CustName |
Customer lookup | Looks up customer by name |
MachineName |
Drawer code | Sets drawer code from machine name |
TaxTemplateCode |
Tax template | Applies tax template to row |
Status |
(no-op) | Status field, no side effects |
__new |
All defaults | Creates new empty receipt |
__copy |
Duplicate record | Copies existing receipt (id = SerNr) |
{
"success": true,
"res": true,
"messages": [
{"description": "Customer credit limit exceeded"}
],
"record": {
"CustCode": "ACME",
"Addr0": "ACME Corporation",
"PayDeal": "NET30",
"Sum4": "242.00",
"rows": [
{"ArtCode": "ITEM01", "Quant": "2", "Price": "100.00", "Sum": "200.00"}
]
}
}
Response Fields:
success - Always true for successful responseres - Operation resultmessages - Array of warning messages (if any)record - Updated record with computed values| action required | string Value: "windowactions" |
| usercode | string User code for defaults (used with __new) |
Base64-encoded JSON (reversed byte order)
{- "success": true,
- "res": true,
- "messages": [
- {
- "description": "Customer credit limit exceeded"
}
], - "record": {
- "rows": [
- {
- "property1": "string",
- "property2": "string"
}
], - "property1": "string",
- "property2": "string"
}, - "activeFields": {
- "headerFields": true,
- "matrixFields": true,
- "exceptionHeaderList": "string",
- "exceptionMatrixList": "string"
}, - "rules": [
- {
- "rulefield": "string",
- "rulename": "string",
- "rulevalue": "string"
}
]
}Returns information about which fields are currently editable based on record state. Useful for dynamically enabling/disabling form fields in custom UI.
Supported Registers: ORVc, CUVc
{
"vcname": "ORVc",
"id": "12345"
}
Checks if the order has any shipments (deliveries created).
| Condition | headerFields | matrixFields | exceptionHeaderList |
|---|---|---|---|
| No shipments | true | true | (empty) |
| Has shipments | true | false | CustCode |
When an order has been partially or fully shipped, the row fields become read-only to prevent changes that would conflict with the delivery. The customer code is also locked to maintain data integrity.
Returns dynamic rules based on the contact customer class (CCatVc.ClassType). These rules can be used by the UI to show/hide fields or apply validation.
Example: If contact has class with ClassType=COMPANY, returns:
{
"rules": [
{
"rulefield": "Classification",
"rulename": "type",
"rulevalue": "COMPANY"
}
]
}
The UI can use these rules to conditionally display fields relevant to companies vs individuals (e.g., show RegNr1 for companies, hide for private persons).
Response includes:
success - Always true for successful responseres - Operation resultactiveFields - Field editability flagsheaderFields - Whether header fields are editable (default: true)matrixFields - Whether row fields are editable (default: true)exceptionHeaderList - Comma-separated list of locked header fieldsexceptionMatrixList - Comma-separated list of locked row fieldsrules - Array of dynamic rules (CUVc only)Example Response (ORVc with shipments):
{
"success": true,
"res": true,
"activeFields": {
"headerFields": true,
"matrixFields": false,
"exceptionHeaderList": "CustCode",
"exceptionMatrixList": ""
}
}
Example Response (CUVc with company class):
{
"success": true,
"res": true,
"activeFields": {
"headerFields": true,
"matrixFields": true,
"exceptionHeaderList": "",
"exceptionMatrixList": ""
},
"rules": [
{
"rulefield": "Classification",
"rulename": "type",
"rulevalue": "COMPANY"
}
]
}
| action required | string Value: "activeeditfields" |
Base64-encoded JSON with vcname and record id
{- "success": true,
- "res": true,
- "activeFields": {
- "headerFields": true,
- "matrixFields": true,
- "exceptionHeaderList": "string",
- "exceptionMatrixList": "string"
}, - "rules": [
- {
- "rulefield": "string",
- "rulename": "string",
- "rulevalue": "string"
}
]
}Data listing and browsing with pagination and filtering.
Usage: Omit action parameter, use register directly
Supported Registers:
Common Parameters:
page - Page number (1-based)perpage - Records per page (max 100)search - Search textsortkey - Sort fieldorder - ascending/descendingsd, ed - Date rangeRetrieves a paginated list of records. Note: No action parameter - use register directly.
Example Requests:
GET /WebExcellentAPI.hal?register=IVVc&sd=2024-01-01&ed=2024-12-31&perpage=50
GET /WebExcellentAPI.hal?register=ActVc&search=pending&page=2
GET /WebExcellentAPI.hal?register=CUVc&sortkey=Name&order=ascending
Example Response:
<data count="150" page="1" perpage="50" totalpages="3">
<IVVc>
<SerNr>10001</SerNr>
<InvDate>2024-01-15</InvDate>
<CustCode>ACME</CustCode>
<Sum4>1250.00</Sum4>
</IVVc>
<!-- more records... -->
</data>
| register required | string Enum: "INVc" "CUVc" "ActVc" "Kanban" "IVVc" "VIVc" "StockTakeVc" "ORVc" "QTVc" "EPOrderDocVc" "ARVc" "APVc" Register to list |
| page | integer >= 1 |
| perpage | integer [ 1 .. 100 ] |
| search | string |
| sortkey | string |
| order | string Enum: "ascending" "descending" |
| sd | string <date> Start date (YYYY-MM-DD) |
| ed | string <date> End date (YYYY-MM-DD) |
| usercode | string |
| bfilter | string Additional filter fields |
Returns a paginated list of open accounts receivable entries (open customer invoices/claims).
Uses the list query pattern — no action parameter.
Fields returned per record:
InvoiceNr - Invoice numberOfficialSerNr - Official serial numberRefStr - Reference stringRVal - Remaining open value (M4 formatted)ARCurncyCode - Currency codeCustCode - Customer codeCustName - Customer nameDueDate - Due date (YYYY-MM-DD format)Search matches against: InvoiceNr, CustCode, CustName, RefStr, OfficialSerNr, and amount.
Example Request:
GET /WebExcellentAPI.hal?register=ARVc&page=1&perpage=50&search=ACME&sortkey=DueDate
Example Response:
<data page='1' total='12'>
<ARVc>
<InvoiceNr>10001</InvoiceNr>
<CustCode>ACME</CustCode>
<CustName>ACME Corporation</CustName>
<RVal>1250.00</RVal>
<ARCurncyCode>EUR</ARCurncyCode>
<DueDate>2026-03-31</DueDate>
</ARVc>
</data>
| register required | string Value: "ARVc" |
| page | integer >= 1 |
| perpage | integer |
| search | string Search across InvoiceNr, CustCode, CustName, RefStr, OfficialSerNr, amount |
| sortkey | string |
| order | string Enum: "ascending" "descending" |
Returns a paginated list of open accounts payable entries (open supplier invoices/claims).
Uses the list query pattern — no action parameter.
Fields returned per record:
SerNr - Record serial numberInvoiceNr - Invoice numberRefStr - Reference stringRVal - Remaining open value (M4 formatted)CurncyCode - Currency codeVECode - Vendor codeVEName - Vendor nameDueDate - Due date (YYYY-MM-DD format)Search matches against: SerNr, VECode, VEName, RefStr, InvoiceNr, and amount.
Example Request:
GET /WebExcellentAPI.hal?register=APVc&page=1&perpage=50&search=SUPPLIER
Example Response:
<data page='1' total='8'>
<APVc>
<SerNr>5001</SerNr>
<InvoiceNr>SUP-2026-001</InvoiceNr>
<VECode>SUPPLIER</VECode>
<VEName>Supplier Ltd</VEName>
<RVal>3200.00</RVal>
<CurncyCode>EUR</CurncyCode>
<DueDate>2026-04-15</DueDate>
</APVc>
</data>
| register required | string Value: "APVc" |
| page | integer >= 1 |
| perpage | integer |
| search | string Search across SerNr, VECode, VEName, RefStr, InvoiceNr, amount |
| sortkey | string |
| order | string Enum: "ascending" "descending" |
Report generation operations.
Actions: report (POST with JSON body)
Required URL Parameters:
action=reportusercode - User code (required for access group lookup, without it you get "Access denied")JSON Body Fields:
reportwindow - Report window class name (e.g., ResRClass, BalRClass, INRClass)repname - Internal report name (e.g., ResRn, BalRn, InvValRn)lang - Language code (e.g., EST, ENG)spec - Object with report-specific parameters (dates, filters, etc.)Use getreportfilters to discover available reports and their specification fields.
Runs an API report and returns results. Requires a POST request with JSON body.
Important: The usercode query parameter is required. Without it, the server cannot
look up the user's access group and will return "Access denied" even with valid credentials.
The user's access group must have report access enabled (type "Aruanne" in Access Groups).
The system checks both module-level access (e.g., modNL for financial reports) and
report-level access (e.g., ResRClass).
Example Request — Profit & Loss:
POST /WebExcellentAPI.hal?action=report&usercode=JOHN
Content-Type: application/json
{
"reportwindow": "ResRClass",
"repname": "ResRn",
"lang": "EST",
"spec": {
"sStartDate": "2025-01-01",
"sEndDate": "2025-01-31"
}
}
Example Request — Balance Sheet:
POST /WebExcellentAPI.hal?action=report&usercode=JOHN
Content-Type: application/json
{
"reportwindow": "BalRClass",
"repname": "BalRn",
"lang": "EST",
"spec": {
"sStartDate": "2025-01-01",
"sEndDate": "2025-12-31"
}
}
Use getreportfilters to discover all available reports and their specification fields.
| action required | string Value: "report" |
| usercode required | string Example: usercode=JOHN User code for access group lookup. Required — without it, returns "Access denied". |
| reportwindow required | string Report window class name (use |
| repname required | string Internal report name |
| lang | string Language code |
object Report-specific parameters (dates, filters, etc.). Field names vary per report — use |
{- "reportwindow": "ResRClass",
- "repname": "ResRn",
- "lang": "EST",
- "spec": {
- "sStartDate": "2025-01-01",
- "sEndDate": "2025-01-31"
}
}Returns JSON with all available report filter definitions — report window classes, their specification fields, field types, and default values. Useful for dynamically building report specification UIs.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getreportfilters&usercode=JOHN
Example Response:
{
"reports": [
{
"reportwindow": "IVRClass",
"repname": "InvoiceRn",
"fields": [
{ "name": "f1", "type": "string", "label": "Customer" },
{ "name": "sStartDate", "type": "date" },
{ "name": "sEndDate", "type": "date" }
]
}
]
}
| action required | string Value: "action" |
| register required | string Value: "getreportfilters" |
{ }Employee portal specific operations.
Sub-actions (via action=action):
getemployeeinfo - Employee detailsgetvacationbalance - Vacation days balance (access-controlled per EP-1989)getemptimeplan - Work schedulegetemptimeplannewformat - Work schedule (new format)getcontactpersons - Contact persons listgetapprovalpersons - Available approversgetcustomerstatusrecords - Customer's related records (invoices, orders, quotes, tasks)getcustomercontactpersons - Customer's contact persons listgetstartupitems - Module/register/report/document metadata (JSON)getuseraccessrights - Access rights per item for a user (JSON)Returns detailed employee profile including vacation balances and department info.
Access is restricted: the requesting user (identified by curemp) can only retrieve
data for themselves, for employees in departments they manage, or if they are an admin.
This access check applies to both Estonian and Latvian payroll systems.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getemployeeinfo&empcode=EMP001&curemp=MGR01
Response XML structure:
<data>
<res regname='ProfileInfoVc'></res>
<ProfileInfoVc>
<Department>DEP01</Department>
<ManagerInDeps>DEP01,DEP02</ManagerInDeps>
<TotalEarnVacDays>28.0</TotalEarnVacDays>
<ExtaEarnVacDays>0.0</ExtaEarnVacDays>
<TotalUsedVacDays>5.0</TotalUsedVacDays>
<VacDaysLeft>23.0</VacDaysLeft>
<NextVacation>2026-07-01:2026-07-14</NextVacation>
<NextPlanVacation>2026-08-01:2026-08-10</NextPlanVacation>
</ProfileInfoVc>
</data>
Response fields (ProfileInfoVc):
Department — Employee's current department code (from active contract)ManagerInDeps — Comma-separated list of department codes this employee managesTotalEarnVacDays — Total earned vacation days for the yearExtaEarnVacDays — Extra (additional) earned vacation daysTotalUsedVacDays — Vacation days already takenExtraUsedVacDays — Extra vacation days taken (EST only, omitted if zero)VacDaysLeft — Remaining vacation daysNextVacation — Next approved absence: YYYY-MM-DD:YYYY-MM-DDNextPlanVacation — Next planned absence: YYYY-MM-DD:YYYY-MM-DD| action required | string Value: "action" |
| register required | string Value: "getemployeeinfo" |
| empcode required | string Employee code to retrieve information for |
| curemp required | string Employee code of the currently logged-in user (used for access control — manager must manage the requested employee's department) |
| portalcc | string Enum: "est" "lat" Payroll locale ( |
Returns employee's vacation days balance.
Access control (EP-1989): Admins (EXCPortalAdmin) can query any employee. Non-admin users
can only query their own vacation balance or employees in departments they manage.
When access is denied, returns: <data><res errstr="You do not have access to view this data" newdata=''></res></data>
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getvacationbalance&empcode=EMP001&usercode=JOHN
| action required | string Value: "action" |
| register required | string Value: "getvacationbalance" |
| empcode required | string |
| usercode required | string Requesting user's code. Required for access control check — determines whether the user is allowed to view the specified employee's data. |
| portalcc | string Enum: "est" "lat" Country/localization code for payroll system selection |
Returns JSON metadata about all available modules, registers, reports, documents, exports, imports, and maintenance items configured in HALStartup.json. Used by the portal on startup to know which sections and registers are available.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getstartupitems
Response: JSON object with arrays: modules, registers, reports, documents, exports, imports, maintenances
Each item contains: title, code or window_class, and module.
| action required | string Value: "action" |
| register required | string Value: "getstartupitems" |
Returns a JSON array of access rights for each configured item (modules, registers, reports, documents, exports, imports, maintenances) for the specified user. Access levels are computed against the user's access group and module-level permissions.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getuseraccessrights&usercode=JOHN
Response: JSON array of objects. Each object has:
type - Item type: module, register, report, document, export, import, maintenance, settingname - Display namecode or window_class - Identifieraccess - Access level: none, read, or fullmodule - Parent module code (for non-module items)Example Response:
[
{"type": "module", "name": "Sales", "code": "Sales", "access": "full"},
{"type": "register", "name": "Invoices", "window_class": "IVVc", "access": "full", "module": "Sales"},
{"type": "report", "name": "AR Report", "window_class": "ARRClass", "access": "read", "module": "Sales"}
]
| action required | string Value: "action" |
| register required | string Value: "getuseraccessrights" |
| usercode | string User code to get access rights for. Defaults to currently authenticated user if omitted. |
Document conversion operations for sales workflows (quotation → order → invoice).
Sub-actions (via action=action):
createslinvoicefromorder - Create sales invoice from sales ordercreatesalesorderfromquotation - Create sales order from quotationcreateslinvoicefromquotation - Create sales invoice directly from quotationcopyrecord - Duplicate an existing recordunokrecord - Remove OK status (return to draft)Creates a sales invoice from an existing sales order.
?action=action®ister=createslinvoicefromorder&id={ORVc_SerNr}&usercode=JOHN
Response: <data><res errstr="" newdata="10001"/></data>
The newdata attribute contains the new invoice SerNr.
Creates a sales order from an existing quotation.
?action=action®ister=createsalesorderfromquotation&id={QTVc_SerNr}®name=QTVc&usercode=JOHN
Creates a sales invoice directly from a quotation (skipping order stage).
?action=action®ister=createslinvoicefromquotation&id={QTVc_SerNr}®name=QTVc&usercode=JOHN
Duplicates an existing record. Currently supports IVVc (invoices). New record gets current date and OKFlag=0 (draft).
?action=action®ister=copyrecord®name=IVVc&id=12345
Reverses record confirmation (sets OKFlag from 1 to 0). Requires appropriate access permissions (EXCPortalUnOK action). Supported registers: IVVc, ORVc, PlanAbsenceVc
?action=action®ister=unokrecord®name=IVVc&id=12345&usercode=JOHN
Creates a sales invoice from an existing sales order.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=createslinvoicefromorder&id=5001&usercode=JOHN
Example Response:
<data>
<res errstr="" newdata="10001"/>
</data>
The newdata attribute contains the SerNr of the newly created invoice.
| action required | string Value: "action" |
| register required | string Value: "createslinvoicefromorder" |
| id required | string Sales order SerNr (from ORVc) |
| usercode required | string |
Creates a sales order from an existing quotation.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=createsalesorderfromquotation&id=3001®name=QTVc&usercode=JOHN
Example Response:
<data>
<res errstr="" newdata="5001"/>
</data>
| action required | string Value: "action" |
| register required | string Value: "createsalesorderfromquotation" |
| id required | string Quotation SerNr (from QTVc) |
| regname required | string Value: "QTVc" |
| usercode required | string |
Creates a sales invoice directly from a quotation (skipping the sales order stage).
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=createslinvoicefromquotation&id=3001®name=QTVc&usercode=JOHN
| action required | string Value: "action" |
| register required | string Value: "createslinvoicefromquotation" |
| id required | string Quotation SerNr (from QTVc) |
| regname required | string Value: "QTVc" |
| usercode required | string |
Creates a copy of an existing record.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=copyrecord®name=IVVc&id=10001
Behavior:
| action required | string Value: "action" |
| register required | string Value: "copyrecord" |
| regname required | string Value: "IVVc" Currently only IVVc supported |
| id required | string |
Reverses record confirmation, returning it to draft state (OKFlag=0).
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=unokrecord®name=IVVc&id=10001&usercode=JOHN
Requirements:
| action required | string Value: "action" |
| register required | string Value: "unokrecord" |
| regname required | string Enum: "IVVc" "ORVc" "PlanAbsenceVc" |
| id required | string |
| usercode required | string |
| portalcc | string Enum: "est" "lat" Country code for country-specific rules |
Utility and meta operations.
Sub-actions (via action=action):
hasusernewapi - Check if user has new API accessgetportalusers - List portal usersgetadminusers - List admin usersgetallusers - List all usersgetnotifications - User notificationsgetdashboardkpi - Dashboard KPIslinktosourcerecord - Create activity link to source record (sourceRegName, sourceRecordId params)getrecordlinks - Get records linked to a recordgetbilinks - Get Business Intelligence portal linksgetactivitytypes - List available activity types with signing infogetreportfilters - Get available report filter definitions (JSON)registerapi - Register callback URL for webhooksbuildrecidstr - Build standardized record ID stringChecks if the current user has access to new API features.
?action=action®ister=hasusernewapi&usercode=JOHN
Response: <data><res errstr="" hasapi="1"/></data>
Returns list of records linked to the specified record.
?action=action®ister=getrecordlinks®name=IVVc&id=12345
Returns Business Intelligence portal links for FlexBI integration.
?action=action®ister=getbilinks&usercode=JOHN&id={accessId}
Response includes salesanalysis and customeranalysis URLs.
Links only returned if user has EXCPortalShowInvoices permission.
Lists all configured activity types (ActTypVc).
?action=action®ister=getactivitytypes
Registers an external callback URL for webhook notifications.
?action=action®ister=registerapi&UUID={uuid}&url={url}&port={port}&path={path}
Builds a standardized record ID string for cross-system references.
?action=action®ister=buildrecidstr&code={code}&vcname={vcname}&compno={compno}
Some operations have row limits to prevent performance issues:
| Operation | Default Limit | Extended Limit |
|---|---|---|
| Cash flow data | 2,000 rows | 30,000 rows (with limitf=false) |
| List queries | 100 per page | Use pagination |
| Kanban columns | maxsize parameter | Configurable |
Some operations have country-specific implementations. Use the portalcc parameter:
portalcc=est - Estonia-specific (ESTPayroll module)portalcc=lat - Latvia-specific (LATPayroll module)Estonia-specific actions:
Latvia-specific actions:
Example:
?action=action®ister=getvacationbalance&empcode=EMP001&portalcc=est
Returns pending notifications for a user.
Example Request:
GET /WebExcellentAPI.hal?action=action®ister=getnotifications&usercode=JOHN
| action required | string Value: "action" |
| register required | string Value: "getnotifications" |
| usercode required | string |
WebExcellentAPI can be extended with custom actions, registers, and field triggers using HAL extension functions.
These extension points allow partners to add new functionality without modifying the core API code.
Each extension function is a global procedure defined in a HAL file and automatically called by the API when relevant.
| Extension Function | Purpose | Called When |
|---|---|---|
OuterExcellentAPIActions |
Add custom sub-actions | action=action®ister={YourAction} |
OuterExcellentAPIDeleteRecord |
Add custom registers to delete | action=delete®ister={YourRegister} |
OuterExcellentAPIDeleteRow |
Add custom registers to deleterow | action=deleterow |
OuterExcellentAPIInsertRow |
Add custom registers to insertrow | action=insertrow |
OuterExcellentAPIPostText |
Add custom registers to posttext | action=posttext |
OuterExcellentAPIPrint |
Add custom document types | action=document |
OuterExcellentAPIPasteSpecial |
Add custom registers to search | action=pastespecial |
OuterExcellentAPIGetList |
Add custom list types | List queries (no action) |
OuterExcellentAPIWindowActions |
Add custom field triggers | action=windowactions |
Country-specific variants are also supported by appending _EST or _LAT suffix (e.g., OuterExcellentAPIDeleteRecord_EST).
This is the most commonly used extension point. It allows you to add completely new sub-actions to the action=action endpoint.
HAL Signature (6 parameters):
global
procedure OuterExcellentAPIActions(
string type, // Value of register= parameter (the sub-action name)
string empcode, // Employee code from query string
string usercode, // User code from query string
string id, // ID from query string
string err, // Error string
var Boolean outputf // Set to false when you handle the response
)
URL pattern:
POST /WebExcellentAPI.hal?action=action®ister=MyCustomAction&id=12345&usercode=JOHN
Example implementation:
global
procedure OuterExcellentAPIActions(string type, string empcode, string usercode,
string id, string err, var Boolean outputf)
begin
switch (type) begin
case "MyCustomAction":
HandleMyCustomAction(id, usercode);
outputf = false; // false = we handled the output
end;
return;
end;
When outputf is set to false, the extension function is responsible for writing the HTTP response
(e.g., using WebOutString, WebSetContentType, SetHTTPResponseStatus).
Add new registers to the pastespecial action for lookup/search functionality.
URL pattern:
GET /WebExcellentAPI.hal?action=pastespecial®ister=MyRegister&id=searchtext
Add new list types for the list query endpoint (no action parameter).
URL pattern:
GET /WebExcellentAPI.hal?register=MyListType&page=1&perpage=50&search=text
Add custom field trigger logic for registers in the windowactions endpoint.
global procedure (not function)remote updating procedure3-file pattern for database-modifying extensions: