WebExcellentAPI - Portal API (1.0.2)

Download OpenAPI specification:

Action-based Web API for Excellent Books ERP Portal operations.

How This API Works

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}

Base URL Example

https://your-server:port/WebExcellentAPI.hal

Authentication

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&register=INVc&id=laptop" \
  -H "Cookie: HSESSION=CC1AC3C5-DAC9C590-DA4FD41F-1E820CB7-C1713CC8"

See REST API documentation for full session configuration details.

Response Format

  • All responses are XML format
  • Success responses wrapped in <data> or <res> elements
  • Errors returned as <error> element or errstr attribute

Quick Reference - Example URLs

Authentication

?action=login
?action=deactivate&usercode=API

Record Operations

?action=delete&register=IVVc&id=12345
?action=deleterow&register=IVVc&id=12345:2,3        (id format: {SerNr}:{rows})
?action=insertrow&register=IVVc&id=12345:1:1       (id format: {SerNr}:{afterRow}:{rowType})
?action=posttext&register=MailVc&id=12345  (POST with body)

Document Generation

?action=document&register=IVVc&id=12345&doccode=INV
?action=document&register=ORVc&id=54321&doccode=ORD&language=est

Attachments (action=action with sub-action in register)

?action=action&register=doupload&regname=IVVc&id=12345  (POST with file)
?action=action&register=getattachlist&regname=IVVc&id=12345
?action=action&register=getfile&regname=IVVc&id=12345&file={uuid}
?action=action&register=deleteattachment&regname=IVVc&id=12345&file={uuid}

Approvals

?action=action&register=checkapprovalstatus&regname=ActVc&id=12345
?action=action&register=sendforapproval&regname=IVVc&id=12345
?action=action&register=approveactivity&id=12345&usercode=JOHN
?action=action&register=rejectactivity&id=12345&usercode=JOHN
?action=action&register=cancelapproval&regname=IVVc&id=12345

Digital Signing (Dokobit)

?action=action&register=createsigningactivity&regname=ORVc&id=12345
?action=action&register=createsigningsess&id=12345
?action=action&register=startsigning&id=12345
?action=action&register=cancelsigning&id=12345&regname=ActVc

Activities & Tasks

?action=action&register=getactivitydata&id=12345
?action=action&register=getcomments&id=12345
?action=action&register=addcomment&id=12345  (POST with comment)
?action=action&register=settaskdescription&id=12345  (POST with text)
?action=pastespecial&register=INVc&id=laptop
?action=pastespecial&register=CUVc&id=acme&compno=2
?action=pastespecial&register=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).

Field Triggers (windowactions)

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)

List Queries (no action parameter)

?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

Reports

POST /WebExcellentAPI.hal?action=report
Content-Type: application/json

{"reportwindow": "INEClass", "lang": "EST", "spec": {"d1": "31.12.2025"}, "repname": "InvValRn"}

Employee Portal

?action=action&register=getemployeeinfo&empcode=EMP001
?action=action&register=getvacationbalance&empcode=EMP001
?action=action&register=getemptimeplan&empcode=EMP001&sd=2024-01-01&ed=2024-01-31

Utilities

?action=action&register=getportalusers
?action=action&register=getallusers
?action=action&register=getnotifications&usercode=JOHN
?action=action&register=getdashboardkpi
?action=action&register=copyrecord&regname=IVVc&id=12345
?action=action&register=unokrecord&regname=IVVc&id=12345&usercode=JOHN
?action=action&register=getbilinks&usercode=JOHN
?action=action&register=getactivitytypes

Global Parameters

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&register=INVc&id=laptop&compno=2
?action=action&register=getattachlist&regname=IVVc&id=12345&compno=3

Authentication

Login and session management operations.

Actions: login, deactivate

Login and get system info

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>
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "login"

Responses

Records

Record manipulation operations including delete, row operations, and text posting.

Actions: delete, deleterow, insertrow, posttext

Supported Registers:

  • Delete: IVVc, VIVc, ORVc, QTVc, ActVc, CUVc, EPOrderDocVc
  • Row delete (deleterow): IVVc, ORVc, VIVc, ActVc, EXCExternalSignersVc, EXCSignSessVc, EPOrderDocVc

Delete a record

