ECI Manufacturing ERP API

A product-agnostic REST API for reading and writing data in ECI ERP products, currently supporting Deacom, M1, Macola and JobBOSS². The API user account determines which ERP product, customer and database instance is reached. Supports field selection, filter expressions, sort expressions, take/skip paging, relationship expansion and a rowVersion change cursor. Three concurrent versions are published (v1, v2, v2.1); OAuth 2.0 client-credentials tokens are issued by the Integration Engine Management API. Access must be activated by ECI before use.

Operations 146

GET /api/v2.1/user-info Gets information about the current user accessing the API.
POST /api/v2.1/contacts Create a new Contact in the ERP system.
GET /api/v2.1/contacts Get a list of Contacts from the ERP system that match the given filters.
GET /api/v2.1/contacts/{id} Get an Contact from the ERP system that matches the given unique ID.
GET /api/v2.1/departments Get a list of Employees from the ERP system that match the given filters.
GET /api/v2.1/departments/{id} Get a Department from the ERP system that matches the given unique ID.
GET /api/v2.1/employees Get a list of Employees from the ERP system that match the given filters.
GET /api/v2.1/employees/{id} Get an Employee from the ERP system that matches the given unique ID.
GET /api/v2.1/gl-codes Get a list of GLCodes from the ERP system that match the given filters.
GET /api/v2.1/jobs Get a list of Jobs from the ERP system that match the given filters.
GET /api/v2.1/jobs/{id} Get a Job from the ERP system that matches the given unique ID.
PATCH /api/v2.1/jobs/{id} Update a job and its job operations in the ERP system.
POST /api/v2.1/jobs/{uniqueID}/part-production Register parts produced for a job.
GET /api/v2.1/job-assemblies Get a list of Job Assemblies from the ERP system that match the given filters.
GET /api/v2.1/job-assemblies/{id} Get a Job Assembly from the ERP system that matches the given unique ID.
GET /api/v2.1/job-materials Get a list of Job Materials from the ERP system that match the given filters.
GET /api/v2.1/job-materials/{id} Get a Job Material from the ERP system that matches the given unique ID.
GET /api/v2.1/job-operations Get a list of Job Operations from the ERP system that match the given filters.
GET /api/v2.1/job-operations/{id} Get a Job Operation from the ERP system that matches the given unique ID.
PATCH /api/v2.1/job-operations/{id} Update a job operation in the ERP system.
POST /api/v2.1/locations Create a new Location in the ERP system.
GET /api/v2.1/locations Get a list of Locations from the ERP system that match the given filters.
GET /api/v2.1/locations/{id} Get a Location from the ERP system that matches the given unique ID.
POST /api/v2.1/organizations Create a new Organization in the ERP system.
GET /api/v2.1/organizations Get a list of Organizations from the ERP system that match the given filters.
GET /api/v2.1/organizations/{id} Get an Organization from the ERP system that matches the given unique ID.
GET /api/v2.1/organization-parts Get a list of OrganizationParts from the ERP system that match the given filters.
GET /api/v2.1/organization-parts/{id} Get an Organization Part from the ERP system that matches the given unique ID.
POST /api/v2.1/parts Create a new Part in the ERP system.
GET /api/v2.1/parts Get a list of Parts from the ERP system that match the given filters.
GET /api/v2.1/parts/{id} Get a Part from the ERP system that match the given filters.
GET /api/v2.1/part-bins Get a list of Part-Bins from the ERP system that match the given filters.
GET /api/v2.1/part-costs Get a list of PartCosts from the ERP system that match the given filters.
GET /api/v2.1/part-cost-breaks Get a list of PartCostBreaks from the ERP system that match the given filters.
GET /api/v2.1/part-groups Get a list of PartGroups from the ERP system that match the given filters.
GET /api/v2.1/part-materials Get a list of PartMaterials from the ERP system that match the given filters.
GET /api/v2.1/part-materials/{id} Get a PartMaterial from the ERP system that match the given filters.
GET /api/v2.1/part-operations Get a list of PartOperations from the ERP system that match the given filters.
GET /api/v2.1/part-operations/{id} Get a PartOperation from the ERP system that match the given filters.
GET /api/v2.1/part-prices Get a list of PartPrices from the ERP system that match the given filters.
GET /api/v2.1/part-price-breaks Get a list of PartPriceBreaks from the ERP system that match the given filters.
POST /api/v2.1/part-revisions Create a new PartRevision in the ERP system.
GET /api/v2.1/part-revisions Get a list of PartRevisions from the ERP system that match the given filters.
GET /api/v2.1/part-revisions/{id} Get a PartRevisions from the ERP system that match the given filters.
GET /api/v2.1/payment-terms Get a list of PaymentTerm from the ERP system that match the given filters.
GET /api/v2.1/purchase-orders Get a list of PurchaseOrders from the ERP system that match the given filters.
GET /api/v2.1/purchase-orders/{id} Get an Purchaseorders from the ERP system that matches the given unique ID.
GET /api/v2.1/purchase-order-lines Get a list of PurchaseOrderLines from the ERP system that match the given filters.
GET /api/v2.1/purchase-order-lines/{id} Get a PurchaseOrderLine from the ERP system that matches the given unique ID.
GET /api/v2.1/quotes Get a list of Quotes from the ERP system that match the given filters.
GET /api/v2.1/quotes/{id} Get a Quote from the ERP system that matches the given unique ID.
GET /api/v2.1/quote-lines Get a list of QuoteLines from the ERP system that match the given filters.
GET /api/v2.1/quote-lines/{id} Get a QuoteLine from the ERP system that matches the given unique ID.
GET /api/v2.1/quote-quantities Get a list of Quote Quantities from the ERP system that match the given filters.
GET /api/v2.1/reasons Get a list of Reasons from the ERP system that match the given filters.
GET /api/v2.1/reasons/{id} Get a Reason from the ERP system that matches the given unique ID.
GET /api/v2.1/sales-accounts Get a list of SalesAccounts from the ERP system that match the given filters.
POST /api/v2.1/sales-orders Create a new SalesOrder in the ERP system.
GET /api/v2.1/sales-orders Get a list of SalesOrders from the ERP system that match the given filters.
GET /api/v2.1/sales-orders/{id} Get a SalesOrder from the ERP system that match the given filters.
GET /api/v2.1/sales-order-jobs Get a list of SalesOrderJobs from the ERP system that match the given filters.
GET /api/v2.1/sales-order-jobs/{id} Get a SalesOrderJob from the ERP system that match the given filters.
POST /api/v2.1/sales-order-lines Create a new SalesOrderLine in the ERP system.
GET /api/v2.1/sales-order-lines Get a list of SalesOrderLines from the ERP system that match the given filters.
GET /api/v2.1/sales-order-lines/{id} Get a SalesOrderLine from the ERP system that match the given filters.
GET /api/v2.1/shifts Get a list of Shift from the ERP system that match the given filters.
GET /api/v2.1/shifts/{id} Get a Shift from the ERP system that match the given filters.
GET /api/v2.1/tax-codes Get a list of TaxCodes from the ERP system that match the given filters.
POST /api/v2.1/timecards Create a new Timecard in the ERP system.
GET /api/v2.1/timecards Get a list of Timecards from the ERP system that match the given filters.
GET /api/v2.1/timecards/{id} Get a Timecard from the ERP system that match the given unique ID.
POST /api/v2.1/timecards/clock-in Clock an employee into their shift. Creates an open clock session that must be closed via clock-out.
POST /api/v2.1/timecards/clock-out Clock an employee out of their shift. Closes the clock session identified by model.ClockSessionID.
POST /api/v2.1/timecard-lines Create a new Timecard Line in the ERP system.
GET /api/v2.1/timecard-lines Get a list of Timecard Lines from the ERP system that match the given filters.
GET /api/v2.1/timecard-lines/{id} Get a TimecardLine from the ERP system that match the given unique ID.
PATCH /api/v2.1/timecard-lines/{id} Update an existing Timecard Line in the ERP system.
GET /api/v2.1/timezones Get a list of TimeZones from the ERP system that match the given filters.
GET /api/v2.1/valid-values/organization-types Gets the list of Organization Type codes.
GET /api/v2.1/valid-values/location-types Gets the list of Location Type codes.
GET /api/v2.1/valid-values/operation-types Gets the list of Operation Type codes.
POST /api/v2.1/work-centers Create a new WorkCenter in the ERP system.
GET /api/v2.1/work-centers Get a list of WorkCenters from the ERP system that match the given filters.
GET /api/v2.1/work-centers/{id} Get an WorkCenters from the ERP system that matches the given unique ID.
GET /api/v2.1/work-center-rate-breaks Get a list of WorkCenterRateBreaks from the ERP system that match the given filters.
GET /api/v2.1/view/ap-invoice-lines Gets a list of APInvoiceLine #
GET /api/v2.1/view/ap-invoices Gets a list of APInvoice #
GET /api/v2.1/view/ar-invoices Gets a list of ARInvoice #
GET /api/v2.1/view/ar-invoice-sales-people Gets a list of ARInvoiceSalesPerson #
GET /api/v2.1/view/contacts Gets a list of Contact #
GET /api/v2.1/view/cycle-codes Gets a list of CycleCode #
GET /api/v2.1/view/departments Gets a list of Department #
GET /api/v2.1/view/dmr-claim-lines Gets a list of DmrClaimLine #
GET /api/v2.1/view/dmr-claims Gets a list of DmrClaim #
GET /api/v2.1/view/employees Gets a list of Employee #
GET /api/v2.1/view/gl-codes Gets a list of GLCode #
GET /api/v2.1/view/inspection-lines Gets a list of InspectionLine #
GET /api/v2.1/view/job-assemblies Gets a list of JobAssembly #
GET /api/v2.1/view/job-materials Gets a list of JobMaterial #
GET /api/v2.1/view/job-operations Gets a list of JobOperation #
GET /api/v2.1/view/jobs Gets a list of Job #
GET /api/v2.1/view/locations Gets a list of Location #
GET /api/v2.1/view/organization-parts Gets a list of OrganizationPart #
GET /api/v2.1/view/organizations Gets a list of Organization #
GET /api/v2.1/view/part-bins Gets a list of PartBin #
GET /api/v2.1/view/part-classes Gets a list of PartClass #
GET /api/v2.1/view/part-cost-breaks Gets a list of PartCostBreak #
GET /api/v2.1/view/part-costs Gets a list of PartRevision #
GET /api/v2.1/view/part-groups Gets a list of PartGroup #
GET /api/v2.1/view/part-materials Gets a list of PartMaterial #
GET /api/v2.1/view/part-operations Gets a list of PartOperation #
GET /api/v2.1/view/part-price-breaks Gets a list of PartPriceBreak #
GET /api/v2.1/view/part-prices Gets a list of PartPrice #
GET /api/v2.1/view/part-revisions Gets a list of PartRevision #
GET /api/v2.1/view/parts Gets a list of Part #
GET /api/v2.1/view/part-transactions Gets a list of PartTransaction #
GET /api/v2.1/view/payment-terms Gets a list of PaymentTerm #
GET /api/v2.1/view/plants Gets a list of Plant #
GET /api/v2.1/view/processes Gets a list of Process #
GET /api/v2.1/view/production-calendars Gets a list of ProductionCalendar #
GET /api/v2.1/view/projects Gets a list of Project #
GET /api/v2.1/view/purchase-order-lines Gets a list of PurchaseOrderLine #
GET /api/v2.1/view/purchase-orders Gets a list of PurchaseOrder #
GET /api/v2.1/view/quote-lines Gets a list of QuoteLine #
GET /api/v2.1/view/quote-quantities Provides a breakdown of pricing for quote line items based on any included quantity discounts. #
GET /api/v2.1/view/quotes Gets a list of Quote #
GET /api/v2.1/view/quote-sales-people Gets a list of QuoteSalesPerson #
GET /api/v2.1/view/reasons Gets a list of Reason #
GET /api/v2.1/view/rma-claim-lines Gets a list of RmaClaimLine #
GET /api/v2.1/view/rma-claims Gets a list of RmaClaim #
GET /api/v2.1/view/rma-receipt-lines Gets a list of RmaReceiptLine #
GET /api/v2.1/view/sales-accounts Gets a list of SalesAccount #
GET /api/v2.1/view/sales-order-deliveries Gets a list of SalesOrderDelivery #
GET /api/v2.1/view/sales-order-jobs Gets a list of SalesOrderJob #
GET /api/v2.1/view/sales-order-lines Gets a list of SalesOrderLine #
GET /api/v2.1/view/sales-orders Gets a list of SalesOrder #
GET /api/v2.1/view/sales-order-sales-people Gets a list of SalesOrderSalesPerson #
GET /api/v2.1/view/shift-days Gets a list of ShiftDay #
GET /api/v2.1/view/shifts Gets a list of Shift #
GET /api/v2.1/view/shipment-lines Gets a list of ShipmentLine #
GET /api/v2.1/view/tax-codes Gets a list of TaxCode #
GET /api/v2.1/view/timecard-lines Gets a list of TimecardLine #
GET /api/v2.1/view/timecards Gets a list of Timecard #
GET /api/v2.1/view/timezones Gets a list of TimeZone #
GET /api/v2.1/view/work-center-rate-breaks Gets a list of WorkCenterRateBreak #
GET /api/v2.1/view/work-centers Gets a list of WorkCenter #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/eci-solutions-platform"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

