Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/idempiere/idempiere/llms.txt

Use this file to discover all available pages before exploring further.

iDempiere’s SOAP API provides comprehensive web services with WSDL definitions for robust enterprise integration. All services support standard SOAP protocols with XML Schema validation.

Service URLs

ModelADService

https://your-server:8443/ADInterface/services/ModelADService

CompositeService

https://your-server:8443/ADInterface/services/compositeInterface

SOAP Configuration

Namespace

xmlns:_0="http://idempiere.org/ADInterface/1_0"

SOAP Binding

  • Style: RPC
  • Use: LITERAL
  • Parameter Style: WRAPPED

Data Binding

Services use Apache XMLBeans for data binding, providing type-safe XML manipulation.

ModelADService Operations

createData

Create a new record in an iDempiere table.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:createData>
      <_0:ModelCRUDRequest>
        <_0:ModelCRUD>
          <_0:serviceType>CreateBPartner</_0:serviceType>
          <_0:TableName>C_BPartner</_0:TableName>
          <_0:RecordID>0</_0:RecordID>
          <_0:Action>Create</_0:Action>
          <_0:DataRow>
            <_0:field column="Value">
              <_0:val>CUST-100</_0:val>
            </_0:field>
            <_0:field column="Name">
              <_0:val><![CDATA[Acme Corporation]]></_0:val>
            </_0:field>
            <_0:field column="IsCustomer">
              <_0:val>Y</_0:val>
            </_0:field>
            <_0:field column="C_BP_Group_ID">
              <_0:val>103</_0:val>
            </_0:field>
          </_0:DataRow>
        </_0:ModelCRUD>
        <_0:ADLoginRequest>
          <_0:user>WebService</_0:user>
          <_0:pass>WebService</_0:pass>
          <_0:lang>en_US</_0:lang>
          <_0:ClientID>11</_0:ClientID>
          <_0:RoleID>50004</_0:RoleID>
          <_0:OrgID>11</_0:OrgID>
          <_0:WarehouseID>103</_0:WarehouseID>
          <_0:stage>9</_0:stage>
        </_0:ADLoginRequest>
      </_0:ModelCRUDRequest>
    </_0:createData>
  </soapenv:Body>
</soapenv:Envelope>

readData

Read a single record by RecordID.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:readData>
      <_0:ModelCRUDRequest>
        <_0:ModelCRUD>
          <_0:serviceType>ReadBPartner</_0:serviceType>
          <_0:TableName>C_BPartner</_0:TableName>
          <_0:RecordID>1000025</_0:RecordID>
          <_0:Action>Read</_0:Action>
        </_0:ModelCRUD>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelCRUDRequest>
    </_0:readData>
  </soapenv:Body>
</soapenv:Envelope>

updateData

Update an existing record.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:updateData>
      <_0:ModelCRUDRequest>
        <_0:ModelCRUD>
          <_0:serviceType>UpdateBPartner</_0:serviceType>
          <_0:TableName>C_BPartner</_0:TableName>
          <_0:RecordID>1000025</_0:RecordID>
          <_0:Action>Update</_0:Action>
          <_0:DataRow>
            <_0:field column="Name">
              <_0:val><![CDATA[Acme Corporation - Updated]]></_0:val>
            </_0:field>
            <_0:field column="Description">
              <_0:val>Updated via SOAP API</_0:val>
            </_0:field>
          </_0:DataRow>
        </_0:ModelCRUD>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelCRUDRequest>
    </_0:updateData>
  </soapenv:Body>
</soapenv:Envelope>

deleteData

Delete a record by RecordID.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:deleteData>
      <_0:ModelCRUDRequest>
        <_0:ModelCRUD>
          <_0:serviceType>DeleteBPartner</_0:serviceType>
          <_0:TableName>C_BPartner</_0:TableName>
          <_0:RecordID>1000025</_0:RecordID>
          <_0:Action>Delete</_0:Action>
        </_0:ModelCRUD>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelCRUDRequest>
    </_0:deleteData>
  </soapenv:Body>
</soapenv:Envelope>

queryData

Query multiple records with filters and pagination.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:queryData>
      <_0:ModelCRUDRequest>
        <_0:ModelCRUD>
          <_0:serviceType>QueryBPartner</_0:serviceType>
          <_0:TableName>C_BPartner</_0:TableName>
          <_0:RecordID>0</_0:RecordID>
          <_0:Filter>IsCustomer='Y' AND IsActive='Y'</_0:Filter>
          <_0:Action>Read</_0:Action>
          <_0:Offset>0</_0:Offset>
          <_0:Limit>50</_0:Limit>
        </_0:ModelCRUD>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelCRUDRequest>
    </_0:queryData>
  </soapenv:Body>
</soapenv:Envelope>

createUpdateData

