How to Expose Sage X3 Web Services: Step-by-Step Tutorial (Version 12)

AM
Anita M.
Distribution Center Manager
★★★★★★★★★★
4.5/5 · 9/21/2026

Time-Saving Integration with Excellent Support

"I like that APPSeCONNECT saves us a lot of time by automating the import of sales orders from Shopify into SAP Business One. It helps in updating business partner contact information, which is great because before we had to hand-type the orders, but now it's all imported smoothly."

Read more APPSeCONNECT Reviews
How to Expose Sage X3 Web Services: Step-by-Step Tutorial (Version 12)
Author photo: Avijit PaulAvijit Paul14 min read

Exposing a Sage X3 Classic SOAP service requires a published Object or Subprogram, a Syracuse endpoint and pool, a validated contract, and proof of the business result. Production exposure also requires controlled retries, monitoring, and reversible publication changes. REST applies only when the required class, representation, and operation support it.

Key Takeaway

  • Choose the Service Model First: Use Classic SOAP for published Objects or Subprograms and REST for supported representations.
  • Treat Publication as a Contract: publicName, transaction, fields, parameter dimensions, and description control what callers exchange.
  • Separate Caller and X3 Identity: Syracuse authenticates the caller; endpoint login mapping selects the Sage X3 user.
  • Size SOAP Capacity Carefully: Child-process count and per-process pool size jointly determine available channels.
  • Read the Response Body: HTTP 200 alone does not prove success. Check status, messages, and resultXml.
  • Publish Narrowly: Expose the required contract, apply least privilege, control concurrency, and retain a tested rollback.

Step 1: Choose the Right Sage X3 V12 Service Surface

Sage X3 Version 12 includes more than one web service model. GESAWE publishes Classic SOAP services linked to legacy Objects and Subprograms. The REST Web API is linked to classes and representations. These models are not interchangeable, so the first design decision is the business operation and the application model that owns it.

Sage X3 Service Surface Comparison
Service Surface
Best Fit
Contract Shape
Classic SOAP Object
A classic Sage X3 function whose Object and entry transaction already enforce the required business rules
Screen fields, key groups, and permitted Object methods
Classic SOAP Subprogram
A bounded operation that needs custom 4GL logic, aggregation, or a purpose-built response
Declared input, output, and input-output parameters
REST Web API
A resource backed by the required class and representation, especially for supported native-mode operations
Resource URL, representation facets, and JSON or Atom payloads

Classic Objects and Subprograms use SOAP, while classes and representations use REST. Choose the service surface from the business operation and supported application model rather than from a client's preferred transport.

For read-heavy work, check for an appropriate representation first. Updates depend on the module and its business logic. Classic screen-based transactions may still require Classic SOAP. Newer Sage X3 Services and GraphQL capabilities have a separate component and release path, so a Version 12 label alone does not establish their availability.

Step 2: Define the Exposure Contract

A useful web service starts with a narrow contract. Write down the operation, caller, record keys, required data, business result, and failure behavior before opening GESAWE.

Define the Sage X3 web service exposure contract: business operation, keys and ownership, validation route, volume and timing, and error contract

Record the Intended Business Operation

State the actual operation, such as create an e-commerce sales order, read an invoice by number, or query customers changed since a timestamp. Identify whether the caller reads, writes, or runs a command.

Then define these boundaries:

  • Keys and Ownership: Identify the Sage X3 key, the external identifier used against duplicates, the system that owns each writable field, and the values Sage X3 calculates.
  • Validation Route: Preserve Sage X3 business validation through the Object or controlled Subprogram rather than letting the external application write tables directly.
  • Volume and Timing: Estimate peak record counts, line counts, request sizes, and acceptable response times.
  • Error Contract: Decide which errors the client may retry, which require data correction, and what evidence operations staff need.

Create a Publication Register

Keep a register for every exposed service. Include the folder, Object or Subprogram, transaction when applicable, publicName, approved operations, authentication method, mapped X3 identity, pool alias, schema fingerprint, owner, and rollback procedure.

Use a customer or partner naming convention for custom records. A Y or Z prefix is common for customizations, with names such as YWSSOHECM. The name must also be stable, unique in its intended folder, and understandable to administrators.

Step 3: Prepare Syracuse, the Endpoint, and the Classic SOAP Pool

Publication in the Sage X3 folder and execution through Syracuse are separate stages. A valid GESAWE record does not create an available service if the endpoint or pool cannot supply a classic session.

Prepare the Syracuse endpoint and Classic SOAP pool for Sage X3: verify the endpoint, enable web service children, configure the pool, and map the authenticated user to the X3 folder identity

