Skip to main content
Step-by-step guide

Push orders in over the API

Create an API key and post structured orders from an ERP or automation tool. JSON, not files.

about 15 minutes

Check this is the right channel before you build anything

The inbound order API takes JSON, not files. It expects an order that has already been broken into fields: a purchase-order number, a supplier, and a lines array.

That is the whole distinction, and getting it wrong costs an afternoon:

  • Your ERP or procurement tool can emit the order as data → this guide.
  • What you have is a CSV, XLSX, PDF, or XML/EDI document → send the document instead, so ProcuLink parses it: by email, from an SFTP folder, from S3 or R2, or by hand. Posting a file to this endpoint will not work.

You know which of the two shapes you have, and you are on the right guide.

Create an API key

Open Settings → API keys. That tab is where the credential is made — one per integration, so you can revoke one without breaking the rest.

Press + Create key. A Create new key form opens; give it a name that says where it will be used — the field suggests Production integration or Staging webhook — and press Create key.

The key appears once, under Copy your new API key now, and the dialog says so plainly: it cannot be retrieved again after you close it. Copy it into your secret store before you do anything else.

The API section of Settings showing the ingress endpoint URL, the X-ProcuLink-Key header note, and the API keys table with a Create new key form.
Settings → API. The ingress endpoint at the top is the URL you post to; the key is created below it.

Above the key list, Your ingress endpoint shows the exact URL for your workspace. It ends in your workspace slug — the same slug as your inbound email address:

https://api.proculink.eu/api/ingress/{slug}/orders

Authentication is a header, not a bearer token in the usual Authorization form:

X-ProcuLink-Key: plk_your_key_here

If this fails

If you close the dialog before copying, the key is gone — there is no way to reveal it again, by design. Revoke it and create another. That is a 30-second fix, and it is safer than any scheme that would let a secret be re-read.

Prove the key works before you send any data

Test the credential on its own, so that a failure later is unambiguous:

curl -i https://api.proculink.eu/api/ingress/{slug}/ping -H "X-ProcuLink-Key: plk_your_key_here"

A small OK payload means the key is valid and belongs to that workspace slug. Do this first — almost every "the API doesn't work" report turns out to be a slug and key that do not belong together.

If this fails

401 or 403 means the key is missing, mistyped, or issued for a different workspace than the slug in the URL. Check both halves. A trailing newline copied along with the key is a common culprit.

Post one real order

Now send an actual order. supplierId and at least one line are required; supplierId accepts either the supplier's GUID or its exact name as spelled in your workspace.

curl -X POST https://api.proculink.eu/api/ingress/{slug}/orders \
  -H "X-ProcuLink-Key: plk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "orderNumber": "PO-10432",
    "orderDate": "2026-07-04",
    "currency": "EUR",
    "supplierId": "Acme Components",
    "lines": [
      {
        "buyerItemCode": "WIDGET-BLUE-M",
        "description": "Blue widget, medium",
        "quantity": 24,
        "unit": "EA",
        "unitPrice": 4.5
      }
    ]
  }'

Two details that cause most of the 400s: quantity and unitPrice are numbers, not strings, and orderDate is an ISO date (YYYY-MM-DD).

A success returns the created order so you can log it:

{ "id": "6f2a1c9e-1b7a-4d0e-9f3a-2c5b8e0a1d44", "status": "needs_review", "linesCount": 1 }

The order is in your Inbox with that id, ready for review — and your integration has an id it can store against its own record.

If this fails

400 "Order must have at least one line."lines is empty or missing. 400 "Supplier … not found." — the GUID or name does not match a supplier in this workspace; create the supplier first, and check for a trailing space in the name. Every field is listed in the inbound order API schema reference.

Make a repeat harmless

Automation platforms deliver at-least-once. Sooner or later the same order arrives twice, and you do not want two purchase orders going to the supplier.

Send an Idempotency-Key header with a value that is stable for that order — your own order id is ideal:

Idempotency-Key: erp-order-88213

A repeat within 24 hours returns the original order, marked idempotentReplay: true, instead of creating a second one. If you omit the header entirely, ProcuLink still derives a key from the slug, the PO number, and the line shape, so a verbatim retry is de-duplicated — but an explicit key is better, because it survives a retry that changes an unimportant field.

Your integration can retry safely, and a duplicate delivery from the platform is a no-op rather than a second order to the supplier.

Connect it to Zapier or Make, if that is your route

Neither tool needs a dedicated ProcuLink app — the generic Webhooks action does it:

  • Method POST, URL https://api.proculink.eu/api/ingress/{slug}/orders
  • Header X-ProcuLink-Key with your key
  • Header Idempotency-Key mapped to the trigger's own record id
  • The JSON body from step 4 as the raw payload, with your trigger's fields mapped into orderNumber, supplierId, and each line

If this fails

If the platform sends the body as form data rather than raw JSON, the endpoint rejects it. Look for the "custom request" or "raw body" option in the action and set the content type to application/json explicitly.

Confirm what a 2xx actually means

A 2xx from this endpoint means ProcuLink accepted and stored the order. It does not mean a supplier accepted anything — the order still goes through review and delivery like any other, and delivery reports its own separate result.

So after the first few automated orders, check the Inbox rather than your integration's logs:

  • Orders appear with the right purchase-order numbers and line counts.
  • Nothing is piling up unreviewed. If lines routinely need fixing, the supplier's catalog is probably missing — see import a supplier catalog.

Orders arrive by themselves from the system that already knows about them, and the only ones that need a person are the ones that genuinely need a decision.