Create or update a record (upsert operation).
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:createUpdateData>
      <_0:ModelCRUDRequest>
        <_0:ModelCRUD>
          <_0:serviceType>CreateUpdateBPartner</_0:serviceType>
          <_0:TableName>C_BPartner</_0:TableName>
          <_0:RecordID>0</_0:RecordID>
          <_0:recordIDVariable>@C_BPartner_ID@</_0:recordIDVariable>
          <_0:Action>CreateUpdate</_0:Action>
          <_0:DataRow>
            <_0:field column="Value">
              <_0:val>CUST-100</_0:val>
            </_0:field>
            <_0:field column="Name">
              <_0:val>Acme Corporation</_0:val>
            </_0:field>
          </_0:DataRow>
        </_0:ModelCRUD>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelCRUDRequest>
    </_0:createUpdateData>
  </soapenv:Body>
</soapenv:Envelope>

runProcess

Execute an iDempiere process or report.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:runProcess>
      <_0:ModelRunProcessRequest>
        <_0:ModelRunProcess AD_Process_ID="119" AD_Menu_ID="0" AD_Record_ID="0">
          <_0:serviceType>RunInvoiceGenerate</_0:serviceType>
          <_0:ParamValues>
            <_0:field column="C_DocType_ID">
              <_0:val>1000000</_0:val>
            </_0:field>
            <_0:field column="DateInvoiced">
              <_0:val>2024-03-01 00:00:00</_0:val>
            </_0:field>
            <_0:field column="C_BPartner_ID">
              <_0:val>118</_0:val>
            </_0:field>
          </_0:ParamValues>
        </_0:ModelRunProcess>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelRunProcessRequest>
    </_0:runProcess>
  </soapenv:Body>
</soapenv:Envelope>

setDocAction

Process a document with a specific action.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:setDocAction>
      <_0:ModelSetDocActionRequest>
        <_0:ModelSetDocAction>
          <_0:serviceType>CompleteOrder</_0:serviceType>
          <_0:tableName>C_Order</_0:tableName>
          <_0:recordID>1000</_0:recordID>
          <_0:docAction>CO</_0:docAction>
        </_0:ModelSetDocAction>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelSetDocActionRequest>
    </_0:setDocAction>
  </soapenv:Body>
</soapenv:Envelope>
Document Actions:
  • CO - Complete
  • CL - Close
  • VO - Void
  • RE - Reverse - Correct
  • RC - Reverse - Accrual
  • RA - Reactivate
  • PR - Post

getList

Retrieve lookup values from a reference.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:getList>
      <_0:ModelGetListRequest>
        <_0:ModelGetList>
          <_0:serviceType>GetListSalesRegions</_0:serviceType>
          <_0:AD_Reference_ID>144</_0:AD_Reference_ID>
          <_0:Filter></_0:Filter>
        </_0:ModelGetList>
        <_0:ADLoginRequest>
          <!-- login details -->
        </_0:ADLoginRequest>
      </_0:ModelGetListRequest>
    </_0:getList>
  </soapenv:Body>
</soapenv:Envelope>

CompositeService Operations

compositeOperation

Execute multiple operations in a single atomic transaction.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:_0="http://idempiere.org/ADInterface/1_0">
  <soapenv:Header/>
  <soapenv:Body>
    <_0:compositeOperation>
      <_0:CompositeRequest>
        <_0:ADLoginRequest>
          <_0:user>WebService</_0:user>
          <_0:pass>WebService</_0:pass>
          <_0:lang>en_US</_0:lang>
          <_0:ClientID>11</_0:ClientID>
          <_0:RoleID>50004</_0:RoleID>
          <_0:OrgID>11</_0:OrgID>
          <_0:WarehouseID>103</_0:WarehouseID>
          <_0:stage>9</_0:stage>
        </_0:ADLoginRequest>
        <_0:serviceType>CompositeOrderEntry</_0:serviceType>
        <_0:operations>
          <!-- Operation 1: Create Order -->
          <_0:operation preCommit="false" postCommit="false">
            <_0:TargetPort>createData</_0:TargetPort>
            <_0:ModelCRUD>
              <_0:serviceType>CreateOrder</_0:serviceType>
              <_0:TableName>C_Order</_0:TableName>
              <_0:RecordID>0</_0:RecordID>
              <_0:Action>Create</_0:Action>
              <_0:DataRow>
                <_0:field column="C_BPartner_ID">
                  <_0:val>118</_0:val>
                </_0:field>
                <_0:field column="C_DocTypeTarget_ID">
                  <_0:val>135</_0:val>
                </_0:field>
              </_0:DataRow>
            </_0:ModelCRUD>
          </_0:operation>
          
          <!-- Operation 2: Create Order Line -->
          <_0:operation preCommit="false" postCommit="false">
            <_0:TargetPort>createData</_0:TargetPort>
            <_0:ModelCRUD>
              <_0:serviceType>CreateOrderLine</_0:serviceType>
              <_0:TableName>C_OrderLine</_0:TableName>
              <_0:RecordID>0</_0:RecordID>
              <_0:Action>Create</_0:Action>
              <_0:DataRow>
                <_0:field column="C_Order_ID">
                  <_0:val>@C_Order.C_Order_ID@</_0:val>
                </_0:field>
                <_0:field column="M_Product_ID">
                  <_0:val>137</_0:val>
                </_0:field>
                <_0:field column="QtyOrdered">
                  <_0:val>5</_0:val>
                </_0:field>
              </_0:DataRow>
            </_0:ModelCRUD>
          </_0:operation>
          
          <!-- Operation 3: Complete Order -->
          <_0:operation preCommit="true" postCommit="false">
            <_0:TargetPort>setDocAction</_0:TargetPort>
            <_0:ModelSetDocAction>
              <_0:serviceType>CompleteOrder</_0:serviceType>
              <_0:tableName>C_Order</_0:tableName>
              <_0:recordID>0</_0:recordID>
              <_0:recordIDVariable>@C_Order.C_Order_ID@</_0:recordIDVariable>
              <_0:docAction>CO</_0:docAction>
            </_0:ModelSetDocAction>
          </_0:operation>
        </_0:operations>
      </_0:CompositeRequest>
    </_0:compositeOperation>
  </soapenv:Body>