Important Tip

If Number of web services children is 0 on the Syracuse host serving the call, every Classic SOAP request fails with HTTP 500 and “No Web services accepted”, no matter how correct the GESAWE record is. Set a nonzero value on each web tier host meant to take SOAP traffic, then select Start/Update on the pool and confirm a ready state on every Node.js process.

Verify the Sage X3 Endpoint

A Syracuse endpoint maps the web tier to a Sage X3 solution and folder. Confirm that the intended endpoint references the correct server and folder, that the caller's groups allow access to it, and that a test endpoint cannot accidentally resolve to production. Verify the solution and server folder in the endpoint before creating its pool.

Restrict endpoint access through groups. Keep test and production identities, credentials, pool aliases, and activation procedures separate even when service names match.

Enable Dedicated Web Service Processes

Open the Syracuse Hosts administration page for each participating web tier host. Set Number of web services children to a nonzero value on the hosts intended to accept Classic SOAP traffic. The default can be zero, in which case calls fail with HTTP 500 and No Web services accepted.

Each child process receives its own copy of a pool configuration. The product of web service child processes and the pool's maximum size determines the possible channel count across the host. Start conservatively, measure queueing and server behavior, and change one capacity layer at a time.

Create the Classic SOAP Pool

In Syracuse, open Administration > Administration > Web services > Classic SOAP pools configuration and create a pool for the target endpoint. Configure these operational fields:

  • Alias: Enter the stable value that callers will send as poolAlias. Treat case and spelling as contract data.
  • Endpoint: Select the endpoint that resolves to the intended Sage X3 folder.
  • Runtime Tags: Use matching tags when the pool must connect only to selected Sage X3 solution runtimes.
  • Locale and User: Set the channel initialization language and user. The call context can change language; the authenticated user's endpoint login map determines the X3 user.
  • Initialization Size: Set the number of clients created per Node.js web service process when the pool starts.
  • Maximum Size: Set the maximum clients per Node.js web service process. Additional clients can start when all existing clients are busy.
  • Timeouts: Set unused, lifetime, and queue timeouts from observed workloads. The defaults include 20 minutes unused and 720 minutes lifetime, but they are only starting points.
  • Auto Start: Enable it when the service must return after Syracuse starts or a pool failure. Record any operational reason for manual-only startup.

Initialization and maximum pool sizes apply to each Node.js web service process. License controls do not set the channel count, but Sage X3 can control SOAP data volume. Capacity planning therefore needs server measurements and current license parameters.

Save the pool, select Start/Update, and confirm a ready state on every intended Node.js process. The client sub-grid identifies X3 sessions, users, languages, and access times. Changing the endpoint, user, locale, or sizes can reinitialize clients.

Map the Authenticated User to the X3 Folder Identity

Classic SOAP credentials authenticate at Syracuse. The old SOAP codeUser and password parameters are deprecated. Sage X3 determines the folder user through the authenticated Administration user's endpoint login mapping.

HTTP 401 normally means the login, password, certificate, or bearer token failed at Syracuse. A business authorization failure after HTTP 200 can mean the mapped X3 user lacks access to a function, company, site, transaction, or record.

On-premises deployments can support basic, client-certificate, and OAuth2 authentication. Send Basic credentials only over TLS. Sage X3 Online requires OAuth2 for the Web API. Hosted customers should confirm which administration settings their provider controls.

Step 4A: Publish a Sage X3 Object as a Classic SOAP Web Service

An Object publication exposes a contract derived from a Sage X3 Object and its screens. It is useful when the existing classic transaction provides the right business behavior and field model.

Open GESAWE and Create the Definition

Navigate to Development > Script dictionary > Scripts > Web services, or use function code GESAWE where direct access is allowed. Create a record and enter:

  • Publication Name: Supply the external publicName, such as YWSSOHECM for a custom publication.
  • Description: State the business operation and owner rather than repeating the Object name.
  • Type: Select Object.
  • Object: Select the intended Sage X3 Object.
  • Transaction: Select the required transaction when that Object uses transactions.

The transaction shapes the exposed fields and behavior. A dedicated transaction can provide a smaller schema, but retain every required input and Sage-managed field.

Review the Generated Field Mapping

Use the Mapping tab to inspect groups, levels, field codes, internal names, parameter types, lengths, dimensions, mandatory indicators, and permitted ranges. GESAWE allows part of a service's fields to be selected. Hidden fields require special care: a publication can choose whether transmissible hidden fields are included, while non-transmitted hidden fields are never published.

Validate the schema with a minimum record, the highest expected line count, and optional values. This reveals missing groups and dimensions.