eci-solutions-erp-v2-1-openapi.json Raw ↑
{
  "openapi": "3.0.1",
  "info": {
    "title": "ERP API v2.1",
    "description": "Provides a common API surface for accessing ECI ERP products.\n\n<a name='erps'></a>\n## ERP Product Support\nThis version of the API is generally supported by:\n\n - Deacom\n - M1\n - JobBOSS²\n\nSupport for some resources varies, so check the *Supported ERPs* section on each resource\nto see if it's supported before using it.\n\nThe API user account used to access the ERP API determines which ERP Product, Customer, \nand any specific database (Instance) of that ERP that will be accessed. Depending on the product,\nthe actual ERP database could be a cloud hosted ERP or on premises install, therefore, performance\nof the API may vary dramatically.\n\nThe [user-info endpoint](#/Account/get_api_v1_user_info) in this API will provide basic information \nabout the user account and company being accessed, such as the companyId and product. \nIt should be noted that the **CompanyID** does not uniquely identify the instance being accessed via the API.\n\n## Authentication\nPass an access token in the HTTP Authorization header of each request. For example:\n\n```Authorization: Bearer [token]```\n\nAccess tokens are obtained from the Management API. See the <a href='https://integrations.ecimanufacturing.com/docs/apis/index.html#/OAuth2ApiUser/post_oauth2_api_user_token'>Management API OAuth 2.0 Token endpoint documentation</a> for more information.\n\n<a name='fields'></a>\n## Field Selection\nFor resources that support Field Selection, the `fields` parameter can be provided \nwith a comma separated list of fields to return in the result.\n\nFor example:\n\n```/api/v2/organizations?fields=name,country```\n\n<a name='filterexpr'></a>\n## Filter Expressions \n\nFor resources that support filtering, filter expressions can be applied as query string parameters in\nthe format ```field_name[operator]=value```\n\nNote, for simple equality, you can omit the operator and specify fieldname=value. e.g. ```?firstName=Jane```\n\n### Operators\n\n- [eq] Equal to the given value.\n- [ne] Not Equal to the given value.\n- [gte] Greater than or equal to the given value.\n- [lte] Less than or equal to the given value.\n- [gt] Greater than the given value.\n- [lt] Less than the given value.\n- [in] Is in a list of pipe separated values.\n- [notin] Is not in a list of pipe separated values.\n\n<a name='sortexpr'></a>\n## Sort Expressions\n\nFor resources that support sorting, the sort expression is specified by adding the ```sort``` query string parameter, with a comma separated list of expressions as its value,\neach expression having an optional prefix of + or - to indicate ascending or descending order.\n\nFor example:\n```\n?sort=firstname\n?sort=lastname,firstname\n?sort=-create_date\n```\n\n<a name='pageparam'></a>\n## Paging Parameters\n\nThe parameters ```take``` and ```skip``` can be provided separately but can be combined to implement server-side paging of results. \nSee the documentation for take and skip on each resource.\n\nFor example:\n```\n?take=100\n?take=100&skip=200\n```\n\n<a name='countparam'></a>\n## Count Parameter\n\nThe parameter ```count``` may be provided to change the data retrieval behavior.\n\nThe value of `0` returns the filtered, expanded, and paginated data in the `data` property of the response. The `count` property always contains the number of records in `data`. This is the default behavior when the `count` parameter is not provided.\n\nThe value of `1` returns an empty array in the `data` property and the total count of matching source records in the `count` property, applying any requested filters but ignoring any requested paging parameters.\n\nThe value of `2` returns both the `data` records, paginated if requested, and the `count` value with the total number of records in the source, ignoring pagination.\n\n```\n0 - Data Only\n1 - Total Count Only\n2 - Data and Total Count\n```\n\n## Expansions\n\nSome data sources have relationships that can be expanded. The list of supported\nexpansions is located in the documentation for each resource below.\n\nAn expansion expression is in the form:\n\n```expand=relationship_name(fields_expression)```\n\nfields_expression is optional.\n\nFor example, to expand the timecard for a timecard line\n\n```api/v1/view/timecardlines?expand=timecard```\n\nA resulting individual record would look like:\n\n```json\n{\n    \"timecardID\": 5,\n    \"timecard\": {\n      \"timecardID\": 5,\n      \"employeeID\": \"GROSE\",\n      \"shiftID\": 1,\n      \"timecardDate\": \"2000-11-06T00:00:00\",\n      \"uniqueID\": \"389fcb16-8740-467f-9273-9c383f1472c9\",\n      \"rowVersion\": 27569\n    }\n}\n```\n\nTo select only specific fields from an expansion, use an inner fields expression.\n\n```api/v1/view/timecardlines?expand=timecard(fields=uniqueid,employeeID)```\n\nAnd the resulting record would look like:\n```json\n{\n    \"timecardID\": 5,\n    \"timecard\": {\n      \"employeeID\": \"GROSE\",\n      \"uniqueID\": \"389fcb16-8740-467f-9273-9c383f1472c9\"\n    }\n}\n```\n\nExpansions can also be nested.\n\n```api/v1/view/timecardlines?expand=timecard(expand=employee)```\n\n\n## ConvertToUTC\nThe time zone in which Date/Time values are represented varies by ERP\nand some times data source. Pass the ConvertToUTC parameter\nwith a value of `yes` to indicate you want supported \ndate/time field values converted to UTC. \n\n```api/v1/view/timecardlines?ConvertToUTC=yes```\n\nSee resource specific documentation for which fields are supported.\n\n## Common Attributes\n### uniqueID\n\nThe ```uniqueID``` attribute, when present, uniquely identifies a record in the source system.\nThis identifier may not be globally unique. It is only guaranteed to be unique for the same resource\nand same Company account.\n\nIn general, the ERPs use the following data types in the uniqueID field:\n\n- Macola: GUID\n- M1: GUID\n- JobBOSS²: Int32\n\n### rowVersion\n\nThe value of the rowVersion attribute is a 64bit signed integer. This value can be used to query for \nnew or modified records in most resources. New and updated records will always receive a value higher than the\nrowVersion of any other record in the source data. There may be some variations in the implementation of\nthis attribute across ERP products.\n\n## Tracing\n\nThis API supports [W3C Trace Context](https://www.w3.org/TR/trace-context/). TraceIDs will be\ngenerated for each request and returned in each response in a *traceid* header. You should\ncapture this value in any responses and consider logging it as part of any integration\nbeing built. \n\nWhen reporting problems with this API, the *traceid* in the response is the single most important piece\nof information you can provide.\n\n```\ntraceid: 00-e352fa809e1a5b47ba4d88f8182b36f4-44902b415c593c4f-00\n```\n\nIn addition, the traceid value is provided in the body of error responses.\n\n```json\n{\n  \"type\": \"https://tools.ietf.org/html/rfc7231#section-6.5.4\",\n  \"title\": \"Not Found\",\n  \"status\": 404,\n  \"traceId\": \"00-c2857fd044158e41bf73349e95208f1e-9476acc2107e274d-00\"\n}\n```\n\nA caller can also provide their own W3C Trace Context compliant trace id\nvia the ```traceparent``` heeder in a request.\n\n```\ntraceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01\n```\n\n## Error Responses\n\nError responses will typically be in in [RFC7807](https://datatracker.ietf.org/doc/html/rfc7807) \n\"Problem details\" format as show below:\n\n### A sample 404 Not Found\n```json\n{\n  \"type\": \"https://tools.ietf.org/html/rfc7231#section-6.5.4\",\n  \"title\": \"Not Found\",\n  \"status\": 404,\n  \"traceId\": \"00-c2857fd044158e41bf73349e95208f1e-9476acc2107e274d-00\"\n}\n```\n\n### A sample 500 Internal Server Error\n```json\n{\n  \"type\": \"https://tools.ietf.org/html/rfc7231#section-6.6.1\",\n  \"title\": \"An error occured while processing your request.\",\n  \"status\": 500,\n  \"traceId\": \"00-fd1c6ec035a01943bec2ffabf2f1d6e2-9601a3cae715e143-00\"\n}\n```\n\n## Response Headers\n\n- **traceid:** The W3C Trace Context (see above)\n- **erp-company-id**: A value identifying the ERP Company where the data in the response originated.\n- **erp-instance-id**: A value indicating the database instance being accessed. Note this value is presently not immutable, and may change periodically.\n- **cdc-request-id**: For requests that were executed via a Cognytics Data Connector request, this provides the CDC Request ID\n\n## Management Console\nUse the <a href='https://integrations.ecimanufacturing.com'>Integration Engine Management Console</a> to configure and monitor access to this API.\n\n\n## Contact Information\n\nThis API is maintained by the ECI Manufacturing Integration Team.\n",
    "contact": {
      "name": "ECI Manufacturing Division Integration Team",
      "url": "https://www.ecisolutions.com/support/"
    },
    "version": "3.5.585+b1e45fd230"
  },
  "servers": [
    {
      "url": "https://api-erp.integrations.ecimanufacturing.com:443",
      "description": "Production"
    }
  ],
  "paths": {
    "/api/v2.1/user-info": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Gets information about the current user accessing the API.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserInfoResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserInfoResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserInfoResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/contacts": {
      "post": {
        "tags": [
          "Contact"
        ],
        "summary": "Create a new Contact in the ERP system.",
        "description": "## Supported ERPs\n - JobBOSS²\n",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactCreateModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactCreateModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ContactCreateModel"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created"
          }
        }
      },
      "get": {
        "tags": [
          "Contact"
        ],
        "summary": "Get a list of Contacts from the ERP system that match the given filters.",
        "description": "Gets a list of Contact.\n\n## Supported ERPs\n - M1\n - JobBOSS²\n - Macola\n## Resource Features\nFeature     |Supported   |Notes\n------------|------------|------------\nFilter Expressions|**Yes**| \nSort Expressions|**Yes**\nField Selection|**Yes**\nPagination|**Yes**\nUniqueID|uniqueID|\n## Features by Field\nField       |Filterable  |Sortable    |Supported ERPs\n------------|------------|------------|------------\nuniqueID|Yes|Yes|M1, JobBOSS², Macola\nrowVersion|Yes|Yes|M1, JobBOSS², Macola\ncontactID|Yes|Yes|M1, JobBOSS², Macola\nname|Yes|Yes|M1, JobBOSS², Macola\norganizationID|Yes|Yes|M1, JobBOSS², Macola\norganizationTypes|Yes|Yes|JobBOSS²\nphoneNumber|Yes|Yes|M1, JobBOSS², Macola\nemailAddress|Yes|Yes|M1, JobBOSS², Macola\nisActive|Yes|Yes|M1, JobBOSS², Macola\ncomments|Yes|Yes|JobBOSS²\n",
        "parameters": [
          {
            "name": "fields",
            "in": "query",
            "description": "A comma-separated list of fields to include in the result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "A comma-separated list of <a href='#sortexpr'>sort expressions</a>.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "take",
            "in": "query",
            "description": "Limit the number of results being returned",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "skip",
            "in": "query",
            "description": "The number of results to skip. Combine with 'take' to fetch records in pages",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "<a href='#countparam'>Data and count</a> response behavior ",
            "schema": {
              "maximum": 2,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "See <a href='#filterexpr'>Filter Expressions</a> for query string syntax. The Test UI and any generated code tool may expose filter parameters as a dictionary of name/value pairs, but if creating a raw HTTP request, they must be provided on the querystring as defined in the Filter Expression section.",
            "style": "form",
            "schema": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "examples": {
              "Empty": {
                "description": "No filters applied"
              },
              "Example #1": {
                "description": "A dictionary of name/value pairs that will be serialized as querystring parameters in the format ```name[operator]=value```",
                "value": {
                  "uniqueID[eq]": "cc90686b-399e-4094-b431-fa462f84b0a8",
                  "rowVersion[gte]": 123,
                  "contactID[eq]": "abc123",
                  "name[eq]": "abc123",
                  "organizationID[eq]": "abc123",
                  "organizationTypes[gte]": 123,
                  "phoneNumber[eq]": "abc123",
                  "emailAddress[eq]": "abc123",
                  "isActive[eq]": true,
                  "comments[eq]": "abc123"
                }
              }
            }
          },
          {
            "name": "expand",
            "in": "query",
            "description": "### Supported Expansions\nAn expansion expression containing a comma separater list of relationships to expand.\nName        |Value       |Description\n------------|------------|-----------\norganization|Organizations|The organization to which the Contact belongs.\n",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ContactListResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactListResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/contacts/{id}": {
      "get": {
        "tags": [
          "Contact"
        ],
        "summary": "Get an Contact from the ERP system that matches the given unique ID.",
        "description": "Gets a Contact by unique ID.\n\n## Supported ERPs\n - M1\n - JobBOSS²\n - Macola\n## Features by Field\nField       |Supported ERPs\n------------|------------\nuniqueID||M1, JobBOSS², Macola\nrowVersion||M1, JobBOSS², Macola\ncontactID||M1, JobBOSS², Macola\nname||M1, JobBOSS², Macola\norganizationID||M1, JobBOSS², Macola\norganizationTypes||JobBOSS²\nphoneNumber||M1, JobBOSS², Macola\nemailAddress||M1, JobBOSS², Macola\nisActive||M1, JobBOSS², Macola\ncomments||JobBOSS²\n",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The ID of the contact",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/departments": {
      "get": {
        "tags": [
          "Department"
        ],
        "summary": "Get a list of Employees from the ERP system that match the given filters.",
        "description": "Gets a list of Department.\n\n## Supported ERPs\n - M1\n - JobBOSS²\n - Macola\n - Deacom\n## Resource Features\nFeature     |Supported   |Notes\n------------|------------|------------\nFilter Expressions|**Yes**| \nSort Expressions|**Yes**\nField Selection|**Yes**\nPagination|**Yes**\nUniqueID|uniqueID|\n## Features by Field\nField       |Filterable  |Sortable    |Supported ERPs\n------------|------------|------------|------------\ndeptID|Yes|Yes|M1, JobBOSS², Macola, Deacom\nshortDesc|Yes|Yes|M1, JobBOSS², Macola, Deacom\nuniqueID|Yes|Yes|M1, JobBOSS², Macola, Deacom\nrowVersion|Yes|Yes|M1, JobBOSS², Macola, Deacom\n",
        "parameters": [
          {
            "name": "fields",
            "in": "query",
            "description": "A comma-separated list of fields to include in the result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "A comma-separated list of <a href='#sortexpr'>sort expressions</a>.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "take",
            "in": "query",
            "description": "Limit the number of results being returned",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "skip",
            "in": "query",
            "description": "The number of results to skip. Combine with 'take' to fetch records in pages",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "<a href='#countparam'>Data and count</a> response behavior ",
            "schema": {
              "maximum": 2,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "See <a href='#filterexpr'>Filter Expressions</a> for query string syntax. The Test UI and any generated code tool may expose filter parameters as a dictionary of name/value pairs, but if creating a raw HTTP request, they must be provided on the querystring as defined in the Filter Expression section.",
            "style": "form",
            "schema": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "examples": {
              "Empty": {
                "description": "No filters applied"
              },
              "Example #1": {
                "description": "A dictionary of name/value pairs that will be serialized as querystring parameters in the format ```name[operator]=value```",
                "value": {
                  "deptID[eq]": "abc123",
                  "shortDesc[eq]": "abc123",
                  "uniqueID[eq]": "cc90686b-399e-4094-b431-fa462f84b0a8",
                  "rowVersion[gte]": 123
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/DepartmentListResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DepartmentListResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/DepartmentListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/departments/{id}": {
      "get": {
        "tags": [
          "Department"
        ],
        "summary": "Get a Department from the ERP system that matches the given unique ID.",
        "description": "Gets a Department by unique ID.\n\n## Supported ERPs\n - M1\n - JobBOSS²\n - Macola\n - Deacom\n## Features by Field\nField       |Supported ERPs\n------------|------------\ndeptID||M1, JobBOSS², Macola, Deacom\nshortDesc||M1, JobBOSS², Macola, Deacom\nuniqueID||M1, JobBOSS², Macola, Deacom\nrowVersion||M1, JobBOSS², Macola, Deacom\n",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The ID of the Department",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Department"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Department"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Department"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/employees": {
      "get": {
        "tags": [
          "Employee"
        ],
        "summary": "Get a list of Employees from the ERP system that match the given filters.",
        "description": "Gets a list of Employee.\n\n## Supported ERPs\n - M1\n - JobBOSS²\n - Macola\n - Deacom\n## Resource Features\nFeature     |Supported   |Notes\n------------|------------|------------\nFilter Expressions|**Yes**| \nSort Expressions|**Yes**\nField Selection|**Yes**\nPagination|**Yes**\nUniqueID|uniqueID|\n## Features by Field\nField       |Filterable  |Sortable    |Supported ERPs\n------------|------------|------------|------------\nemployeeID|Yes|Yes|M1, JobBOSS², Macola, Deacom\nfirstName|Yes|Yes|M1, JobBOSS², Macola, Deacom\nlastName|Yes|Yes|M1, JobBOSS², Macola, Deacom\ntitle|Yes|Yes|M1, JobBOSS², Macola, Deacom\nsupervisorEmployeeID|Yes|Yes|M1, JobBOSS², Macola, Deacom\npayRate|Yes|Yes|M1, JobBOSS², Macola, Deacom\ndeptID|Yes|Yes|M1, JobBOSS², Macola, Deacom\nshiftID|Yes|Yes|M1, JobBOSS², Macola, Deacom\nisActive|Yes|Yes|JobBOSS², Deacom\nuniqueID|Yes|Yes|M1, JobBOSS², Macola, Deacom\nrowVersion|Yes|Yes|M1, JobBOSS², Macola, Deacom\n",
        "parameters": [
          {
            "name": "fields",
            "in": "query",
            "description": "A comma-separated list of fields to include in the result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "A comma-separated list of <a href='#sortexpr'>sort expressions</a>.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "take",
            "in": "query",
            "description": "Limit the number of results being returned",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "skip",
            "in": "query",
            "description": "The number of results to skip. Combine with 'take' to fetch records in pages",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "<a href='#countparam'>Data and count</a> response behavior ",
            "schema": {
              "maximum": 2,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "See <a href='#filterexpr'>Filter Expressions</a> for query string syntax. The Test UI and any generated code tool may expose filter parameters as a dictionary of name/value pairs, but if creating a raw HTTP request, they must be provided on the querystring as defined in the Filter Expression section.",
            "style": "form",
            "schema": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "examples": {
              "Empty": {
                "description": "No filters applied"
              },
              "Example #1": {
                "description": "A dictionary of name/value pairs that will be serialized as querystring parameters in the format ```name[operator]=value```",
                "value": {
                  "employeeID[eq]": "abc123",
                  "firstName[eq]": "abc123",
                  "lastName[eq]": "abc123",
                  "title[eq]": "abc123",
                  "supervisorEmployeeID[eq]": "abc123",
                  "payRate[gte]": 123,
                  "deptID[eq]": "abc123",
                  "shiftID[eq]": "abc123",
                  "isActive[eq]": true,
                  "uniqueID[eq]": "cc90686b-399e-4094-b431-fa462f84b0a8",
                  "rowVersion[gte]": 123
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeListResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeListResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/employees/{id}": {
      "get": {
        "tags": [
          "Employee"
        ],
        "summary": "Get an Employee from the ERP system that matches the given unique ID.",
        "description": "Gets a Employee by unique ID.\n\n## Supported ERPs\n - M1\n - JobBOSS²\n - Macola\n - Deacom\n## Features by Field\nField       |Supported ERPs\n------------|------------\nemployeeID||M1, JobBOSS², Macola, Deacom\nfirstName||M1, JobBOSS², Macola, Deacom\nlastName||M1, JobBOSS², Macola, Deacom\ntitle||M1, JobBOSS², Macola, Deacom\nsupervisorEmployeeID||M1, JobBOSS², Macola, Deacom\npayRate||M1, JobBOSS², Macola, Deacom\ndeptID||M1, JobBOSS², Macola, Deacom\nshiftID||M1, JobBOSS², Macola, Deacom\nisActive||JobBOSS², Deacom\nuniqueID||M1, JobBOSS², Macola, Deacom\nrowVersion||M1, JobBOSS², Macola, Deacom\n",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The ID of the Employee",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Employee"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Employee"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Employee"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.1/gl-codes": {
      "get": {
        "tags": [
          "GLCode"
        ],
        "summary": "Get a list of GLCodes  from the ERP system that match the given filters.",
        "description": "Gets a list of GLCode.\n\n## Supported ERPs\n - JobBOSS²\n## Resource Features\nFeature     |Supported   |Notes\n------------|------------|------------\nFilter Expressions|**Yes**| \nSort Expressions|**Yes**\nField Selection|**Yes**\nPagination|**Yes**\nUniqueID|uniqueID|\n## Features by Field\nField       |Filterable  |Sortable    |Supported ERPs\n------------|------------|------------|------------\ndescription|<span style='color:red'>No</span>|Yes|JobBOSS²\nglCodeID|Yes|Yes|JobBOSS²\nrowVersion|Yes|Yes|JobBOSS²\nuniqueID|Yes|Yes|JobBOSS²\nisActive|Yes|Yes|JobBOSS²\n",
        "parameters": [
          {
            "name": "fields",
            "in": "query",
            "description": "A comma-separated list of fields to include in the result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "A comma-separated list of <a href='#sortexpr'>sort expressions</a>.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "take",
            "in": "query",
            "description": "Limit the number of results being returned",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "skip",
            "in": "query",
            "description": "The number of results to skip. Combine with 'take' to fetch records in pages",
            "schema": {
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "<a href='#countparam'>Data and count</a> response behavior ",
            "schema": {
              "maximum": 2,
              "minimum": 0,
              "type": "integer"
            }
          },
          {
            "name": "filters",
            "in": "query",
            "description": "See <a href='#filterexpr'>Filter Expressions</a> for query string syntax. The Test UI and any generated code tool may expose filter parameters as a dictionary of name/value pairs, but if creating a raw HTTP request, they must be provided on the querystring as defined in the Filter Expression section.",
            "style": "form",
            "schema": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "examples": {
              "Empty": {
                "description": "No filters applied"
              },
              "Example #1": {
                "description": "A dictionary of name/value pairs that will be serialized as querystring parameters in the format ```name[operator]=value```",
                "value": {
                  "glCodeID[eq]": "abc123",
                  "rowVersion[gte]": 123,
                  "uniqueID[eq]": "cc90686b-399e-4094-b431-fa462f84b0a8",
                  "isActive[eq]": true
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/GLCodeListResponse"
  

# --- truncated at 32 KB (723 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/eci-solutions/refs/heads/main/openapi/eci-solutions-erp-v2-1-openapi.json