</soapenv:Envelope>
Composite Features:
preCommit
boolean
Commit transaction before executing this operation
postCommit
boolean
Commit transaction after executing this operation
Context Variables
string
Reference values from previous operations using @TableName.ColumnName@ syntax

XML Schema Types

WindowTabData

Response structure for read and query operations.
<WindowTabData NumRows="2" TotalRows="10" StartRow="0">
  <Success>true</Success>
  <DataSet>
    <DataRow>
      <field column="C_BPartner_ID" type="ID">
        <val>118</val>
      </field>
      <field column="Value" type="String">
        <val>CUST-001</val>
      </field>
      <field column="Name" type="String">
        <val>Customer Name</val>
      </field>
      <field column="C_BP_Group_ID" type="TableDir" lval="Standard">
        <val>103</val>
        <lookup>
          <lv val="Standard" key="103"/>
        </lookup>
      </field>
    </DataRow>
  </DataSet>
</WindowTabData>

DataField Attributes

@column
string
Column name
@type
string
Display type (ID, String, Integer, Date, etc.)
@lval
string
Display value for lookup fields
@disp
boolean
Whether field is displayed
@edit
boolean
Whether field is editable
@error
boolean
Whether field has an error

StandardResponse

Standard response for CRUD operations.
<StandardResponse IsError="false" IsRolledBack="false" RecordID="1000025">
  <outputFields>
    <outputField column="C_BPartner_ID" value="1000025" Text="1000025"/>
    <outputField column="Value" value="CUST-100" Text="CUST-100"/>
  </outputFields>
</StandardResponse>

Client Generation

Generate SOAP client code from WSDL:
# Generate client stubs
wsimport -keep -s src -p com.mycompany.idempiere.ws \
  https://localhost:8443/ADInterface/services/ModelADService?wsdl

WSDL Schema Reference

Key schema definitions from idempiere-schema.xsd:

Complex Types

Main data structure for query results
  • DataSet - Collection of DataRow elements
  • RowCount - Number of rows returned
  • Success - Operation success flag
  • Error - Error message if failed
  • @NumRows - Number of rows in this response
  • @TotalRows - Total rows matching query
  • @StartRow - Starting row number
CRUD operation definition
  • serviceType - Web service type name
  • TableName - Database table name
  • RecordID - Record identifier
  • Filter - SQL WHERE clause
  • Action - Operation: Create, Read, Update, Delete, CreateUpdate
  • Offset - Pagination offset
  • Limit - Pagination limit
  • DataRow - Field values
Process execution definition
  • serviceType - Web service type name
  • @AD_Process_ID - Process identifier
  • @AD_Record_ID - Context record ID
  • ParamValues - Process parameter values
Document action definition
  • serviceType - Web service type name
  • tableName - Document table name
  • recordID - Document record ID
  • recordIDVariable - Context variable for record ID
  • docAction - Action code (CO, CL, VO, etc.)

Testing SOAP Services

Using SoapUI

1

Create New SOAP Project

File > New SOAP ProjectEnter WSDL URL: https://localhost:8443/ADInterface/services/ModelADService?wsdl
2

Configure Authentication

All requests include ADLoginRequest in the SOAP body (not HTTP authentication)
3

Test Operations

Expand service operations and generate sample requestsModify the ADLoginRequest section with valid credentials
4

Save Test Scripts

Save requests as test cases for regression testing

Using Postman

iDempiere includes Postman collections in:
/testScripts/postman/iDempiereWebServices.postman_collection.json
/testScripts/postman/idempiere-soap-as-rest.postman_collection.json
Import these collections for pre-configured test requests.

Best Practices

Use CDATA for Text

Wrap text values containing special characters in CDATA sections:
<val><![CDATA[AT&T Corporation]]></val>

Validate Against Schema

Use the XSD schema to validate requests before sending to catch errors early.

Handle SOAP Faults

Implement proper SOAP fault handling in your client code to catch service errors.

Cache WSDL Locally

Download and cache WSDL files locally for faster client initialization and offline development.
Always test SOAP services in a development environment before deploying to production. CRUD operations directly modify data.