Epicor ERP Connector Guide
The Epicor ERP connector enables Tealfabric workflows to exchange manufacturing, customer, and supply-chain data with Epicor using both REST endpoints and Business Object services. This guide helps you configure the connector, implement common request patterns, and keep integrations stable in production.
Document information
| Field | Value |
|---|---|
| Canonical URL | /docs/04_connecting-systems/connectors/e/epicor-erp |
| Version (published date) | 2026-05-08 |
| Tags | connectors, reference, epicor-erp |
| Connector ID | epicor-erp-1.0.0 |
When to use this connector
Use this connector when your workflow must create or update Epicor entities, query operational data, or invoke Epicor business logic through BO services. It is especially useful for manufacturing and order-management automations that depend on company-scoped ERP state. A clear mapping between workflow payloads and Epicor object fields helps prevent update errors and reconciliation gaps.
Prerequisites
Before configuring the integration, confirm your Epicor base URL, target company ID, and a dedicated API user with least-privilege permissions. Ensure the user can access the endpoints or BO services needed by your workflow. Validating access early reduces production failures caused by permission mismatches.
Configuration reference
Connector settings are stored in integration configuration and reused during execution. Keep credentials secure and rotate them according to your security policy.
base_url(required): Epicor instance URL for API access (trailing slashes are trimmed).username(required): Epicor integration user account.password(required): Password for the integration user.company_id(required): Epicor company context sent as theX-Epicor-Companyheader on every request.timeout_seconds(optional): Timeout for connector requests (default60).
The connector uses Basic Authentication plus the X-Epicor-Company header. Only test validates required configuration fields; send, receive, and execute follow legacy behavior and do not pre-validate configuration.
Create or update Epicor entities
The send operation is commonly used with REST endpoints to maintain customer, part, or order records from upstream workflow events. The default HTTP method is POST. Provide data for the JSON body, or omit data to send the full call payload as the body, matching legacy behavior. Empty bodies are omitted on POST/PUT/PATCH, matching PHP !empty($body) semantics.
Paths are relative to base_url (no leading slash).
const baseUrl = "https://api.example.com/api/v1";
const tenantId = "<TENANT_ID>";
const apiKey = "<API_KEY>";
type EpicorResult = {
entity_key?: string;
status?: string;
};
async function createEpicorCustomer(integrationId: string): Promise<EpicorResult> {
const response = await fetch(
`${baseUrl}/integrations/${encodeURIComponent(integrationId)}/execute`,
{
method: "POST",
headers: {
"X-API-Key": apiKey,
"X-Tenant-ID": tenantId,
"Content-Type": "application/json",
},
body: JSON.stringify({
operation: "send",
endpoint: "Erp.BO.CustomerSvc/Customers",
method: "POST",
data: {
Company: "EPIC01",
CustID: "CUST-2026-0508",
Name: "Acme Components",
City: "Chicago",
Country: "USA",
},
}),
}
);
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const payload = (await response.json()) as { data?: { result?: EpicorResult } };
if (!payload.data?.result) throw new Error("Missing Epicor response payload");
return payload.data.result;
}curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
-H "X-API-Key: <API_KEY>" \
-H "X-Tenant-ID: <TENANT_ID>" \
-H "Content-Type: application/json" \
-d '{
"operation": "send",
"endpoint": "Erp.BO.CustomerSvc/Customers",
"method": "POST",
"data": {
"Company": "EPIC01",
"CustID": "CUST-2026-0508",
"Name": "Acme Components"
}
}'
{
"success": true,
"data": {
"message": "Epicor ERP operation completed successfully",
"result": {
"CustNum": 12345,
"CustID": "CUST-2026-0508",
"Name": "Acme Components"
}
}
}
Query records and run BO service methods
Use receive for filtered entity reads via GET with a query object (for example OData $filter, $top, $skip, $select). When the Epicor response includes an items array, the connector exposes record_count and items; otherwise it wraps the full response object as a one-element items array.
Use execute when you need BO service logic with a configurable HTTP method and JSON body. The default HTTP method is GET. Prefer body for mutable payloads; data is accepted as an alias when body is omitted.
const baseUrl = "https://api.example.com/api/v1";
const tenantId = "<TENANT_ID>";
const apiKey = "<API_KEY>";
type CustomerRow = { CustNum?: number; CustID?: string; Name?: string; City?: string };
async function queryEpicorCustomers(integrationId: string): Promise<CustomerRow[]> {
const response = await fetch(
`${baseUrl}/integrations/${encodeURIComponent(integrationId)}/execute`,
{
method: "POST",
headers: {
"X-API-Key": apiKey,
"X-Tenant-ID": tenantId,
"Content-Type": "application/json",
},
body: JSON.stringify({
operation: "receive",
endpoint: "Erp.BO.CustomerSvc/Customers",
query: {
$filter: "City eq 'Chicago'",
$select: "CustNum,CustID,Name,City",
$top: 20,
$skip: 0,
},
}),
}
);
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const payload = (await response.json()) as { data?: { items?: CustomerRow[] } };
if (!payload.data?.items) throw new Error("Missing Epicor entity payload");
return payload.data.items;
}curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
-H "X-API-Key: <API_KEY>" \
-H "X-Tenant-ID: <TENANT_ID>" \
-H "Content-Type: application/json" \
-d '{
"operation": "receive",
"endpoint": "Erp.BO.CustomerSvc/Customers",
"query": {
"$filter": "City eq '\''Chicago'\''",
"$select": "CustNum,CustID,Name,City",
"$top": 20,
"$skip": 0
}
}'
{
"success": true,
"data": {
"message": "Epicor ERP data retrieved successfully",
"record_count": 2,
"items": [
{"CustNum": 1001, "CustID": "CUST-001", "Name": "Acme Components", "City": "Chicago"},
{"CustNum": 1002, "CustID": "CUST-002", "Name": "Northwind Supply", "City": "Chicago"}
]
}
}
Arbitrary API calls with execute
Use execute for BO service methods or custom REST paths with configurable HTTP methods.
{
"operation": "execute",
"endpoint": "Erp.BO.CustomerSvc/Customers",
"method": "POST",
"body": {
"Company": "EPIC01",
"CustID": "CUST-2026-0508",
"Name": "Acme Components"
}
}
{
"success": true,
"data": {
"message": "Epicor ERP method executed successfully",
"result": {
"CustNum": 12345
}
}
}
Validate connection and operational reliability
Run the connector test operation before production deployment and after password rotation, company changes, or endpoint updates. test validates required configuration and probes GET api/v1 with Basic authentication and the X-Epicor-Company header.
curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
-H "X-API-Key: <API_KEY>" \
-H "X-Tenant-ID: <TENANT_ID>" \
-H "Content-Type: application/json" \
-d '{
"operation": "test"
}'
{
"success": true,
"data": {
"message": "Epicor ERP connection test successful",
"details": {
"base_url": "https://epicor.example.com",
"company_id": "EPIC01"
}
}
}
Additional references
For endpoint-specific details and BO method contracts, use your Epicor environment documentation and service metadata. Documenting field mappings and permissions alongside workflow code helps reduce maintenance effort as ERP logic evolves.