Deletes a record from the specified register.

Example Request:

GET /WebExcellentAPI.hal?action=delete&register=IVVc&id=12345

Example Response (Success):

<data><res errstr=""/></data>

Example Response (Error):

<data><res errstr="Record is locked"/></data>
Authorizations:
basicAuthsessionCookie
query Parameters
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)

Responses

Delete rows from record

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&register=IVVc&id=12345:2,3,5
  • 12345 = Record SerNr
  • 2,3,5 = Row numbers to delete (1-based, comma-separated)

Multiple rows can be deleted in a single request.

Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Insert new row into record

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&register=IVVc&id=12345:1:1
  • 12345 = Record SerNr
  • 1 = 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 row
  • 2 = Text/comment row
  • 3 = Credit row
Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Post text content to record

Posts text/HTML content to a record's text field (e.g., email body, document text).

Example Request:

POST /WebExcellentAPI.hal?action=posttext&register=MailVc&id=12345
Content-Type: application/x-www-form-urlencoded

set_field.Math=<p>Email body content here</p>
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "posttext"
register
required
string
Enum: "MailVc" "EPOrderDocVc"
id
required
string
Request Body schema: application/x-www-form-urlencoded
required
set_field.Math
string

Text/HTML content

Responses

Documents

Document generation and PDF printing.

Actions: document

Supported Registers: IVVc, VIVc, ORVc, QTVc, EPOrderDocVc

Generate document PDF

Generates a PDF document for printing or download.

Example Request:

GET /WebExcellentAPI.hal?action=document&register=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.

Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Attachments

File upload, download, listing, and deletion.

Sub-actions (via action=action):

  • doupload - Upload file attachment (POST)
  • getattachlist - List attachments for record
  • getfile - Download attachment by UUID
  • deleteattachment - Remove attachment
  • getrecordlinks - Get linked records
  • sendemail - Email document with PDF attachment

Supported 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>

doupload - Complete Example

Endpoint:

POST /WebExcellentAPI.hal?action=action&register=doupload&regname=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 calls
  • register=doupload - The sub-action to execute
  • regname=IVVc - Target register (IVVc, VIVc, ORVc, CUVc, etc.)
  • id=2525040 - SerNr of the record to attach file to

curl Example:

curl -X POST "https://server:port/WebExcellentAPI.hal?action=action&register=doupload&regname=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.

sendemail

Sends email with document PDF attachment to the customer/contact. Prerequisites:

  • Email address must be configured on the customer record
  • SMTP settings must be configured in Excellent Books
  • Document template must be available
?action=action&register=sendemail&regname=IVVc&id=10001&usercode=JOHN

Supported registers for sendemail: IVVc, ORVc, QTVc

Upload file attachment

Uploads a file attachment to a record.

Example Request:

POST /WebExcellentAPI.hal?action=action&register=doupload&regname=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>
Authorizations:
basicAuthsessionCookie
query Parameters
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
Request Body schema: application/xml
required
filename
string
base64
string

Base64-encoded file content

Responses

List attachments for record

Returns list of all attachments for a record.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=getattachlist&regname=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>
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "getattachlist"
regname
required
string
id
required
string

Responses

Download attachment

Downloads an attachment file by UUID.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=getfile&regname=IVVc&id=12345&file=a1b2c3d4-e5f6-7890-abcd-ef1234567890
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "getfile"
regname
required
string
id
required
string
file
required
string <uuid>

File UUID

Responses

Approvals

Approval workflow operations for documents and activities.

Sub-actions (via action=action):

  • checkapprovalstatus - Get current approval state
  • sendforapproval - Submit for approval
  • approveactivity - Approve record
  • rejectactivity - Reject record
  • cancelapproval - Cancel pending approval
  • signactivity - Sign approved record

Approval Status Codes:

  • 0: Not requested
  • 1: Not required
  • 2: Not started
  • 3: Pending
  • 4: Approved
  • 5: Rejected

Check approval status

Returns the current approval status of a record.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=checkapprovalstatus&regname=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:

  • 0: Not requested
  • 1: Not required
  • 2: Not started
  • 3: Pending
  • 4: Approved
  • 5: Rejected
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "checkapprovalstatus"
regname
required
string
Enum: "ActVc" "IVVc" "VIVc" "ORVc" "QTVc" "EPOrderDocVc" "OPVc"
id
required
string