Publication creates a wrapper and XML structure for an Object or Subprogram. Sage X3 also prevents publishing the same Object-transaction pair twice under different names or varying only the hidden-field choice. If parallel external contracts are required, design distinct supported transactions or operations rather than attempting duplicate aliases for the same pair.

Create, Save, and Publish

Create and save the definition, then select Publication. Confirm that Published on, By, and Program are populated. The generated program uses the WJ plus publication-name convention, and Sage X3 creates XML and XSD descriptions for the service.

Publication makes the definition callable through the generic SOAP service. It does not make every generic operation valid. The Object, transaction, security, and business logic still determine which methods work.

After any change to screens, transaction setup, field selection, or related dictionary elements, republish in a controlled environment and compare the generated description with the previous fingerprint. A schema difference can break a mapping even if the publicName remains unchanged.

Step 4B: Publish a Custom 4GL Subprogram as a Web Service

A Subprogram publication is suitable when a bounded task does not map cleanly to a classic Object operation. Examples include a composite lookup, a controlled batch validation, or a response assembled from several application structures.

Design the Subprogram Contract

Define each parameter's name, data type, direction, length, and dimension. Bound array results and avoid universal routines that accept arbitrary tables, filters, or code fragments.

For retriable commands, define idempotency around a stable external request ID. Data-changing routines should use Sage X3 application logic and transaction handling, never direct table writes that bypass business controls.

Create and Register the 4GL Routine

Create the custom 4GL source in the approved development environment, compile it, and test it in the target development folder. In the Sage X3 Subprogram dictionary, register the source file and exact Subprogram name. Define the parameters in the same order and with the same directions and dimensions as the compiled routine.

Array dimensions must match the supported result size. Use a business limit and pagination or bounded selection for large variable results.

Publish the Registered Subprogram

Open GESAWE, create a custom publication name, select the Subprogram or non-Object service type, and associate the registered process and Subprogram. Review the Mapping tab, create and save the record, then publish it.

Subprogram publications use the generic SOAP run method rather than Object save or read. Verify every parameter through the generated service description before constructing the client payload. A code example copied from another folder is not a safe contract, even when the Subprogram name is identical.

Publish a Sage X3 Object or a custom 4GL Subprogram as a Classic SOAP web service in GESAWE

Step 5: Discover the WSDL, Endpoint, and Published Schema

Classic SOAP publications do not create a unique WSDL URL for each publicName. Syracuse provides one generic RPC/encoded WSDL that describes the common methods. Each Object or Subprogram then has a generated description tied to its application code.

Use placeholders until the administrator confirms the externally reachable host and port:

WSDL:https://[SYRACUSE_HOST]:[PORT]/soap-wsdl/syracuse/collaboration/syracuse/CAdxWebServiceXmlCC?wsdlService endpoint:https://[SYRACUSE_HOST]:[PORT]/soap-generic/syracuse/collaboration/syracuse/CAdxWebServiceXmlCC

Import the WSDL into a client that supports SOAP RPC/encoded services. Retrieving it does not prove that the caller can authenticate or execute a publication. The generic Classic SOAP service includes tester operations such as run, save, read, query, and getDescription.

Call getDescription before building a request. Its resultXml describes groups, fields, keys, methods, dimensions, access modes, and the Object transaction. Save it as the integration's baseline contract.

The request uses these context fields and a publication identifier:

  • Response Language (codeLang): Set the Sage X3 response language unless the supported HTTP language header supplies it.
  • Pool Alias (poolAlias): Send the mandatory alias of the Classic SOAP pool.
  • Pool Client (poolId): Leave this optional identifier empty for normal distribution and pin it only for controlled debugging.
  • Response Configuration (requestConfig): Select the XML or JSON result format, readable formatting, and any bounded trace output.
  • Publication Name (publicName): Pass the mandatory GESAWE publication name separately from callContext to the generic method.

Do not place credentials in deprecated SOAP context fields. Send the deployment's supported authentication at the HTTP layer and verify the user-to-endpoint login mapping.

Step 6: Test the Service from Transport to Business Outcome

Test in a non-production folder with representative configuration and master data. Start with the contract, then move to reads, writes, negative cases, and controlled load.

Test a Sage X3 web service from transport through business outcome: transport, authentication, description, object, subprogram, and concurrency tests

