Developers / Integration guides
Oracle JD Edwards Orchestrator integration
How a reviewed supplier invoice becomes an AP voucher in JD Edwards EnterpriseOne through one AIS orchestration call, and what each side has to set up.
What the integration does
Core Invoice pushes each reviewed supplier invoice into JD Edwards EnterpriseOne as an AP
voucher by calling one Orchestrator orchestration, CI_AddSupplierInvoice,
over the AIS REST API. JDE stays the system of record: it validates the supplier, company,
currency and dates, assigns the voucher number and writes F0411 and F0911; Core Invoice
stores that voucher number against the invoice.
- Core Invoice side. Supplier invoices arrive by upload, email or API, OCR extracts vendor, totals and lines, and a reviewer confirms them with a GL coding and an optional cost centre. A reviewed invoice is pushed to the ERP by hand or automatically.
- JD Edwards side. An Orchestrator Studio form request drives Standard Voucher Entry (P0411) exactly as a clerk would, so every JDE edit, default and AAI applies to the voucher.
- In scope. Purchase invoices as unposted vouchers of document type PV. Credit notes, receipts and sales invoices are never pushed (see Responses & errors).
- Next. Suppliers, accounts and business units read from JDE so reviewers code against JDE's own master data, tax codes on the voucher, and an optional batch path through the Z-files.
Requirements
JD Edwards EnterpriseOne on Tools 9.2 with the AIS server and Orchestrator Studio; this guide was written against Tools 9.2.26. It is meant for your JD Edwards administrator, who builds the orchestration, and for the person who administers Core Invoice for your company.
Architecture
Core Invoice makes one outbound HTTPS call per invoice. The AIS server runs the orchestration, which drives the two Voucher Entry forms on the HTML server, and the voucher number comes back in the same response. Orchestrator Studio is used only at design time, by the administrator who builds the objects.
Authentication
Core Invoice signs in to the AIS server with a JDE user and password, uses the returned AIS token for the orchestration call, and keeps nothing between pushes.
-
A token request with the user, password, the device name
core-invoice, and the environment and role set on the connection. The token isuserInfo.tokenin the response. -
The orchestration call carries two headers,
jde-AIS-Authwith the token andjde-AIS-Auth-Devicewith the same device name. The device header is mandatory because the token was requested with a device name.Authorization: Beareris reserved by AIS for JWTs and is not sent. - "Test connection" in Core Invoice is the token request alone; success means the credentials, environment and role are accepted.
POST /jderest/v2/tokenrequest
Content-Type: application/json
{
"username": "COREINV",
"password": "********",
"deviceName": "core-invoice",
"environment": "JPD920",
"role": "*ALL"
} POST /jderest/v3/orchestrator/CI_AddSupplierInvoice
Content-Type: application/json
jde-AIS-Auth: <userInfo.token from the token request>
jde-AIS-Auth-Device: core-invoice Connection settings
| Core Invoice connection setting | Example | Stored as |
|---|---|---|
| AIS Server URL | https://jde-ais.example.com:9302 | base_url |
| Environment | JPD920 | db_name |
| JDE user and password | the service account, for example COREINV, and its password | username, encrypted_credentials (Fernet) |
| Role | *ALL, or a role limited to voucher entry | jde_role |
| Push method | Orchestration | push_method |
| Orchestration name | CI_AddSupplierInvoice | orchestration_name |
One token per push is well inside any usual AIS token lifetime, and no session is kept open between pushes. AIS also accepts HTTP Basic on the orchestration call itself, which would remove the token step; environment and role then come from the AIS defaults, so it stays a fallback rather than the default.
Invoice push flow
A push is one synchronous HTTPS call that ends with either a voucher number or an error message on the invoice; nothing is left half-done on the Core Invoice side.
- A reviewer sets the invoice to Reviewed. The push starts from the "Push to ERP" action with the JDE connection selected, or automatically on review when the connection has auto-push on.
- Core Invoice refuses before calling JDE when the document is a credit note, a receipt or a sales invoice, when the invoice is not in Reviewed, or when 3-way matching is set to block and the purchase order did not reconcile.
- It writes a sync log row in status pending, builds the payload (next section), requests a token and calls the orchestration with a 60-second timeout.
- The orchestration runs the two voucher-entry forms inside JDE. JDE validates every field, assigns the next voucher number and writes F0411 and F0911 in one unposted batch of type V.
- The orchestration answers with the voucher number. Core Invoice stores it as the sync log's external id, marks the log success and sets the invoice to Pushed; the voucher number shows on the invoice page.
- On an HTTP 4xx or 5xx the AIS error message is stored on the sync log and shown on the invoice; the invoice stays Reviewed and can be pushed again once the cause is fixed.
Duplicates
A Pushed invoice cannot be pushed twice. The one gap is a failure reported after JDE had already written the voucher, where a retry would create a duplicate; the JDE A/P constant "Duplicate Invoice Number Edit" set to error is the safeguard, and it is on the go-live checklist.
Payload and field mapping
Core Invoice sends one stable JSON body per invoice, and the orchestration's inputs are named after these keys, so no field mapping lives in Core Invoice.
{
"vendorName": "Acme Supplies Ltd",
"vendorTaxId": "123456-789",
"invoiceNumber": "INV-84139",
"invoiceDate": "2026-10-27",
"dueDate": "2026-11-26",
"currency": "USD",
"subtotal": "46.40",
"taxTotal": "5.10",
"grandTotal": "51.50",
"lines": [
{
"lineNumber": 1,
"itemNumber": "GW44217",
"description": "Junction box 190x140x140 IP56",
"quantity": "1.0000",
"unitPrice": "16.2000",
"discountPct": null,
"taxRate": "11.0000",
"lineTotal": "17.98",
"lineCurrency": "USD"
}
]
}
Amounts travel as strings to avoid floating-point loss and any optional field may be
null. Dates are ISO yyyy-MM-dd; the orchestration inputs are typed
Date with that format and the amounts Numeric.
| Core Invoice field | Payload key | JDE field (P0411) | Notes |
|---|---|---|---|
| Vendor | vendorName, vendorTaxId | Supplier Number (AN8) | The orchestration resolves the supplier or applies its default; with the master-data sync in place Core Invoice sends supplierNumber from the vendor's external id |
| Invoice number | invoiceNumber | Invoice Number (VINV) | Free text, 25 characters in JDE |
| Invoice date | invoiceDate | Invoice Date (DIVJ) and G/L Date (DGJ) | G/L date equals the invoice date in this version |
| Due date | dueDate | Due Date on the pay item (DDJ) | Blank lets JDE derive it from the supplier's payment terms |
| Currency | currency | Currency Code (CRCD) | Must be the company's currency, or one with an exchange rate in JDE |
| Grand total | grandTotal | Gross Amount (AG) and the G/L distribution amount | One pay item, one distribution line |
| Subtotal | subtotal | Taxable Amount (ATXA) | |
| Tax total | taxTotal | Tax (STAM) | Posting tax needs Tax Ex and Tax Rate/Area, which the orchestration defaults from the supplier or from fixed values |
| Lines | lines[] | not used | Available to the orchestration for a later line-level distribution |
| GL coding (expense account) | glAccount, optional | G/L Distribution Account Number | When absent, the default set inside the orchestration applies |
| Company | company, optional | Company (CO) | When absent, the default set inside the orchestration applies |
Inside JDE: the orchestration
CI_AddSupplierInvoice is a version 3 orchestration with one step, the form
request CI_FR_Voucher, which walks Standard Voucher Entry through its two
forms and returns the voucher number.
| Form | What it sets | Studio control ids (Applications 9.2) |
|---|---|---|
| 1. P0411 W0411A "Enter Voucher - Payment Information", version ZJDE0001, mode Add | Header: Company (company), Supplier Number (supplierNumber), Invoice Number (invoiceNumber), Invoice Date and G/L Date (both invoiceDate), Currency Code (currency). First pay-item row: Gross Amount (grandTotal), Taxable Amount (subtotal), Tax Amount (taxTotal), Due Date (dueDate). Then OK. | 4, 285, 6, 25, 27, 155; grid 1.343, 1.348, 1.349, 1.47; OK 0_2 |
| 2. P0411 W0411K "G/L Distribution", mode Add | One distribution row: Account Number (glAccount), Amount (grandTotal). Return Form Data for Document No/Typ/Co and Document Type, then OK. | grid 1.30, 1.168; return 68, 70; OK 0_2 |
What JDE does between the two OKs:
- On the first OK it validates the supplier (Address Book and Supplier Master), company, currency, dates and amounts, assigns the voucher number from Next Numbers (system 04) with document type PV, and opens the G/L Distribution form with the amount to distribute.
- On the second OK it checks that the distribution lines equal the amount to distribute, writes the voucher and its pay item to F0411 and the expense line to F0911. The batch is type V and stays unposted; the normal G/L post (R09801) creates the AP trade offset from AAI item PC.
-
The orchestration maps the returned Document No/Typ/Co to the output
voucherNumberand Document Type todocumentType.
Give company, supplierNumber and glAccount default
values inside the orchestration (your company, a fallback supplier and a default expense
account): any value Core Invoice sends overrides its default, so the same orchestration
serves the first test and production. Share the orchestration once it works and grant the
Core Invoice service account run rights on it, plus application security for P0411.
Responses, errors and what never gets pushed
Success is HTTP 200 with the orchestration's named outputs; any failure is a JSON error
whose message Core Invoice shows on the invoice verbatim.
HTTP/1.1 200 OK
{
"voucherNumber": "12345",
"documentType": "PV"
}
Core Invoice accepts the number under voucherNumber, DocNumber,
docNumber or documentNumber, at the top level or inside
ServiceRequest1; a 200 without any of them is treated as an error that quotes
the raw response.
| HTTP status | Meaning on the AIS side | Shown in Core Invoice as |
|---|---|---|
| 200 | Orchestration completed | Voucher number on the invoice, status Pushed |
| 400 | Invalid JSON input | JDE 400: <message>, status stays Reviewed |
| 403 | Credentials refused, or no rights on the orchestration | JDE 403: Credentials Missing or Ignored Based on Configuration, or the UDO security text |
| 444 | Invalid or expired token | JDE 444: <message>; the next push requests a fresh token |
| 500 | Orchestration failed inside JDE, including form validation | JDE 500: <message>, where the message is the EnterpriseOne error text, for example an unknown supplier or an invalid account |
The AIS error body has this shape; Core Invoice reads message, then error, then exception.
HTTP/1.1 500 Internal Server Error
{
"message": "<the EnterpriseOne error text, for example an invalid supplier number>",
"exception": "<exception class, when one was thrown>",
"timeStamp": "2026-10-27T10:15:02.114+0200",
"userDefinedErrorText": "",
"status": "ERROR"
} Never pushed, with the reason stated on screen and no sync row written:
- Returns and credit notes: the push only expresses a positive payable, so a credit would book as another bill.
- Receipts: they settle an obligation and would double-count the invoice they pay.
- Sales invoices: they would raise a payable to the tenant's own customer.
Expense receipts and payments have no JDE implementation yet; the connector answers "not implemented" if one is attempted.
Master data from JDE
Reviewers should code against JDE's own suppliers, accounts and business units, so Core Invoice reads them from JDE on a schedule through read-only Data Request orchestrations; this sync writes nothing to JDE.
| Data | JDE source | Orchestration | Lands in Core Invoice as | Key |
|---|---|---|---|---|
| Suppliers | F0101 Address Book, search type V, joined to F0401 Supplier Master | CI_GetSuppliers | Vendors, created or matched by name, with the address number as external id and the tax id from the Address Book | AN8 |
| Chart of accounts | F0901 Account Master, postable accounts only (posting edit code blank) | CI_GetAccounts | The company's chart of accounts, code BU.Object or BU.Object.Sub, description, active flag | AID |
| Business units | F0006 Business Unit Master of the company | CI_GetBusinessUnits | Cost centres, keyed on the business unit and never on its name; disabled ones are never offered | MCU |
| Companies | F0010 Company Constants | CI_GetCompanies | The JDE company code stored on the Core Invoice company that pushes to it | CO |
How it runs: hourly per active JDE connection, plus once immediately when the connection
is created. Each sync creates or updates on the external id and never deletes, so a
supplier retired in JDE stays but is marked inactive. The push then sends
supplierNumber from the vendor's external id and glAccount from
the reviewer's GL coding, which replaces the defaults set inside the orchestration.
Why Data Requests: they are plain table reads under the user's row security, they page
(maxPageSize plus next-page calls), and they need no application security
beyond the tables.
Alternative path: batch vouchers through the Z-files
JDE's documented interface for vouchers from outside is the batch pair F0411Z1 (voucher header and pay items) and F0911Z1 (distribution lines), processed by the Batch Voucher Processor R04110ZA. It is the right choice when volumes are high, when AP wants to review a batch before it becomes vouchers, or if the form-driven flow proves fragile across Tools updates.
- The orchestration writes one F0411Z1 row and one or more F0911Z1 rows, through a form request on Batch Voucher Revisions (P0411Z1) or with Logic Extension table inserts.
- R04110ZA runs in proof mode to validate and in final mode to create F0411 and F0911; errors go to the work center and the rows stay in the Z-tables for correction in P0411Z1. R0411Z1P purges processed rows.
- The processor assigns the voucher number, so the orchestration can only return the transaction number; Core Invoice reads the voucher number later from F0411Z1 (processed flag 1, VLDOC) with a second orchestration.
Core Invoice supports this shape as push method Z-file: it sends F0411Z1-style keys plus
the same lines[] and stores the returned EDI batch number. Columns the header
row must carry:
| Column | Value |
|---|---|
| VLEDUS, VLEDBT, VLEDTN, VLEDLN | Origin user, batch number, transaction number (unique per invoice), pay-item line (blank for one pay item) |
| VLEDSP, VLEDTC, VLEDTR | 0 unprocessed, A add, V voucher |
| VLAN8, VLCO, VLDGJ | Supplier number, company, G/L date in Julian cyyddd |
| VLAG, VLVINV, VLDIVJ | Gross amount, supplier invoice number, invoice date |
| VLGLC, VLGLBA, VLMCU | G/L offset, bank account and business unit; blank takes the JDE defaults |
Every F0911Z1 row repeats the header keys (user, batch, transaction, line) and names its account as VNANI, or VNMCU, VNOBJ and VNSUB with the account mode VNAM. A Report Request inside the orchestration can submit R04110ZA right after the insert, but it may return before the job finishes, which is why the voucher number is read back rather than returned.
Security and network
The integration is outbound only, from the Core Invoice backend to the JDE AIS server over HTTPS; JDE never calls Core Invoice.
- Credentials. The JDE user and password live on the Core Invoice connection, Fernet-encrypted at rest, never logged, decrypted only for the duration of a call. Only a company admin can create or edit a connection.
- Service account. Run pushes under a dedicated JDE user (for example
COREINV) with application security limited to P0411, read access to the master-data tables above and run rights on theCI_*objects. Never a person's account. - UDO security. An orchestration is callable only by users who may view and run it, so the service account must be granted the orchestrations explicitly once they are shared.
- Transport. TLS to your AIS server. Only
/jderestneeds to be reachable from Core Invoice; the HTML server and Orchestrator Studio can stay internal. - Source address. Core Invoice calls out from a fixed address; ask Core Invoice support for the address to whitelist if your AIS server filters by source.
- Rate limits on the Core Invoice side: 20 pushes and 5 connection tests per minute per source address.
- Data sent to JDE. Vendor name and tax id, invoice number, dates, currency, amounts and line descriptions. No PDF or scan is sent in this version; the AIS media object service can attach the scanned invoice to the voucher later.
Implementation checklist
Going live takes one orchestration on the JD Edwards side and one connection on the Core Invoice side. The steps are listed in the order they are usually done.
JD Edwards administrator
- Create the service account and grant it P0411, the master-data tables and, later, the
CI_*objects. - Build the form request and orchestration described above in Orchestrator Studio, with defaults for company, supplier and expense account.
- Run it once from Run Orchestrations and check the voucher in Supplier Ledger Inquiry (P0411).
- Share the orchestration and grant the service account run rights on it.
- Set the A/P constant "Duplicate Invoice Number Edit" to error, so a retried push can never create a second voucher.
- Optional: build the Data Request orchestrations for suppliers, accounts and business units.
Core Invoice administrator
- Add an ERP connection of type Oracle JD Edwards EnterpriseOne with the AIS URL, environment, service account, role and orchestration name from the authentication section, and click Test connection.
- Push one reviewed supplier invoice by hand and confirm the voucher number appears on it.
- Switch on auto-push on review once a few manual pushes have gone through.
Go-live checks
- Test connection succeeds with the service account.
- A manual push returns a voucher number and the voucher is visible in P0411.
- A deliberately wrong supplier number comes back as a readable error on the invoice.
- Auto-push is on and the first automatic push has been checked.
Appendix: endpoints and smoke tests
All calls are standard AIS services on Tools 9.2; nothing custom is installed on the AIS server, only the orchestration.
| Endpoint | Used for | Authentication |
|---|---|---|
POST /jderest/v2/tokenrequest | Sign in and get the AIS token; also "Test connection" | User and password in the body, or HTTP Basic |
POST /jderest/v3/orchestrator/{name} | Run the voucher orchestration with the payload above | jde-AIS-Auth and jde-AIS-Auth-Device headers |
GET /jderest/v3/open-api-catalog3/{name} | Read the orchestration's input and output contract as OpenAPI 3.0 | HTTP Basic |
GET /jderest/v2/defaultconfig | Check the AIS version, default environment and role | none |
POST /jderest/v3/orchestrator/jde-logout | Optional: end the session after a push | jde-AIS-Auth header |
Smoke test from any machine that can reach the AIS server; replace the placeholders and let curl prompt for the password.
# 1. token (the device header must match step 3)
curl -u <user> -X POST https://<ais-server>/jderest/v2/tokenrequest \
-H "Content-Type: application/json" -H "jde-AIS-Auth-Environment: <environment>" \
-H "jde-AIS-Auth-Role: *ALL" -H "jde-AIS-Auth-Device: core-invoice"
# 2. the orchestration's contract, once it is saved
curl -u <user> https://<ais-server>/jderest/v3/open-api-catalog3/CI_AddSupplierInvoice
# 3. one voucher (TOKEN = userInfo.token from step 1)
curl -X POST https://<ais-server>/jderest/v3/orchestrator/CI_AddSupplierInvoice \
-H "jde-AIS-Auth: $TOKEN" -H "jde-AIS-Auth-Device: core-invoice" \
-H "Content-Type: application/json" \
-d '{"invoiceNumber":"TEST-001","invoiceDate":"2026-10-27","currency":"USD","grandTotal":"100"}' Sources
- AIS REST endpoints
- AIS authentication
- Token request v2
- Run an orchestration v3
- Discovering orchestrations
- F0411Z1 required fields
- F0911Z1 required fields
- Batch voucher process
- Accounts Payable orchestrations
Setting this up for a specific JDE environment? Talk to us and we will walk through the orchestration with your administrator.