Responses

Submit record for approval

Submits a record to the approval workflow.

Supported registers: IVVc, VIVc, ORVc, QTVc, ActVc, EPOrderDocVc, OPVc

Example Request:

GET /WebExcellentAPI.hal?action=action&register=sendforapproval&regname=IVVc&id=12345
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "sendforapproval"
regname
required
string
Enum: "IVVc" "VIVc" "ORVc" "QTVc" "ActVc" "EPOrderDocVc" "OPVc"
id
required
string

Responses

Approve a record

Approves a record pending approval.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=approveactivity&id=12345&usercode=MANAGER
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "approveactivity"
id
required
string
usercode
required
string

Approver's user code

Responses

Reject a record

Rejects a record pending approval.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=rejectactivity&id=12345&usercode=MANAGER
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "rejectactivity"
id
required
string
usercode
required
string

Responses

Signing

Digital signing operations using Dokobit integration.

Sub-actions (via action=action):

  • createsigningactivity - Create signing activity for document
  • createsigningsess - Create signing session
  • startsigning - Initiate signing process
  • cancelsigning - Cancel signing session

Supported for: ORVc, IVVc, EPOrderDocVc, EPContractVc

Create signing activity

Creates a digital signing activity for a document (Dokobit integration).

Example Request:

GET /WebExcellentAPI.hal?action=action&register=createsigningactivity&regname=ORVc&id=12345
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "createsigningactivity"
regname
required
string
Enum: "ORVc" "IVVc" "EPOrderDocVc" "EPContractVc" "EPTS2Vc"
id
required
string

Responses

Start signing process

Initiates the digital signing process for a signer.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=startsigning&id=12345

Returns a URL to redirect the user to the Dokobit signing interface.

Authorizations:
basicAuthsessionCookie
query Parameters
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)

Responses

Activities

Activity and task management operations.

Sub-actions (via action=action):

  • getactivitydata - Get activity details
  • getcomments - Get activity comments
  • addcomment - Add comment to activity
  • settaskdescription - Update task description
  • getactivitytypes - List available activity types

Lookups

Paste special, search, and field trigger operations.

Actions: pastespecial, windowactions, activeeditfields

pastespecial

Search for records to populate lookup fields.

Supported Registers: INVc, CUVc, VEVc, AllCUVc, UserVc

windowactions - Field Trigger API

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:

  1. Client sends current record state + field being changed
  2. Server executes all business logic for that field change
  3. Server returns updated record with all computed/derived fields

Use Cases:

  • Customer changed -> load payment terms, addresses, language
  • Item code entered -> load price, VAT code, description
  • Quantity changed -> recalculate line totals and sums
  • Currency changed -> update exchange rates

Special Fields:

  • __new - Initialize a new empty record with defaults
  • __copy - Duplicate an existing record

activeeditfields

Returns which fields are currently editable based on record state.

Supported Registers: ORVc, CUVc

Use Cases:

  • ORVc: Check if order rows are locked (has shipments)
  • CUVc: Get classification rules for conditional field display

Search records (paste special)

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:

  • Space-separated terms are ANDed (all must match)
  • Case-insensitive prefix matching
  • Example: id=laptop dell matches items containing BOTH "laptop" AND "dell"

Example Request:

GET /WebExcellentAPI.hal?action=pastespecial&register=INVc&id=laptop
GET /WebExcellentAPI.hal?action=pastespecial&register=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>
Authorizations:
basicAuthsessionCookie
query Parameters
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:

  • INVc: Code, Name
  • CUVc/VEVc/AllCUVc: Code, Name, RegNr1
  • UserVc: Code, Name
compno
integer

Company number (for multi-company databases)

bfilter
string

Additional filter (only for INVc)

Responses

Execute field change logic (Field Triggers)

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


Request Body Structure (JSON before encoding)

{
  "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):

  • 1 = String
  • 2 = Date (YYYY-MM-DD)
  • 5 = Decimal value
  • 12 = Decimal value
  • 15 = Decimal value (1 decimal place)

Trigger Fields by Register

INVc (Item)

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)

IVVc (Sales Invoice)

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

ORVc (Sales Order)

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