Run the Tests in This Order

  • Transport Test: Retrieve the generic WSDL over the intended TLS route and confirm the certificate chain, hostname, proxy, and firewall path.
  • Authentication Test: Call a harmless method and record the authenticated Syracuse identity and mapped X3 identity.
  • Description Test: Call getDescription for the exact publicName. Fail the deployment if its schema fingerprint differs unexpectedly.
  • Object Query and Read Tests: For an Object publication, query a small list, then read a known key. Verify filtering, limits, visibility, missing keys, and response parsing.
  • Object Write Test: For an Object publication, use save only after confirming writable fields. Test a minimum record, duplicate ID, invalid master data, unauthorized site, and maximum expected lines.
  • Subprogram Test: For a Subprogram publication, use run with minimum, maximum, empty, and invalid parameters. Verify dimensions and transaction behavior.
  • Concurrency Test: Increase parallel requests gradually while watching queues, wait time, execution time, X3 sessions, and database behavior.

Generate request structures from the imported WSDL and the live getDescription output. A structural placeholder can help teams identify the moving parts, but it is not a runnable payload:

<METHOD_NAME> <callContext> <codeLang>[X3_LANGUAGE]</codeLang> <poolAlias>[POOL_ALIAS]</poolAlias> <poolId></poolId> <requestConfig>[CONTROLLED_RETURN_OPTIONS]</requestConfig> </callContext> <publicName>[GESAWE_PUBLICATION_NAME]</publicName> <METHOD_SPECIFIC_PAYLOAD>[GENERATED_FROM_GETDESCRIPTION]</METHOD_SPECIFIC_PAYLOAD></METHOD_NAME>

Object fields come from the selected transaction; Subprogram parameters come from its registered definition. Match every example to the target folder's generated description.

Validate the Complete Response

Classic SOAP returns a CAdxResultXml structure with messages, resultXml, status, and technicalInfos. HTTP and business status are separate:

  • HTTP 200 with Body Status 1: The web function completed without a reported error. Validate the returned key and intended business result as well.
  • HTTP 200 with Body Status 0: A technical or business error occurred. Parse every message and retain the relevant diagnostic context.
  • HTTP 401: Authentication failed before the requested Sage X3 business operation ran.
  • HTTP 500 with No Web Services Accepted: Syracuse has no enabled web service child process on the relevant host path.

HTTP status and the SOAP body status report different layers of the result. Store the source identifier, publicName, operation, timestamp, status, messages, and returned X3 key for reconciliation.

Use detailed trace only for bounded diagnosis. It can be large and contain business data. Disable it afterward and protect it like an integration payload.

How to Troubleshoot Common Sage X3 Web Service Failures

Classify failures by layer before changing a publication or pool. Similar symptoms can come from authentication, endpoint mapping, capacity, schema drift, or business validation.

Sage X3 Web Service Troubleshooting Guide
Symptom
Likely Layer
First Useful Check
HTTP 500 and No Web services accepted
Syracuse host
Confirm Number of web services children is greater than zero on the serving host
HTTP 401
Authentication
Verify the login or token, authentication method, TLS route, and credential state
HTTP 200, body status 0, no matching pool
Call context or pool
Compare poolAlias exactly and inspect pool state for the target endpoint
HTTP 200, body status 0, business message
Sage X3 application
Read all messages and reproduce under the mapped X3 user's company, site, and function rights
Request waits and queue timeout expires
Pool saturation or slow processing
Inspect web service queues, pool wait duration, busy clients, and X3 execution time
Field rejected or missing
Contract mismatch
Compare the payload with current getDescription output and selected transaction
Large schema or payload fails
Contract breadth, record size, or data-volume control
Measure request and response size, remove unneeded published fields safely, and check current license limits
Subprogram returns incomplete arrays
Dictionary or routine mismatch
Compare parameter order, direction, type, length, and dimension with the compiled 4GL routine

For difficult runtime cases, create a time-bounded X3 session log targeted to the endpoint, service, pool, and user instead of tracing all traffic.

Do not answer queueing by raising every limit. Measure pool wait and execution separately, then fix slow validation, database contention, oversized requests, or long Subprograms at the responsible layer.

Step 7: How to Harden the Service for Production

Production readiness depends on identity, change control, error recovery, and measured capacity.

Harden a Sage X3 web service for production: least privilege, retry and duplicate control, capacity monitoring, and reversible publication changes

Apply Least Privilege and Network Controls

Use a dedicated integration identity and map it to an X3 user with only the required function, company, site, and data rights. Never retain a shared administrator identity merely because it eliminated test authorization errors.

Validate TLS certificates, restrict source networks where feasible, and keep secrets in an approved credential store. Rehearse credential rotation.

Control Retries and Duplicate Processing

Retry only failures likely to be temporary, such as a transient network interruption or bounded queue saturation. Business validation failures need correction before replay. Timeouts are ambiguous because the server may have committed the transaction even if the client did not receive the response.

