Package Information
Available Nodes
Documentation generating…
Documentation
n8n-nodes-fulfillmenttools
This is an n8n community node package for the
fulfillmenttools REST API. It lets you manage
your fulfillmenttools tenant directly from n8n workflows.
Installation · Operations · Trigger · Credentials · Development · Resources
Installation
Follow the
community nodes installation guide
and use the package name @fulfillmenttools/n8n-nodes-fulfillmenttools.
Unverified community nodes can only be installed on self-hosted n8n. On n8n
Cloud the package must first be published and verified by n8n.
Operations
Facility
- Create Managed Facility (
POST /api/facilities) — creates aMANAGED_FACILITY. Required: name and address (company name, street, city,
postal code, country). Optional: contact, phone/email addresses, picking
methods, services, picking times, scanning rules, closing days, tags,
operative cost, coordinates/time zone, and additional fields (tenant facility
ID, status, location type, capacity, fulfillment buffer, custom attributes). - Create Supplier Facility (
POST /api/facilities) — creates aSUPPLIER.
Required: name, company name, country. Optional: address details,
phone/email addresses, tags, operative cost, status, tenant facility ID,
custom attributes. - Get (
GET /api/facilities/{id}) — retrieves a single facility. Select it
From list or By ID (a facility ID or atenantFacilityIdURN). Supports
Simplify. - Get Many (
GET /api/facilities) — retrieves many facilities with optional
filters (order by, status, type, tenant facility ID), Return All /
Limit, and Simplify. - Search (
POST /api/facilities/search) — condition builder over the fullFacilitySearchQuery: ID, name, tenant facility ID, status, type, location
type, every address and contact field, service, tags, and the key of a
connected carrier. Sort by name, status, type, location type, last modified,
city/country/postal code, service or a custom attribute. See
Search operations. - Update (
PATCH /api/facilities/{id}) — updates a facility. Requires the
current Version (optimistic locking — get it first with Get). Exposes
the common scalar fields plus structured Address, Contact, Tags,
Picking Methods, Services, Picking Times, Scanning Rules and
Closing Days (the same widgets as Create), plus a raw-JSON field for
advanced properties (configs). - Delete (
DELETE /api/facilities/{id}) — deletes a facility. Optional
Force Deletion to cascade without pre-condition checks. Returns{ "deleted": true }.
Order
- Create (
POST /api/orders) — creates an order. Required: order date and
one or more order line items (tenant article ID, title, quantity, plus
optional scannable codes and custom attributes). Optional: tenant order ID,
consumer (ID, email, addresses, facility ref, tenant facility ID, custom
attributes), status, valid-until (promises), Payment Info (currency,
localized method), Tags, Status Reasons, custom attributes, and a
raw-JSON field for advanced properties (delivery preferences, source,
stickers, custom services, pricing). - Get (
GET /api/orders/{id}) — retrieves a single order. Select it From
list or By ID. Supports Simplify. - Get Many (
GET /api/orders) — retrieves many orders with optional filters
(tenant order ID, consumer ID), Return All / Limit, and Simplify. - Search (
POST /api/orders/search) — condition builder over the fullOrderSearchQuery: tenant order ID, status, order date, every consumer
address field plus consumer ID, delivery preferences (collect facility ref
and paid flag, desired delivery time, service level), order line item article
ID/title, payment method and currency, and tags. Sort by order date or
status. See Search operations. - Update (
PATCH /api/orders/{id}) — updates an order. Requires the current
Version (optimistic locking — get it first with Get). Exposes comment,
preferred handling time, custom attributes, a structured Consumer, and
Order Line Items (the sent set replaces all existing line items), plus a
raw-JSON field for advanced properties (pricing).
Carrier
- Create (
POST /api/carriers) — creates a carrier. Required: key (the CEP
integration, e.g.DHL_V2) and name. Optional: status, logo URL, product
value needed, default parcel dimensions, structured Parcel Label
Classifications (localized name, dimensions, bulky goods) and Credentials
(key plus carrier-specific JSON values), plus a raw-JSON field for any further
advanced properties. - Get (
GET /api/carriers/{id}) — retrieves a single carrier. Select it
From list or By ID. Supports Simplify. - Get Many (
GET /api/carriers) — retrieves many carriers with Return
All / Limit and Simplify. - Update (
PATCH /api/carriers/{id}) — updates a carrier. Requires the
current Version (optimistic locking — get it first with Get). Exposes
name, status, delivery type, lifecycle, logo URL, product value needed and
default parcel dimensions, plus a raw-JSON field for advanced properties.
Facility Carrier Connection
Connects a carrier to a facility (/api/facilities/{facilityId}/carriers). All
operations take a Facility (From list or by ID); get/create/update also take
a Carrier.
- Create (
POST …/carriers/{carrierRef}) — connects a carrier to the
facility. Optional: name, status, structured Valid Delivery Targets,
Cutoff Time (hour/minute), Delivery Areas (country/postal code),
Tags and Parcel Label Classifications (localized name, dimensions,
bulky goods), dedicated Configuration / Credentials JSON fields, plus a
raw-JSON field for the remaining advanced properties (weekday cutoff times). - Get (
GET …/carriers/{carrierRef}) — retrieves a single connection.
Supports Simplify. - Get Many (
GET …/carriers) — retrieves all carrier connections of the
facility. Supports Simplify. - Update (
PUT …/carriers/{carrierRef}) — updates a connection. Requires
the current Version (optimistic locking — get it first with Get).
Exposes name, status and the same structured fields as Create (valid delivery
targets, cutoff time, delivery areas, tags, parcel label classifications,
configuration, credentials), plus a raw-JSON field for advanced properties.
Handover Job
Handover jobs (/api/handoverjobs).
- Get Many (
GET /api/handoverjobs) — retrieves many handover jobs with
optional filters (search term, facility/pick-job/shipment ref, tenant order ID,
assigned user, channel, carrier refs, status, anonymized, and a target-time
range), Return All / Limit, and Simplify. - Get (
GET /api/handoverjobs/{handoverjobId}) — retrieves a single handover
job. Supports Simplify. - Create (
POST /api/handoverjobs) — creates a handover job, covering the
full non-deprecatedHandoverjobForCreationschema. Required: Facility,
Channel (delivery/collect), Order Date, Target Time. Three
structured line-item collections — Handover Job Line Items (with handed-over
quantity, status, refused/substitute JSON), Expected and Missing — each
exposing the article (tenant ID, title, image URL, weight, title-localized,
attributes), quantities, measurement units, scannable codes, tags, recordable
attributes and custom attributes. Plus structured Tags, Assigned Users,
Transfers, full Invoice/Recipient address collections, Parcel
Info (carrier/parcel/shipment refs), Workflow Information, and scalar
additional fields (identifiers, refs, status, cancel reason, paid, custom
attributes), with JSON fields for stickers. - Search (
POST /api/handoverjobs/search) — condition builder over the fullHandoverJobSearchQuery: ID, facility ref, status, channel, anonymized, full/
short identifiers, tenant order ID, pick job ref, assigned users, invoice and
recipient names/emails/companies, line item article ID/title, and parcel
carrier/shipment refs. Sort by target time. See
Search operations. - Update (
PATCH /api/handoverjobs/{handoverjobId}) — updates a handover
job. Requires the current Version. Update Fields (status, custom
attributes) build aModifyHandoverjobaction; extra raw actions can be
appended as JSON.
Inbound
Inbound processes (/api/inboundprocesses).
- Create (
POST /api/inboundprocesses) — creates an inbound process.
Required: facility. Optional: tenant inbound process ID, on hold, scannable
codes, custom attributes, a structured Purchase Order (order date,
requested date, status, supplier) with Purchase Order Line Items (article,
quantity), and a single Receipt (received date, status) with Received
Items (article, accepted/rejected quantity). Multiple receipts remain
available via the raw-JSON field. - Add Receipt (
POST /api/inboundprocesses/{id}/receipts) — adds a goods
receipt to an inbound process: received date, status, ASN ref, comment, and
received items (article, accepted/rejected quantity, storage location). - Get (
GET /api/inboundprocesses/{id}) — retrieves a single inbound
process. Select it From list or By ID. Supports Simplify. - Get Many (
GET /api/inboundprocesses) — retrieves many inbound processes
with optional filters (sort, status, facility ref, scannable code, search
term), Return All / Limit, and Simplify. - Search (
POST /api/inboundprocesses/search) — condition builder over the
fullInboundProcessSearchQuery: ID, tenant inbound process ID, status,
facility ref, inbound date, scannable codes, the purchase order (ID, status,
order date, requested date and type, supplier name, transfer ID, article ID)
and receipts (ID, status, received date). Sort by last modified, purchase
order created/requested date/supplier, or a custom attribute. See
Search operations. - Update (
PATCH /api/inboundprocesses/{id}) — updates an inbound process.
Requires the current Version (optimistic locking — get it first with
Get). Exposes on hold, scannable codes and custom attributes. Returns the
updated process. - Update Purchase Order (
PUT /api/inboundprocesses/{id}/purchaseorder) —
creates or replaces the purchase order of an inbound process. Requires the
current Version (optimistic locking — get it first with Get) and the
same structured Purchase Order / Purchase Order Line Items fields as
Create. Returns the updated process. - Delete (
DELETE /api/inboundprocesses/{id}) — deletes an inbound process.
Returns{ "deleted": true }.
Process
Covers the Processes (Core) endpoints. A process ties together the order, pick
jobs, shipments and returns that belong to one fulfillment. Operations that take
a Process offer it From list (searched by tenant order ID) or By ID.
- Get (
GET /api/processes/{processId}) — retrieves a single process.
Supports Simplify. - Get by Reference (
GET /api/process) — retrieves the process belonging to
a Reference Type (tenant order ID, order, pick job, shipment, handover job
or return ref) and its value. Supports Simplify. - Search (
POST /api/processes/search) — condition builder over the fullProcessSearchQuery: process ID, created date, all the entity refs (order,
pick/pack/handover/service jobs, shipments, returns, routing plans, documents,
external actions, flat refs), the status/operative/DOMS/inventory/return
statuses, tags, a full-text Search Term, and cross-entityreferenced
filters (article ID, service type, target time). Sort by process ID, any
status, active facility name/country, or referenced target time / parcel
tracking status. See Search operations. - Get History Logs (
GET /api/processes/{processId}/historylogs) — retrieves
the process history with optional filters (type, username, facility name,
order by, collapse consecutive duplicates) plus Return All / Limit. - Get Document (
GET …/documents/{documentId}) — retrieves the metadata of a
document attached to the process. Both Process and Document ID are
required, matching the endpoint's two path parameters; a process lists its
documents underdocumentRefs. - Create Document (
POST …/documents) — attaches a document. Requires
Document Type (PDF, PNG, JPG, GIF, JPEG, XML, JSON, ZPL) and Section
(order, pick job, pack job, handover job, parcel, packing target container).
The file is optional and comes from an input Binary Field, a Base64
String, or is omitted entirely; Priority is available under Options. - Update Document File (
PUT …/documents/{documentId}/file) — replaces the
file of a document. Requires the current Version (optimistic locking — get
it first with Get Document) and a file from a binary field or base64. - Download Document File — downloads the file as n8n binary data into the
field named in Put Output File in Field. Look Up By picks the endpoint:
Process and Document (GET …/processes/{processId}/documents/{documentId}/file)
or Document Only (GET /api/documents/{documentId}/file). The two require
different API permissions (DOCUMENT_SET_READvsPROCESS_READ), so pick
whichever your API user is granted. The output file name comes from the
response'scontent-dispositionheader, falling back to the document ID plus
an extension derived from the content type.
Listing
Listings (/api/facilities/{facilityId}/listings and /api/listings). A listing
is uniquely identified by its facility plus tenantArticleId. Operations that
address a single facility offer it From list or By ID.
Get Many (
GET …/facilities/{facilityId}/listings) — retrieves the
listings of a facility with an optional Tenant Article IDs filter,
Return All / Limit, and Simplify.Get (
GET …/listings/{tenantArticleId}) — retrieves a single listing.
Optional Locale resolves localized fields. Supports Simplify.Search (
POST /api/listings/search) — condition builder over the fullListingSearchQuery: ID, tenant article ID, facility ref, status, out-of-stock
behaviour, price and weight (numeric operators), measurement unit key, category
refs, tags, created and availability-timeframe dates. Sort by tenant article
ID, last modified, or a custom attribute. See Search operations.Update (
PATCH …/listings/{tenantArticleId}) — updates a single listing.
Requires the current Version (optimistic locking — get it first with
Get). The Update Fields collection is wrapped in oneModifyListing
action; extra raw actions can be appended as JSON.Create and Update per Facility (
PUT …/facilities/{facilityId}/listings) —
creates or replaces the listings of one facility. The Listings collection
takes one entry per listing (tenant article ID required, plus the shared
fields and an optional version).Every listing (here and in Create and Update and Update) exposes the
full non-deprecatedListingForCreationschema as proper form fields: scalars
(title, status, image URL, measurement unit key, out-of-stock behaviour, legal
HS code), comma-separated lists (category refs, scannable codes), structured
Tags (ID + value), Title Localized (locale + value translations),
Attributes (key, value, type, category, priority), Scanning Rules
(type + priority), Stock Properties (key, input type, required, default),
Recordable Attributes (localized key, recording rule, value — not on bulk),
Stock Available Until (calculation base + modifier), and the Alpha
out-of-stock config (preorder availability start, restockable-in-days, plus a
JSON field for the by-context behaviours). Custom Attributes stays JSON (it
is free-form), and an Additional Fields (JSON) hatch covers anything else.Create and Update (
PUT /api/listings) — bulk upserts listings independent
of facility. Each Listings entry needs a tenant article ID and title, and a
Targeting Strategy: Single Facility (a facility ref or tenant facility ID
plus optional version) or Multi Selector (a JSON array of facility selectors).
Entries times selectors must not exceed 25.Delete (
DELETE …/listings/{tenantArticleId}) — deletes a single listing.
Returns{ "deleted": true }.
Pick Job
Picking (Operations) endpoints — pick jobs, their delivery notes, and pick runs.
- Get Many (
GET /api/pickjobs) — retrieves many pick jobs with optional
filters (search term, facility/order ref, tenant order ID, assigned user,
consumer name, channel, status, and order-date / target-time ranges),
Return All / Limit, and Simplify. - Get (
GET /api/pickjobs/{pickJobId}) — retrieves a single pick job.
Supports Simplify. - Create (
POST /api/pickjobs) — creates a pick job, covering the full
non-deprecatedPickJobForCreationschema. Required: Facility, Order
Date, and one or more Pick Line Items. Each line item exposes the article
(tenant ID, title, image URL, weight, structured Title Localized and
Article Attributes), quantity and secondary quantity, measurement unit keys,
global line item ID, scannable codes, structured Tags and Recordable
Attributes, and dedicated JSON fields for the deep structures (allowed
substitutes, partial stock locations, measurement validation, stickers).
Top-level: order/tenant-order refs, short ID, status, operative process ref,
routing plan ref, process ID, preferred picking methods, payment currency,
picking start-latest-at, custom attributes, structured Tags, Assigned
Users (by ID or username) and Transfers, plus named JSON fields for
Delivery Information, Expected Pick Line Items, Stickers and
Workflow Information. - Search (
POST /api/pickjobs/search) — condition builder over the fullPickJobSearchQuery: ID, facility/order ref, tenant order ID, consumer name,
status, preferred picking method, tenant article ID, transfer ID, and the
created / last-modified / target-time dates. Sort by created, last modified,
target time or tenant order ID. See Search operations. - Get Delivery Note (
GET /api/pickjobs/{pickJobId}/deliverynote) —
downloads the delivery-note PDF as n8n binary data into the field named in
Put Output File in Field. Optional Locale. - Get Pick Run (
GET /api/pickruns/{pickRunId}) — retrieves a single pick
run. - Create Pick Run (
POST /api/pickruns) — creates a pick run. Required:
Facility and comma-separated Pick Job Refs. Optional pick run type
(batch / multi order) and status. - Update Pick Run (
PATCH /api/pickruns/{pickRunId}) — modifies pick-run
line items. Requires the current Version; each Line Item Modification
(line item ID, picked / secondary-picked quantities, status) becomes aModifyPickRunLineItemaction, and extra raw actions can be appended as JSON. - Update Pick Run Pick Jobs (
PATCH /api/pickruns/{pickRunId}/pickjobs) —
removes a pick job from a pick run. Requires the current Version and the
Pick Job Ref to Remove; returns the updated pick run.
Pack Job
Packing (Operations) endpoints — pack jobs and their documents.
- Get Many (
GET /api/packjobs) — retrieves many pack jobs with optional
filters (search term, facility/order/pick-job ref, process ID, tenant order ID,
short ID, article title, assigned/modified-by user, channel, source container
codes, status, anonymized, and order-date / target-time ranges), Return All
/ Limit, and Simplify. - Get (
GET /api/packjobs/{packJobId}) — retrieves a single pack job.
Supports Simplify. - Create (
POST /api/packjobs) — creates a pack job, covering the full
non-deprecatedPackJobForCreationschema. Required: Facility, one or more
Line Items, and Workflow Information (defaults to not part of a
workflow). Each line item exposes the article (tenant ID, title, image URL,
weight, structured Title Localized and Article Attributes, custom
attributes), quantities and measurement units, global line item ID, scannable
codes, service job refs, structured Tags and Recordable Attributes, and
JSON fields for stickers. Top-level: order/pick-job/process refs, tenant order
ID, short ID, recipient name, status, delivery channel, order date, target time,
operative process ref, custom attributes, structured Tags, Assigned
Users, Transfers, and full Invoice/Recipient address collections
(street, city, coordinates, phone numbers, etc.). - Search (
POST /api/packjobs/search) — condition builder over the fullPackJobSearchQuery: ID, facility ref, status, short ID, tenant order ID,
invoice and recipient names/emails/companies, line item article ID/title,
packing source container codes, and order-date / last-modified / target-time
dates. Sort by last modified, order date or target time. See
Search operations. - Update (
PATCH /api/packjobs/{packJobId}) — updates a pack job. Requires
the current Version. Update Fields (status, custom attributes) build aModifyPackJobaction; Line Item Modifications (line item ID + packed)
buildModifyPackLineItemactions; Pause Pack Job adds aPausePackJob
action with optional packed-amount updates; and extra raw actions can be
appended as JSON. - Get Delivery Note (
GET …/deliverynote), Get Return Note
(GET …/returnnote), Get Transfer Label (GET …/transferlabel) — download
the respective PDF as n8n binary data into the field named in Put Output File
in Field.
Shipment
Covers both parcels and shipments (Shipping endpoints). All PDF downloads land in
the binary field named in Put Output File in Field.
Parcels:
- List Parcels (
GET /api/parcels) — retrieves many parcels with Return
All / Limit and Simplify. - Get Parcel (
GET /api/parcels/{parcelId}) — retrieves a single parcel. - Create Parcel (
POST /api/shipments/parcels) — creates a standalone
parcel, covering the full non-deprecatedParcelForCreationschema: Items
(article + description), structured Invoice/Recipient addresses,
Dimensions, Services (11 flags), Pick-Up Information, Transfers,
scalar fields (carrier ref/product, product value + currency + type, payment
currency, short ID, status, tenant/parcel IDs, load unit refs, shipping
container number), and JSON fields for sender, return address and result. - Create Shipment Parcel (
POST /api/shipments/{shipmentId}/parcels) — the
same parcel fields for an existing shipment (carrier ref is ignored here). - Update Parcel (
PATCH /api/parcels/{parcelId}) —ModifyParcel(status,
carrier product, product values, dimensions, services, pick-up info, result)
plus aModifyParcelLoadUnitaction from Load Unit Refs; extra raw actions
as JSON. - Search Parcels (
POST /api/parcels/search) — condition builder overParcelSearchQuery(ID, carrier/facility/shipment refs, status, short ID,
tenant order ID, invoice/recipient names, item article, carrier tracking
number, dates). See Search operations. - Get Parcel Delivery Note / Label / Return Note / Transfer Label
(GET /api/parcels/{parcelId}/{deliverynote|labels/{type}|returnnote|transferlabel})
— PDF downloads. The label operation adds a Label Document picker (send /
return / customs / all, PDF or ZPL).
Shipments:
- List Shipments (
GET /api/shipments) — retrieves many shipments with
filters (search term, facility/carrier/pick-job refs, carrier keys, status,
parcel status, tenant order ID, target-time range, anonymized), Return All
/ Limit and Simplify. - Get Shipment (
GET /api/shipments/{shipmentId}) — retrieves a single
shipment. - Create Shipment (
POST /api/shipments) — creates a shipment, covering the
full non-deprecatedShipmentForCreationschema: required facility, order date
and target time; Line Items (article, tags, recordable attributes),
structured Invoice/Postal/Target addresses, Transfers, Tags,
scalar fields, and JSON fields for source address and carrier services. - Update Shipment (
PATCH /api/shipments/{shipmentId}) —ModifyShipment
(status, carrier ref/product, pick job ref, payment currency, target address);
extra raw actions as JSON. - Search Shipments (
POST /api/shipments/search) — condition builder overShipmentSearchQuery(ID, carrier key/ref, facility/pick-job refs, status,
parcel status, tenant order ID, anonymized, dates). See
Search operations. - Get Shipment Delivery Note (
GET /api/shipments/{shipmentId}/deliverynote)
— PDF download.
Return notes:
- Create Return Note (
POST /api/returnnotes) — required order information
and Items (title, quantity, substitutes); optional company and delivery
addresses, QR code content, and a JSON field for typed delivery addresses.
Return
Item return jobs and item returns (Returns (Operations) endpoints).
- List Item Return Jobs (
GET /api/itemreturnjobs) — retrieves many item
return jobs with filters (facility ID, job/return scannable codes, job/return
status, search term, anonymized), Return All / Limit and Simplify. - Create Item Return Job (
POST /api/itemreturnjobs) — creates an item
return job, covering the fullItemReturnJobForCreationschema. Required:
Origin Facility Refs, Status, at least one Consumer Address, and at
least one Returnable Line Item. Line items expose the article (tenant ID,
title, image URL, weight, localized title, attributes), delivered quantity,
global line item ID, scannable codes, service job refs and recordable
attributes. Also Not Returnable Line Items and scalar fields. - List Item Returns (
GET …/{jobId}/itemreturns) — retrieves the item
returns of a job. Supports Simplify. - Create Item Return (
POST …/{jobId}/itemreturns) — adds an item return.
Requires the current Item Return Job Version, Return Facility Ref,
Status, and Returned Line Items (line item ref, status, tenant article
ID, localized item condition, decision reason, scanned codes, recordable
attributes, and a JSON field for reasons). - Get Item Return (
GET …/itemreturns/{itemReturnId}) — retrieves a single
item return. Supports Simplify. - Update Returned Line Items (
PUT …/returnedlineitems) — replaces the
returned line items of an item return. Requires the job version and the same
Returned Line Items collection. - Update Returned Line Item (
PATCH …/returnedlineitems/{id}) — updates a
single returned line item. Requires the job version; Update Fields exposes
status, localized decision reason + comment, and a refund (status plus either a
percent or a value + currency). - Get Item Returns (
GET /api/itemreturns) — retrieves many item returns
across jobs with filters (search term, item-return and line-item status, order
by, facility refs, anonymized), Return All / Limit and Simplify.
Routing Plan
Routing plans (Routing Plans (DOMS) endpoints). All read-only.
- List (
GET /api/routingplans) — retrieves routing plans, optionally
filtered by an Order Ref. Supports Simplify. - Get (
GET /api/routingplans/{id}) — retrieves a single routing plan by ID.
Supports Simplify. - Search (
POST /api/routingplans/search) — condition builder over the fullRoutingPlanSearchQuery: order/pick-job refs, process ID, priority, split
count, reroute reason, status, order date, provisioning time, delivery
preferences (collect facility/paid, preferred/supplying facilities, target
time), earliest/latest picking start (carrier ref + date), order line item ID,
target address (city/country/province/street) and history created date. Sort by
order date/ref, process ID, provisioning time, status or anonymized. See
Search operations. - List Graphs (
GET /api/routingplansgraph) — retrieves the routing plans
graph ({ nodes, edges }) for a process, optionally filtered by a Process
Ref.
Service
Covers service jobs and linked service jobs (Services endpoints).
- List Service Jobs (
GET /api/servicejobs) — retrieves many service jobs
with filters (facility ref, status, channel, target-time range, order by,
search term, assigned user), Return All / Limit and Simplify. - Get Service Job (
GET /api/servicejobs/{serviceJobId}) — retrieves a
single service job. - Create Service Job (
POST /api/servicejobs) — creates a service job,
covering the fullServiceJobForCreationschema. Required: Facility and
Target Time. Structured Line Items and Required Line Items (article,
quantities, measurement units, recordable attributes), Additional
Information (ref/tenant ref + typed value), Assigned Users, and scalar
fields (custom service ref, tenant custom service ID, service job link ref,
process refs, short ID, tenant order ID, custom attributes). - List Linked Service Jobs (
GET /api/linkedservicejobs) — retrieves many
linked service jobs groups with filters (facility IDs, status, channel,
target-time range, order by, search term, modified-by user), Return All /
Limit and Simplify. - Get Linked Service Jobs (
GET /api/linkedservicejobs/{id}) — retrieves a
single group. - Create Service Job Link (
POST …/{id}/servicejoblinks) — adds a service
job (by Service Job Ref) to a linked service jobs group. - Create Nested Service Job Link (
POST …/{id}/servicejoblinks/{linkId}) —
adds a service job link nested under an existing link. - Search Linked Service Jobs (
POST /api/linkedservicejobs/search) —
condition builder overLinkedServiceJobsSearchQuery(ID, facility ref,
status, channel, consumer name, invoice/shipping address, article titles,
service name, additional information, linked ref, tenant order ID, last
modified, target time). See Search operations.
Custom services:
- List Custom Services (
GET /api/customservices) — retrieves many custom
services with an optional Tenant Custom Service ID filter, Return All /
Limit and Simplify. - Get Custom Service (
GET /api/customservices/{id}) — retrieves a single
custom service. - Create Custom Service (
POST /api/customservices) — creates a custom
service, covering the fullCustomServiceForCreationschema. Required:
localized Name, Status (active/inactive), and Items Required
(mandatory/none). Optional localized Description, structured Additional
Information (localized name/description, value type, mandatory flag, tenant
ID), execution time, image refs, items-returnable flag, tenant custom service
ID and custom attributes. - Update Custom Service (
PATCH /api/customservices/{id}) — updates a custom
service (viaCustomServiceForUpdate). Requires the current Version;
Update Fields exposes localized name/description, status, items required,
items returnable, execution time, tenant custom service ID and custom
attributes. - List Facility Custom Services (
GET /api/facilities/{facilityId}/customservices)
— retrieves the custom services connected to a facility, with Return All /
Limit and Simplify. - Get Facility Custom Service
(GET /api/facilities/{facilityId}/customservices/{customServiceId}) —
retrieves a single facility custom service connection.
Search operations
Facility, Order, Inbound, Process, Listing, Pick Job, Pack Job, Handover Job,
Shipment (parcels and shipments), Service (linked service jobs) and Routing Plan
each have a Search operation backed by the fulfillmenttools search API
(POST /api/{entity}/search), which is far more expressive than the fixed Get
Many filters. They share the
same UI:
Match — whether results must satisfy all conditions (
and) or any of them
(or).Conditions — repeatable Field → Operator → Value rows. The field list
is the resource's full queryable schema, and both the operator list and the
value widget adapt to the field you pick:Field type Operators Value widget Text Equals, Not Equals, Is One Of, Is Not One Of text Text (searchable) the above plus Matches Regex text Fixed values Equals, Not Equals, Is One Of multi-select Full-text Matches Regex text True/false Equals, Not Equals toggle Number Equals, Not Equals, Is One Of, Is Not One Of, Greater/Less Than (or Equal) text Date Equals, Not Equals, Before, After, On or Before, On or After, Relative date or -P1DFor Is One Of / Is Not One Of, separate text values with commas. The
relative date operators take an ISO-8601 duration relative to now (-P1Dfor
yesterday,P1Wfor next week).Custom Attribute Conditions — query free-form
customAttributesby name,
with a type (string, number, boolean, date) and a comparison operator. Names
containing a period or starting with$are rejected, as the API requires.
Not shown for Process, whose query schema has no custom attributes.Sort — one sort rule (field + direction), which is all the API accepts.
Return All / Limit — results are cursor-paginated via
pageInfo.endCursorbehind the scenes; Limit stops early.Simplify — same reduced output as Get / Get Many.
Additional Query Fields (JSON) — raw JSON merged into the query for
anything not exposed above, such as nestedand/orgroups or map-valued
filters (stock properties, localized titles).
Unsupported operator/field combinations (for example Matches Regex on a field
the API models as an exact-match string) are rejected before the request with an
error naming the parameter.
Trigger
The fulfillmenttools Trigger node starts a workflow when a tenant event is
delivered to its webhook. On activation it registers a WEBHOOK subscription in
fulfillmenttools (POST /api/subscriptions); on deactivation it removes the
subscription. Pick one Event to subscribe to and optionally name the
subscription.
Supported events span order, pick job, pack job, stow job, handover job,
shipment, parcel, routing plan, return, inventory/stock, listing, storage
location, inbound delivery/process, facility, facility group, service job,
expiry entity, external action, process, and user lifecycle events — see the
node's Event dropdown for the full list. See the
fulfillmenttools eventing docs
for details.
Webhook triggers need a callback URL reachable from fulfillmenttools. On n8n
Cloud this is automatic. For local development, expose n8n with a public URL
(the bundlednpm run dev:localstarts a Cloudflare tunnel and wiresWEBHOOK_URL).
Credentials
fulfillmenttools authenticates against Google Identity Platform. The node
exchanges your API user credentials for a short-lived JWT and sends it as aBearer token on every request. n8n refreshes the token automatically when it
expires.
Create a fulfillmenttools API credential with:
| Field | Description |
|---|---|
| API Base URL | https://<tenant>.api.fulfillmenttools.com (no trailing slash) |
| Auth Key | The Google Identity Platform API key (AUTHKEY) provided for your tenant |
| Username (Email) | Email address of the API user (e.g. user@ocff-<tenant>-<env>.com) |
| Password | Password of the API user |
n8n tests the credential by calling GET /api/facilities.
Compatibility
Built and tested against the current n8n community node tooling
(@n8n/node-cli). Requires Node.js 20.15 or later.
Development
This package uses the official n8n-node CLI:
npm install # install dependencies
npm run dev # official runner (starts n8n via npx n8n@latest)
npm run build # compile + bundle assets into dist/
npm run lint # run the n8n node lint rules (add :fix to autofix)
npm test # build, then validate the built node descriptions
npm run scan # run n8n's approval scanner against the working tree
npm run verify # the full release gate: lint + test + scan
npm run release # verify, then changelog, tag and publish to npm
Before releasing
npm run verify is the gate that decides whether n8n will approve the release.
CI runs it on every push and pull request, and npm run release runs it before
touching the version.
The important part is npm run scan. It executes n8n's own approval scanner
(@n8n/scan-community-package) locally, against both the sources and the packed
tarball. The scanner ignores eslint-disable comments, so npm run lint can
pass while the review fails — that is exactly what happened to 1.2.0. Never
silence an n8n lint rule with a disable comment; fix the code instead.
npm provenance is the one check that needs a published version, so the publish
workflow runs the real scanner CLI against the release right after it lands and
fails the run if it would be rejected.
Local run helper (dev:local)
If npm run dev fails to start n8n in your environment (recent Node versions
crash npx n8n@latest), use the bundled helper instead. In one command it:
links this package into n8n's custom-extensions folder, builds, watches
TypeScript for hot reload, starts a Cloudflare tunnel, and starts a
globally-installed n8n (npm install -g n8n@1) wired to the tunnel URL:
npm run dev:local # link + build + watch + tunnel + n8n
npm run dev:local:no-tunnel # same, without the tunnel (action nodes only)
The tunnel (on by default) needs cloudflared (brew install cloudflared) and
gives fulfillmenttools a public callback URL so the Trigger node can receive
events. The URL is printed on startup and changes each run — re-activate
trigger workflows after restarting. If cloudflared isn't installed,dev:local still starts n8n, just without the tunnel. Stop with Ctrl+C.
Extending the package
Adding a new resource is a three-step pattern:
- Add a description file under
nodes/Fulfillmenttools/descriptions/exporting
the resource's operations and fields (seeFacilityDescription.ts). - Re-export it from
descriptions/index.tsand register the resource option inFulfillmenttools.node.ts. - Add a branch to the
executerouter that builds the request body and callsfulfillmenttoolsApiRequest.
All requests share the authenticated fulfillmenttoolsApiRequest helper inGenericFunctions.ts. For list endpoints use fulfillmenttoolsApiRequestAllItems
(startAfterId paging); for the POST /api/{entity}/search endpoints usefulfillmenttoolsSearchRequest, which handles the pageInfo.endCursor cursor
paging and an optional result limit.
Binary downloads (the …/file endpoints) use fulfillmenttoolsApiRequestFile,
which returns the raw bytes plus the response headers so the caller can build
n8n binary data with a sensible file name and MIME type.
Adding a Search operation to a resource needs no new UI or request code:
describe its queryable fields and sort keys once in SearchConfigs.ts, then
export createSearchFields(<config>) from descriptions/SearchDescription.ts
and register the config in searchConfigs. SearchFunctions.ts turns the same
registry into the request body, and the node's execute router dispatches everysearch operation through it.