CUVc (Contact)

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

ActVc (Activity)

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)

QTVc (Quotation)

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

VIVc (Purchase Invoice)

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

EPOrderDocVc (HR Order Document)

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)

OPVc (Outgoing Payment)

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)

IPVc (Cash Receipt / Incoming Payment)

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)

Response Format

{
  "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 response
  • res - Operation result
  • messages - Array of warning messages (if any)
  • record - Updated record with computed values
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "windowactions"
usercode
string

User code for defaults (used with __new)

Request Body schema: application/octet-stream
required

Base64-encoded JSON (reversed byte order)

string <byte>

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "res": true,
  • "messages": [
    ],
  • "record": {
    },
  • "activeFields": {
    },
  • "rules": [
    ]
}

Get active/editable fields

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


Request Body Structure (JSON before encoding)

{
  "vcname": "ORVc",
  "id": "12345"
}

Per-Register Behavior

ORVc (Sales Order)

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.

CUVc (Contact)

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 Structure

Response includes:

  • success - Always true for successful response
  • res - Operation result
  • activeFields - Field editability flags
    • headerFields - Whether header fields are editable (default: true)
    • matrixFields - Whether row fields are editable (default: true)
    • exceptionHeaderList - Comma-separated list of locked header fields
    • exceptionMatrixList - Comma-separated list of locked row fields
  • rules - 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"
    }
  ]
}
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "activeeditfields"
Request Body schema: application/octet-stream
required

Base64-encoded JSON with vcname and record id

string <byte>

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "res": true,
  • "activeFields": {
    },
  • "rules": [
    ]
}

Lists

Data listing and browsing with pagination and filtering.

Usage: Omit action parameter, use register directly

Supported Registers:

  • INVc (Items)
  • CUVc (Contacts)
  • ActVc (Activities)
  • Kanban (Kanban board)
  • IVVc (Invoices)
  • VIVc (Purchase Invoices)
  • ORVc (Sales Orders)
  • QTVc (Quotations)
  • StockTakeVc (Stock Takes)
  • ARVc (Accounts Receivable - open invoices)
  • APVc (Accounts Payable - open purchase invoices)

Common Parameters:

  • page - Page number (1-based)
  • perpage - Records per page (max 100)
  • search - Search text
  • sortkey - Sort field
  • order - ascending/descending
  • sd, ed - Date range

List records with pagination

Retrieves 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>
Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

List open accounts receivable (ARVc)

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 number
  • OfficialSerNr - Official serial number
  • RefStr - Reference string
  • RVal - Remaining open value (M4 formatted)
  • ARCurncyCode - Currency code
  • CustCode - Customer code
  • CustName - Customer name
  • DueDate - 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>
Authorizations:
basicAuthsessionCookie
query Parameters
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"

Responses

List open accounts payable (APVc)

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 number
  • InvoiceNr - Invoice number
  • RefStr - Reference string
  • RVal - Remaining open value (M4 formatted)
  • CurncyCode - Currency code
  • VECode - Vendor code
  • VEName - Vendor name
  • DueDate - 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>
Authorizations:
basicAuthsessionCookie
query Parameters
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"

Responses

Reports

Report generation operations.

Actions: report (POST with JSON body)

Required URL Parameters:

  • action=report
  • usercode - 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.

Generate report

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.

Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "report"
usercode
required
string
Example: usercode=JOHN

User code for access group lookup. Required — without it, returns "Access denied".

Request Body schema: application/json
required
reportwindow
required
string

Report window class name (use getreportfilters to discover available values)

repname
required
string

Internal report name

lang
string

Language code

object

Report-specific parameters (dates, filters, etc.). Field names vary per report — use getreportfilters to discover them.

Responses

Request samples

Content type
application/json
{
  • "reportwindow": "ResRClass",
  • "repname": "ResRn",
  • "lang": "EST",
  • "spec": {
    }
}

Get report filter definitions

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&register=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" }
      ]
    }
  ]
}
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "getreportfilters"

Responses

Response samples

Content type
application/json
{ }

Portal

Employee portal specific operations.