Use a stable external idempotency key with serialized handling or supported uniqueness enforcement. A query-before-create check by itself can race when calls run concurrently. A delayed query can remain inconclusive while the original request is still processing or its result is not yet visible. After a timeout, reconcile the external reference and the Sage X3 result before deciding whether to resend. For Subprogram commands, make idempotency part of the routine contract.

Monitor Capacity and Business Outcomes

Pool Status exposes queues, completed calls, clients, users, and access times. SOAP technicalInfos can show wait and execution duration. Track:

  • Technical Health: Track authentication failures, queue timeouts, body status 0 rates, pool wait time, execution time, and channel restarts.
  • Business Health: Track requested and accepted records, duplicates, master-data failures, and unreconciled identifiers.
  • Contract Health: Detect unexpected getDescription changes after patches, configuration deployments, or republishing.

Change capacity after a repeatable load test, and keep limits below the point where X3 contention reduces throughput.

Make Publication Changes Reversible

Before republishing, retain the definition, generated description, transaction reference, Subprogram version, and tests. Compare the new contract in non-production. Use a coordinated new contract when consumers cannot tolerate a breaking change.

Rollback can restore and republish a prior transaction or Subprogram, revert a mapping, or stop a new consumer. Unpublication alone creates an outage.

How to Connect Published Sage X3 Services with APPSeCONNECT

Once the Sage X3 service contract is stable, APPSeCONNECT can handle the integration workflow around it. APPSeCONNECT supports protocol-based adapters for SOAP and REST. Test the configured SOAP path against Sage X3's RPC/encoded contract and required published operations before relying on it in production.

Connect published Sage X3 web services with APPSeCONNECT ProcessFlow: connection configuration, request construction, business rules, response handling, concurrency control, and reconciliation
897
applications the average enterprise now manages
29%
of those applications are actually integrated
Every Sage X3 web service you publish is a controlled bridge across that gap, so its contract, identity, and retry rules decide whether data actually flows.

A production ProcessFlow should make the Sage X3 contract explicit:

  • Connection Configuration: Store the Syracuse endpoint, supported authentication, and environment-specific credentials.
  • Request Construction: Map source fields only to inputs present in the current Object description or Subprogram parameters.
  • Business Rules: Apply lookups and transformations before the SOAP call, while leaving Sage X3 responsible for its own validations and calculated fields.
  • Response Handling: Parse HTTP status, body status, messages, and returned keys. Route body status 0 to correction rather than marking it successful.
  • Concurrency Control: Keep execution and batches within the tested SOAP pool envelope.
  • Reconciliation: Retain source and destination identifiers so operations can prove which records were created and which still need action.

APPSeCONNECT ProcessFlow uses GET, Mapper, and POST nodes to move and transform data. Its Sync Info and Retry capability records failed and unprocessed items for controlled resynchronization. Retry selected temporary failures under configured control; hold business errors for correction.Sync Info and Retry capability records failed and unprocessed items for controlled resynchronization. Retry selected temporary failures under configured control; hold business errors for correction.

Snapshots and node logs help support teams inspect transformations and responses. Protect them because ERP payloads can contain sensitive business data.

The Sage X3 Web Service Exposure Process, In Plain Terms

Step 1
Step 2
Step 3
Step 4
Step 5
Step 6
Step 7
Step 8
Step 01Step 1

Choose the Right Service Surface

Decide between a Classic SOAP Object/Subprogram and a REST class/representation based on what the business operation actually needs and what Sage X3 supports for it.

Navigate using the buttons or step indicators above.

Conclusion

A reliable Sage X3 V12 web service has a narrow contract, verified identity path, measured pool, business-aware responses, and reversible release. Schema discovery, negative testing, monitoring, and reconciliation make the endpoint dependable.

If you need to connect a published Sage X3 service to another business application, APPSeCONNECT can map and operate the SOAP or REST workflow around that contract.

Talk to an APPSeCONNECT integration specialist about your Sage X3 service design.

Frequently Asked Questions

Sage X3 V12 uses GESAWE for Classic SOAP Objects and Subprograms, while the Web API uses REST for classes and representations.

Sage X3Web ServicesSOAPERP IntegrationAPPSeCONNECT
AM
Anita M.
Distribution Center Manager
★★★★★★★★★★
4.5/5 · 9/21/2026

Time-Saving Integration with Excellent Support

"I like that APPSeCONNECT saves us a lot of time by automating the import of sales orders from Shopify into SAP Business One. It helps in updating business partner contact information, which is great because before we had to hand-type the orders, but now it's all imported smoothly."

Read more APPSeCONNECT Reviews

Request for a personalized demo

Related Resources