Sub-actions (via action=action):

  • getemployeeinfo - Employee details
  • getvacationbalance - Vacation days balance (access-controlled per EP-1989)
  • getemptimeplan - Work schedule
  • getemptimeplannewformat - Work schedule (new format)
  • getcontactpersons - Contact persons list
  • getapprovalpersons - Available approvers
  • getcustomerstatusrecords - Customer's related records (invoices, orders, quotes, tasks)
  • getcustomercontactpersons - Customer's contact persons list
  • getstartupitems - Module/register/report/document metadata (JSON)
  • getuseraccessrights - Access rights per item for a user (JSON)

Get employee information

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&register=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 manages
  • TotalEarnVacDays — Total earned vacation days for the year
  • ExtaEarnVacDays — Extra (additional) earned vacation days
  • TotalUsedVacDays — Vacation days already taken
  • ExtraUsedVacDays — Extra vacation days taken (EST only, omitted if zero)
  • VacDaysLeft — Remaining vacation days
  • NextVacation — Next approved absence: YYYY-MM-DD:YYYY-MM-DD
  • NextPlanVacation — Next planned absence: YYYY-MM-DD:YYYY-MM-DD
Authorizations:
basicAuthsessionCookie
query Parameters
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 (est for Estonian, lat for Latvian)

Responses

Get vacation balance

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&register=getvacationbalance&empcode=EMP001&usercode=JOHN
Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Get startup items (modules, registers, reports)

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&register=getstartupitems

Response: JSON object with arrays: modules, registers, reports, documents, exports, imports, maintenances

Each item contains: title, code or window_class, and module.

Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "getstartupitems"

Responses

Get user access rights

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&register=getuseraccessrights&usercode=JOHN

Response: JSON array of objects. Each object has:

  • type - Item type: module, register, report, document, export, import, maintenance, setting
  • name - Display name
  • code or window_class - Identifier
  • access - Access level: none, read, or full
  • module - 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"}
]
Authorizations:
basicAuthsessionCookie
query Parameters
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.

Responses

Record Creation

Document conversion operations for sales workflows (quotation → order → invoice).

Sub-actions (via action=action):

  • createslinvoicefromorder - Create sales invoice from sales order
  • createsalesorderfromquotation - Create sales order from quotation
  • createslinvoicefromquotation - Create sales invoice directly from quotation
  • copyrecord - Duplicate an existing record
  • unokrecord - Remove OK status (return to draft)

createslinvoicefromorder

Creates a sales invoice from an existing sales order.

?action=action&register=createslinvoicefromorder&id={ORVc_SerNr}&usercode=JOHN

Response: <data><res errstr="" newdata="10001"/></data> The newdata attribute contains the new invoice SerNr.

createsalesorderfromquotation

Creates a sales order from an existing quotation.

?action=action&register=createsalesorderfromquotation&id={QTVc_SerNr}&regname=QTVc&usercode=JOHN

createslinvoicefromquotation

Creates a sales invoice directly from a quotation (skipping order stage).

?action=action&register=createslinvoicefromquotation&id={QTVc_SerNr}&regname=QTVc&usercode=JOHN

copyrecord

Duplicates an existing record. Currently supports IVVc (invoices). New record gets current date and OKFlag=0 (draft).

?action=action&register=copyrecord&regname=IVVc&id=12345

unokrecord

Reverses record confirmation (sets OKFlag from 1 to 0). Requires appropriate access permissions (EXCPortalUnOK action). Supported registers: IVVc, ORVc, PlanAbsenceVc

?action=action&register=unokrecord&regname=IVVc&id=12345&usercode=JOHN

Create invoice from sales order

Creates a sales invoice from an existing sales order.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=createslinvoicefromorder&id=5001&usercode=JOHN

Example Response:

<data>
  <res errstr="" newdata="10001"/>
</data>

The newdata attribute contains the SerNr of the newly created invoice.

Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "createslinvoicefromorder"
id
required
string

Sales order SerNr (from ORVc)

usercode
required
string

Responses

Create sales order from quotation

Creates a sales order from an existing quotation.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=createsalesorderfromquotation&id=3001&regname=QTVc&usercode=JOHN

Example Response:

<data>
  <res errstr="" newdata="5001"/>
</data>
Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Create invoice from quotation

Creates a sales invoice directly from a quotation (skipping the sales order stage).

Example Request:

GET /WebExcellentAPI.hal?action=action&register=createslinvoicefromquotation&id=3001&regname=QTVc&usercode=JOHN
Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Duplicate a record

Creates a copy of an existing record.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=copyrecord&regname=IVVc&id=10001

Behavior:

  • Creates new record with data from source
  • Sets date to current date
  • Sets OKFlag=0 (draft)
  • Generates new SerNr
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "copyrecord"
regname
required
string
Value: "IVVc"

Currently only IVVc supported

id
required
string

Responses

Remove OK status from record

Reverses record confirmation, returning it to draft state (OKFlag=0).

Example Request:

GET /WebExcellentAPI.hal?action=action&register=unokrecord&regname=IVVc&id=10001&usercode=JOHN

Requirements:

  • User must have EXCPortalUnOK permission
  • Record must be in confirmed state (OKFlag=1)
Authorizations:
basicAuthsessionCookie
query Parameters
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

Responses

Utilities

Utility and meta operations.

Sub-actions (via action=action):

  • hasusernewapi - Check if user has new API access
  • getportalusers - List portal users
  • getadminusers - List admin users
  • getallusers - List all users
  • getnotifications - User notifications
  • getdashboardkpi - Dashboard KPIs
  • linktosourcerecord - Create activity link to source record (sourceRegName, sourceRecordId params)
  • getrecordlinks - Get records linked to a record
  • getbilinks - Get Business Intelligence portal links
  • getactivitytypes - List available activity types with signing info
  • getreportfilters - Get available report filter definitions (JSON)
  • registerapi - Register callback URL for webhooks
  • buildrecidstr - Build standardized record ID string

hasusernewapi

Checks if the current user has access to new API features.

?action=action&register=hasusernewapi&usercode=JOHN

Response: <data><res errstr="" hasapi="1"/></data>

getactivitytypes

Lists all configured activity types (ActTypVc).

?action=action&register=getactivitytypes

registerapi

Registers an external callback URL for webhook notifications.

?action=action&register=registerapi&UUID={uuid}&url={url}&port={port}&path={path}

buildrecidstr

Builds a standardized record ID string for cross-system references.

?action=action&register=buildrecidstr&code={code}&vcname={vcname}&compno={compno}

Data Limits

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

Country-Specific Features (portalcc parameter)

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:

  • Employee time plans with Estonian calendar
  • Estonian payroll vacation balance
  • Estonian tax calculations
  • Estonian e-invoice formats

Latvia-specific actions:

  • Latvian payroll calculations
  • Latvian tax rules
  • Latvian approval workflows

Example:

?action=action&register=getvacationbalance&empcode=EMP001&portalcc=est

Get user notifications

Returns pending notifications for a user.

Example Request:

GET /WebExcellentAPI.hal?action=action&register=getnotifications&usercode=JOHN
Authorizations:
basicAuthsessionCookie
query Parameters
action
required
string
Value: "action"
register
required
string
Value: "getnotifications"
usercode
required
string

Responses

Extensibility

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 Functions Reference

Extension Function Purpose Called When
OuterExcellentAPIActions Add custom sub-actions action=action&register={YourAction}
OuterExcellentAPIDeleteRecord Add custom registers to delete action=delete&register={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).


OuterExcellentAPIActions - Custom Sub-Actions

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&register=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).


OuterExcellentAPIPasteSpecial - Custom Search Registers

Add new registers to the pastespecial action for lookup/search functionality.

URL pattern:

GET /WebExcellentAPI.hal?action=pastespecial&register=MyRegister&id=searchtext

OuterExcellentAPIGetList - Custom List Types

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

OuterExcellentAPIWindowActions - Custom Field Triggers

Add custom field trigger logic for registers in the windowactions endpoint.


Architecture Notes for Extensions

  • Extension functions are global procedure (not function)
  • They are called automatically if defined - no registration needed
  • For sub-actions that modify the database, delegate to a remote updating procedure
  • Web handlers (global procedures) cannot modify the database directly
  • Use temp files to pass large payloads across the remote procedure boundary (areas cannot cross)

3-file pattern for database-modifying extensions:

  1. Web handler file: global procedure (HTTP I/O + validation)
  2. Remote file: remote updating procedure (database operations)
  3. Data definition file: settings block for configuration (API keys, secrets)