# List All Transactions Source: https://docs.procuros.io/en/api/v2/all-transactions/list-all-transactions /en/api/v2/openapi-v2.yaml get /v2/all-transactions List all existing transactions to and from your trade partners. # Show Transaction Source: https://docs.procuros.io/en/api/v2/all-transactions/show-transaction /en/api/v2/openapi-v2.yaml get /v2/all-transactions/{procurosTransactionId} Show a single transaction. # Basics Source: https://docs.procuros.io/en/api/v2/api-concepts ## API Versioning We are constantly improving and expanding our API. In order to give you the choice of when (or if) you want to benefit from these changes, we are versioning our API. Our API follows standard [semantic versioning](https://semver.org/), which means we will introduce a new major version number in case new, backwards-incompatible changes are introduced to the Procuros API. The API version is included in the path of every endpoint. Example: `https://api.procuros.io/v2/transactions` (`v2` shows this endpoint uses version 2) Keep in mind, that purely additive changes are not considered backwards-incompatible, which means your system needs to be able to handle new properties added to the JSON data returned by our API. Use the version selector in the top lefthand corner of this page to adjust the API documentation to an older version. ## Date and Time For datetime attributes, we are using the ISO8601 format. However, we recommend sending datetime attributes using the `Europe/Berlin` timezone. Furthermore, **all** datetime attributes returned by our API will be in `Europe/Berlin` timezone, regardless of what timezone was used when storing the record. ## Testing You can use our **Staging environment** to test your interaction with the Procuros API, which protects you from accidentally sending transactions to your Trade Partners. Our Staging and Production environments can easily be distinguished by the domain. * Staging: `https://api.procuros-staging.io/v2` * Production: `https://api.procuros.io/v2` # Authentication Source: https://docs.procuros.io/en/api/v2/concept-authentication The Procuros API uses API tokens to authenticate requests. Please contact `[email protected]` to request an API token. In order to perform an authenticated request, use the `Authorization` header to provide your API token as a "bearer token" like this: `Authorization: Bearer `. All requests to all endpoints of our API have to be made using the above authentication method. Unauthenticated calls will fail with a `401` status code. ## Testing your Connection Below are examples of how to ping the API to ensure your credentials are correct. If you get a successful response from the enpoint, your authorization is confirmed. If you receive a `401 Unauthorized` error then your API key is not correct for this environment. ```bash bash theme={null} curl --request GET \ --url 'https://api.procuros.io/v2/ping' \ --header 'Accept: application/json' \ --header 'Authorization: Bearer ' ``` ```php php theme={null} $client = new \GuzzleHttp\Client(); $client->request('POST', 'https://api.procuros.io/v2/ping', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ' ] ]); $response->getStatusCode(); // => 200 ``` ## SSL Encryption Requests to the Procuros API can only be made over HTTPS. Unsecured requests using HTTP will fail. # Error Handling Source: https://docs.procuros.io/en/api/v2/concept-error-handling Standard HTTP response status codes are used to indicate the success or failure of a request made to the Procuros API. Status codes in the `2XX` range indicate success, codes in the `4XX` and `5XX` range indicate failure. HTTP status codes that can be returned by the Procuros API: | HTTP Status Code | Meaning | | - | - | | **400** - Bad Request | There was an issue with the request sent, such as a duplicate payload was sent. | | **401** - Unauthorized | The API token is missing or invalid. | | **403** - Forbidden | The API token doesn't have permission to perform this action. | | **404** - Not Found | The requested entity (e.g. Transaction) could not be found. | | **422** - Validation Failed | The request data is invalid. Responses contain `errors` that show what field failed validation and why. | | **429** - Too Many Requests | You are calling the API too much. Check if you can use our bulk endpoints, otherwise contact support to get your rate limit increased. (won't happen to >99% of customers) | | **500**, **502**, **503**, **504** - Server Error | An error occurred on Procuros side (rare cases) | ## Error Responses To help you troubleshoot your interactions with the Procuros API, we've included further information within the responses returned from failed requests to the API. | Property | Type | Description | | - | - | - | | `message` | string | Short error descriptions | | `errors` | object | (Only on 422 "Validation Failed" Errors) Map of fields that failed validation including the corresponding validation error | ### Message `4xx` range responses will always include the `message` property. For example in the case of a `400`, the `message` property will give you the reason why in English. ```json json theme={null} { "message": "Payload already received" } ``` ### Errors For "Validation Failed" Client Errors (HTTP status code `422`), responses include an additional property `errors`, which list all request fields that failed validation and why. Example: ```json json theme={null} { "message": "Invalid data provided.", "errors": { "type": [ "The selected type is invalid." ] } } ``` ### Handling an Error ```php php theme={null} $client = new \GuzzleHttp\Client(); $response = $client->request(...); $statusCode = $response->getStatusCode(); if ($statusCode < 200 || $statusCode > 299) { // handle error // you likely want to check for the exact error codes } ``` ### Example ```php php theme={null} $headers = [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ]; $transaction = [...]; // A transaction payload $client = new \GuzzleHttp\Client(); $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => $headers, 'json' => $transaction, ]); $statusCode = $response->getStatusCode(); if ($statusCode < 200 || $statusCode > 299) { if ($statusCode === 400) { \Sentry\captureMessage('BadPayloadSent', $transaction); } if ($statusCode === 422) { \Sentry\captureMessage('ValidationError', $transaction); } if ($statusCode === 500) { markDocumentForLaterRetry($transaction); } \Sentry\captureMessage('UnknownApiError', $transaction); } markDocumentAsProcessed($statusCode, $transaction); ``` ### Error Handling Best Practises The most common errors are related to missing or misconfigured data. Here is an example on how to handle these with the [Report Outgoing Error Request](/en/api/v2/outgoing-transactions/report-outgoing-error) endpoint. ```php php theme={null} $client = new \GuzzleHttp\Client(); $client->request('POST', 'https://api.procuros.io/v2/errors', [ 'headers' => $headers, 'json' => [ 'errorReason' => 'Data XYZ could not be found.', 'errorType' => 'INTERNAL', 'errorContext' => [ 'meta' => 'value' ], 'transactionIdentifier' => 'bestellung-20231203-001', 'transactionType' => 'ORDER', ], ]); ``` #### Best Practise: Missing GTIN * Set `errorType` to: `DATA`. * Set the `errorReason` to: `The GTIN/EAN :gtin couldn't be found` and set up the gtin variable accordingly # Pagination Source: https://docs.procuros.io/en/api/v2/concept-pagination For some of our resources (eg. transactions), a "list" endpoint exists to fetch resources in bulk. These endpoints use a "cursor-based pagination", which means you can use the `per_page` and `cursor` query parameters to step through large collections page by page. ### Requests Requests to paginated "list" endpoints accept the following query parameters: | Parameter | Type | Description | | - | - | - | | `cursor` | String (optional) | Cursor pointing to the beginning of a page | | `per_page` | Integer (optional) | Amount of resources that should be returned. (1-100. Default: 25) | ### Responses All requests to those paginated "list" endpoints have the following response properties: | Property | Type | Description | | - | - | - | | `items` | Array | Array containing the listed resources (eg. transactions) | | `hasMore` | Boolean | Whether or not there are more resources to be fetched after this page | | `perPage` | Integer | Amount of resources returned per page | | `count` | Integer | Amount of resources on the current page | | `nextCursor` | String \| Null | Cursor pointing to the beginning of the next page (Use the `cursor` query parameter value to get the next page of resources) | | `nextPageUrl` | String \| Null | URL pointing to the next page of resources (prebuilt for your convenience) | **Example Response:** ```json json theme={null} { "items": [ {...}, {...} ], "hasMore": true, "perPage": 50, "count": 50, "nextCursor": "kdfhh87sdkfjslasdf7hsbadf", "nextPageUrl": "https://api.procuros.io/v2/transactions?cursor=kdfhh87sdkfjslasdf7hsbadf" } ``` ### Workflow 1. Make a request to the "list" endpoint without the `cursor` query parameter to fetch the first page of resources. Optionally use the `per_page` query parameter to limit the number of resources to fetch. Example: `GET https://api.procuros.io/v2/transactions` 2. From the response, read the `hasMore` property to determine if there are more resources to fetch on subsequent pages. 3. If more resources are available, use the `nextCursor` property on the response to build the URL of your next request. Alternatively, use the `nextPageUrl` that we've prebuilt for you. Example: `GET https://api.procuros.io/v2/transactions?cursor=kdfhh87sdkfjslasdf7hsbadf` 4. Continue with step 2. # Bulk Mark Transactions Processed Source: https://docs.procuros.io/en/api/v2/incoming-transactions/bulk-mark-transactions-processed /en/api/v2/openapi-v2.yaml post /v2/transactions/bulk/mark-processed Mark a list of incoming transactions as processed in a single request. For each item, set `success` to `true` once the transaction has been processed, or `false` if processing failed (optionally with an `errorReason`, `errorType`, and `errorContext`). Transactions previously reported as failed can be recovered by including them again with `success: true` once the issue has been resolved on your side. They move to the delivered state and their associated errors are resolved automatically. # List Incoming Transactions Source: https://docs.procuros.io/en/api/v2/incoming-transactions/list-incoming-transactions /en/api/v2/openapi-v2.yaml get /v2/transactions List unprocessed incoming transactions from your trade partners. # Mark Transaction Processed Source: https://docs.procuros.io/en/api/v2/incoming-transactions/mark-transaction-processed /en/api/v2/openapi-v2.yaml put /v2/transactions/{procurosTransactionId} Report whether your system processed an incoming transaction. Set `success` to `true` once the transaction has been processed, or `false` if processing failed (optionally with an `errorReason`, `errorType`, and `errorContext`). If a transaction was previously reported as failed, you can recover it by calling this endpoint again with `success: true` once the issue has been resolved on your side (for example, after correcting missing master data in your system). The payload is reused from your system, so there is no need to fetch the transaction again: it moves to the delivered state and its associated error is resolved automatically. # Test connection to API Source: https://docs.procuros.io/en/api/v2/misc/test-connection-to-api /en/api/v2/openapi-v2.yaml get /v2/ping Send an authorized request to the API to test the connectivity. # Report Outgoing Error Source: https://docs.procuros.io/en/api/v2/outgoing-transactions/report-outgoing-error /en/api/v2/openapi-v2.yaml post /v2/errors If you encounter an error while building an outgoing transaction payload, you can report it here. The error will enter the same exception handling process as an error reported while processing incoming transactions. # Send Transaction Source: https://docs.procuros.io/en/api/v2/outgoing-transactions/send-transaction /en/api/v2/openapi-v2.yaml post /v2/transactions Create and send a new transaction to one of your trade partners. # Overview Source: https://docs.procuros.io/en/api/v2/overview Welcome to the Procuros API. You are currently reading the documentation for API V2. The Procuros API is the recommended way of integrating with the Procuros Network in order to exchange business transactions with your Trade Partners. Our API follows RESTful patterns, accepts and returns JSON-encoded data and uses standard HTTP verbs and response codes. ## OpenAPI Specification The complete OpenAPI specification for the Procuros API v2 is available in raw format for easy integration with your development tools: Access the complete OpenAPI specification file to use with tools like Postman, Insomnia, or other API development tools. ## Incoming Transactions Incoming Transaction Flow ### Retrieving and Processing Transactions To retrieve unprocessed incoming transactions from Procuros, we recommend using a cron job/interval for simplicity. Looping through the list of retrieved transactions, you will try to process/import them. See our [Quick Start Guide](/en/api/v2/quick-start) for an example how this can be done. ### Reporting Processing Status Once you have looped through the unprocessed transactions and attempted to process them you will report back whether processing was successful or not. If a transaction could not be processed, you will send across an error reason and level. This will trigger the exception handling flow: * An e-mail notification will be sent to the responsible party for resolution * The error will show up in the Procuros Portal together with the error reason for self-service resolution by the responsible party. ## Outgoing Transactions Outgoing Transaction Flow ### Retrieving and Preparing Documents To retrieve new unprocessed documents from the ERP system that should be sent via Procuros we recommend using a cron job/interval that runs every 10-30 minutes for simplicity reasons, but you are free to make this event-based as well. To know which documents should be sent via Procuros, a list of “enabled” customers and suppliers needs to be maintained. This is explained in detail on [Enabled Trade Partners](/en/api/v2/features-enabled-trade-partners). Generally, all outgoing documents for an “enabled” Trade Partner (shipping notices, invoices, etc. for customers and orders for suppliers) should be sent via Procuros. We will handle routing and inactive trade relationships. More on that later. For every document that fulfils the above criteria, you will build the “transaction payload” according to the [API specification](/en/api/v2/incoming-transactions/list-incoming-transactions)) corresponding to the document type (order, shipping notice, etc.). ### Sending Transactions If you are able to successfully build and send a transaction payload to Procuros, we will respond in one of three ways: 1. For documents Procuros intends to forward to the receiving trade partner, the Procuros API responds with an `201: Created` status code and you should mark the document as `TRANSMITTED`. 2. If we determine the transaction should **not** be forwarded to the trade partner (eg. because the trade relationship is not yet active or documents of that type are not currently accepted by the receiving trade partner), the Procuros API will respond with an `202: Accepted` status code and you will mark the document as `NO_ACTION` to indicate to users that the document was accepted by Procuros but will not be forwarded. More on this in [Tracking Document Status](/en/api/v2/features-tracking-document-status). 3. If the transaction payload sent by you contains errors, the Procuros API will respond with a `422: Validation Error`. More on this below. 4. If a different error occurs, such as `PayloadAlreadyReceived` then this will be reported back via the status code `400: Bad Request`. ### Handling Errors If you were not able to successfully build the transaction payload to be sent via Procuros you will send an error payload instead to trigger the Exception Handling flow and allow the responsible parties to fix the underlying issue (i.e. change or add information in the unprocessed document). Error reasons could be e.g. missing GLNs or GTIN/EAN codes. When you send an error payload to the Procuros API, we will respond with an **Error Url** that points to the error within the Procuros Portal. You can attach the Link to the document for which you were unable to build the transaction payload giving your user an easy way to resolve the error fast. You will also receive an Error Url in case the transaction payload you sent is invalid and the Procuros API responds with `422: Validation Error`. In any case, you will re-try sending the document until it succeeds. ## Transport Labels Transport units on Shipping Notice and Dispatch Instruction Response transactions can carry a Procuros-generated SSCC transport label. It is returned as a `transportLabel` object with a `zplUrl` and a `pdfUrl`, giving you the raw ZPL and the rendered PDF version of the same label. To download the file content, call the [Download Transport Label](/en/api/v2/all-transactions/download-transport-label) endpoint using the value of either URL as the `transportLabelUrl` path parameter. The endpoint requires the same API token as the other endpoints and streams the file content back for download. # Quick Start Source: https://docs.procuros.io/en/api/v2/quick-start In this guide, we will go through the process of setting up an API connection, and a few basic endpoints that you can use for EDI document management. We will use PHP as the example language but you can translate the examples to any programming language you desire. ## Connecting to the API We assume for this PHP example that `Guzzle` is installed and available to the script. ```php php theme={null} $client = new \GuzzleHttp\Client(); $response = $client->request('GET', '', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` ## Listing Documents Following on from this, you can use the connection to list orders from your trade partners. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => $headers, ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` All types of documents are returned from this API call. In order to filter for a specific type, you may pass the `filter` URL parameter. For example: ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=ORDER', [ 'headers' => $headers, ]); ``` For a list of all available parameters, please see the [List Incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) API reference. ## Sending Documents Similar to listing documents, you can use the connection to send documents to your trade partners. ```php php theme={null} $transaction = [ "type": "ORDER", "content": [ "header": [ "orderIdentifier": "bestellung-20231203-001", "orderDate": "2023-12-03", "currency": "EUR", "requestedDeliveryDate": "2023-12-06", "buyer": ["identifiers": [["domain": "GS1", "identifier": "3220010000001" ]]], "supplier": ["identifiers": [["domain": "GS1", "identifier": "3220010000013" ]]], "billTo": ["identifiers": [["domain": "GS1", "identifier": "3220010000001" ]]], "shipTo": ["identifiers": [["domain": "GS1", "identifier": "3220010000003" ]]], ], "items": [ [ "identifiers": [["domain": "GS1", "identifier": "2330000000007" ]], "lineNumber": 1, "quantity": 10, "isDepositItem": false, "unitOfMeasure": "EA", "description": "A description of the item", "requestedDeliveryDate": null, "unitPrice": 1.23 ] ] ] ]; $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => $headers, 'json' => $transaction, ]); ``` For a list of all available document types that can be created, as well as the JSON body format for each, please see the [Send Transaction](/en/api/v2/outgoing-transactions/send-transaction) API reference. # Credit Notes Source: https://docs.procuros.io/en/api/v2/receiving-credit-notes This is the right section for you if you are acting as a customer and looking to receive credit notes from your suppliers. In this guide you will learn how to receive new credit notes from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the credit notes. It is important to mark the credit notes as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Credit Notes The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `CREDIT_NOTE`. In this case, the easiest way to acheive the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=CREDIT_NOTE', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `CREDIT_NOTE` and `SHIPPING_NOTICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'SHIPPING_NOTICE' || $item->type === 'CREDIT_NOTE'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Credit Note as Processed To mark an credit note as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'hasBeenProcessed' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Credit Notes as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'hasBeenProcessed' => true ], [ 'procurosTransactionId' => 'def-456', 'hasBeenProcessed' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing an Credit Note In the event an credit note was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these credit notes as "failed to process". In this case you must set the `hasBeenProcessed` flag to `false`. Additionally you should (but are not required to) add a `reason` for the credit note not being processed, which will be used for solving the issue. ### Single Credit Note ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'hasBeenProcessed' => false, 'reason' => 'Invalid address supplied' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'hasBeenProcessed' => false, 'reason' => 'Invalid address supplied' ], [ 'procurosTransactionId' => 'def-456', 'hasBeenProcessed' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Dispatch Instruction Responses Source: https://docs.procuros.io/en/api/v2/receiving-dispatch-instruction-responses This is the right section for you if you are acting as a supplier and looking to receive dispatch instruction responses from a fulfillment provider. In this guide you will learn how to receive new dispatch instruction responses from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the dispatch instruction responses. It is important to mark the dispatch instruction responses as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Dispatch Instruction Responses The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `DISPATCH_INSTRUCTION_RESPONSE`. In this case, the easiest way to acheive the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=DISPATCH_INSTRUCTION_RESPONSE', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `DISPATCH_INSTRUCTION_RESPONSE` and `INVOICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'INVOICE' || $item->type === 'DISPATCH_INSTRUCTION_RESPONSE'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Dispatch Instruction Response as Processed To mark an dispatch instruction response as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'hasBeenProcessed' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Dispatch Instruction Responses as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'hasBeenProcessed' => true ], [ 'procurosTransactionId' => 'def-456', 'hasBeenProcessed' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing Dispatch Instruction Response In the event an dispatch instruction response was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these dispatch instruction responses as "failed to process". In this case you must set the `hasBeenProcessed` flag to `false`. Additionally you should (but are not required to) add a `reason` for the dispatch instruction response not being processed, which will be used for solving the issue. ### Single Dispatch Instruction Response ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'hasBeenProcessed' => false, 'reason' => 'Invalid address supplied' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'hasBeenProcessed' => false, 'reason' => 'Invalid address supplied' ], [ 'procurosTransactionId' => 'def-456', 'hasBeenProcessed' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Dispatch Instructions Source: https://docs.procuros.io/en/api/v2/receiving-dispatch-instructions This is the right section for you if you are acting as a fulfillment provider and looking to receive dispatch instructions from suppliers. In this guide you will learn how to receive new dispatch instructions from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the dispatch instructions. It is important to mark the dispatch instructions as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Dispatch Instructions The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `DISPATCH_INSTRUCTION`. In this case, the easiest way to acheive the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=DISPATCH_INSTRUCTION', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `DISPATCH_INSTRUCTION` and `INVOICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'INVOICE' || $item->type === 'DISPATCH_INSTRUCTION'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Dispatch Instruction as Processed To mark an dispatch instruction as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'hasBeenProcessed' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Dispatch Instructions as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'hasBeenProcessed' => true ], [ 'procurosTransactionId' => 'def-456', 'hasBeenProcessed' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing Dispatch Instruction In the event an dispatch instruction was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these dispatch instructions as "failed to process". In this case you must set the `hasBeenProcessed` flag to `false`. Additionally you should (but are not required to) add a `reason` for the dispatch instruction not being processed, which will be used for solving the issue. ### Single Dispatch Instruction ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'hasBeenProcessed' => false, 'reason' => 'Invalid address supplied' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'hasBeenProcessed' => false, 'reason' => 'Invalid address supplied' ], [ 'procurosTransactionId' => 'def-456', 'hasBeenProcessed' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Invoices Source: https://docs.procuros.io/en/api/v2/receiving-invoices This is the right section for you if you are acting as a customer and looking to receive invoices from your suppliers. In this guide you will learn how to receive new invoices from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the invoices. It is important to mark the invoices as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Invoices The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `INVOICE`. In this case, the easiest way to acheive the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=INVOICE', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `INVOICE` and `SHIPPING_NOTICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'SHIPPING_NOTICE' || $item->type === 'INVOICE'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Invoice as Processed To mark an invoice as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Invoices as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => true ], [ 'procurosTransactionId' => 'def-456', 'success' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing an Invoice In the event an invoice was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these invoices as "failed to process". In this case you must set the `success` flag to `false`. Additionally you should (but are not required to) add a `reason` for the invoice not being processed, which will be used for solving the issue. ### Single Invoice ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => false, 'reason' => 'Invalid address supplied' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => false, 'reason' => 'Invalid address supplied' ], [ 'procurosTransactionId' => 'def-456', 'success' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Order Responses Source: https://docs.procuros.io/en/api/v2/receiving-order-responses This is the right section for you if you are acting as a customer and looking to receive Order Responses from your suppliers. In this guide you will learn how to receive new Order Responses from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the Order Responses. It is important to mark the Order Responses as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). ## Order Response Types Order Responses can have one of three types: * **ACCEPT**: The order was accepted exactly as ordered * **REJECT**: The order was fully rejected * **CHANGE**: Part of the order was accepted but either line item quantities or delivery date are changed Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Order Responses The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `ORDER_RESPONSE`. In this case, the easiest way to achieve the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=ORDER_RESPONSE', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `ORDER_RESPONSE` and `SHIPPING_NOTICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'SHIPPING_NOTICE' || $item->type === 'ORDER_RESPONSE'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Order Response as Processed To mark an Order Response as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Order Responses as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => true ], [ 'procurosTransactionId' => 'def-456', 'success' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing an Order Response In the event an Order Response was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these Order Responses as "failed to process". In this case you must set the `success` flag to `false`. Additionally you should (but are not required to) add a `reason` for the Order Response not being processed, which will be used for solving the issue. ### Single Order Response ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => false, 'reason' => 'Unknown order identifier referenced' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => false, 'reason' => 'Unknown order identifier referenced' ], [ 'procurosTransactionId' => 'def-456', 'success' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Orders Source: https://docs.procuros.io/en/api/v2/receiving-orders This is the right section for you if you are acting as a supplier and looking to receive orders from your customers. Throughout this guide you will learn how to pull new orders from the Procuros API, as well as how to paginate over them, mark them as processed, or report errors with the orders. It is important to mark the orders as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as "processing failed".\*\*\*\* PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/incoming-transactions/list-incoming-transactions). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Process Incoming orders retrieved from the Procuros API can be imported into the ERP System. These are usually the steps taken: 1. Uniquely identify customer (see [Trade Partner + Party Identification](/en/api/v2/features-trade-partner-party-identification)) 2. Uniquely identify every product ordered (see [Product Identification](/en/api/v2/features-product-identification)) 3. Handle Bottle Deposits (see [Bottle Deposits](/en/api/v2/features-bottle-deposits)) 4. Resolve customer-specific prices for products (if not done automatically by ERP-System) ### Rules As a general rule of thumb: An order retrieved from Procuros and one manually entered by a user should be exactly the same. One exception could be some way to indicate the “source” of the order being “Procuros” instead of “Manual”, “Shopify”, or something else. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a 2xx status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Orders The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. The Order response includes all header and item level fields, including: * **Header level**: `attachments`, `finalRecipient` party, `technicalRecipient` party, `technicalSender` party, and other party information * **Item level**: `attachments`, product specifications, dimensions, certifications, and other item details Refer to the OpenAPI schema documentation for the complete list of available fields. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=ORDER', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark Orders as Processed To mark an order as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Orders as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => true ], [ 'procurosTransactionId' => 'def-456', 'success' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check the request was successful ``` ## Report an Error Processing Orders In the event an order was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these orders as "failed to process". In this case you must set the `success` flag to `false`. Additionally you should (but are not required to) add a `reason` for the order not being processed, which will be used for solving the issue. ### Single Order ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => false, 'reason' => 'Missing shipping details in order' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => false, 'reason' => 'Missing shipping details in order' ], [ 'procurosTransactionId' => 'def-456', 'success' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Product Catalogs Source: https://docs.procuros.io/en/api/v2/receiving-product-catalogs This is the right section for you if you are acting as a customer and looking to receive Product Catalogs from your suppliers. In this guide you will learn how to receive new Product Catalogs from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the Product Catalogs. It is important to mark the Product Catalogs as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Product Catalog The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `PRODUCT_CATALOG`. In this case, the easiest way to achieve the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=PRODUCT_CATALOG', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `PRODUCT_CATALOG` and `SHIPPING_NOTICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'SHIPPING_NOTICE' || $item->type === 'PRODUCT_CATALOG'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Product Catalog as Processed To mark an Product Catalog as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Product Catalogs as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => true ], [ 'procurosTransactionId' => 'def-456', 'success' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing a Product Catalog In the event an Product Catalog was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these Product Catalogs as "failed to process". In this case you must set the `success` flag to `false`. Additionally you should (but are not required to) add a `reason` for the Product Catalog not being processed, which will be used for solving the issue. ### Single Product Catalog ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => false, 'reason' => 'Price missing on line item 10' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => false, 'reason' => 'Price missing on line item 10' ], [ 'procurosTransactionId' => 'def-456', 'success' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Sales Reports Source: https://docs.procuros.io/en/api/v2/receiving-sales-report This is the right section for you if you are acting as a supplier and looking to receive sales reports from your buyers. Throughout this guide you will learn how to pull new sales reports from the Procuros API, as well as how to paginate over them, mark them as processed, or report errors with the sales reports. It is important to mark the sales reports as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as "processing failed".\*\*\*\* PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/incoming-transactions/list-incoming-transactions). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a 2xx status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Sales Reports The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=SALES_REPORT', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark Sales Reports as Processed To mark a sales report as processed, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Sales Reports as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => true ], [ 'procurosTransactionId' => 'def-456', 'success' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check the request was successful ``` ## Report an Error Processing Sales Reports In the event a sales report was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these sales reports as "failed to process". In this case you must set the `success` flag to `false`. Additionally you should (but are not required to) add a `reason` for the sales report not being processed, which will be used for solving the issue. ### Single Sales Report ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => false, 'reason' => 'Missing location details in sales report' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => false, 'reason' => 'Missing location details in sales report' ], [ 'procurosTransactionId' => 'def-456', 'success' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Shipping Notices Source: https://docs.procuros.io/en/api/v2/receiving-shipping-notices This is the right section for you if you are acting as a customer and looking to receive shipping notices from your suppliers. In this guide you will learn how to receive new shipping notices from the Procuros API, as well as how to paginate over them, mark them as processed, or report any errors with the shipping notices. It is important to mark the shipping notices as processed (either successfully or not) so that the Procuros network can communicate this to your trade partners. This will also prevent them from re-appearing in future `GET` requests for transactions data, as well as trigger the error management process in case you mark any documents as errors. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). Trade partners may send updated versions of a document. Always check the `isLatestVersion` field before importing — if it is `false`, a newer version exists and this one should be skipped. See [Document Versioning](/en/api/v2/features-document-versioning) for full details. ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Pull New Shipping Notices The API call [List incoming Transactions](/en/api/v2/incoming-transactions/list-incoming-transactions) is used to fetch all incoming transactions. ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle request('GET', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); $body = json_decode((string) $response->getBody()); $items = $body->items; ``` ### Loading Different Document Types **Scenario 1:** You only want to load a specific document type, e.g. `SHIPPING_NOTICE`. In this case, the easiest way to acheive the filtering is to add the `filter` parameter to the request. ```php php theme={null} $response = $client->request('GET', 'https://api.procuros.io/v2/transactions?filter[type]=SHIPPING_NOTICE', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ``` **Scenario 2:** You want to load multiple document types, e.g. `SHIPPING_NOTICE` and `INVOICE`. In this case, you may want to load all document types and then filter them in your code, preventing multiple round-trip requests the API. You can filter the results by `type` of each returned item to get the documents you need. ```php php theme={null} $transactions = array_filter($items, function($item) { return $item->type === 'SHIPPING_NOTICE' || $item->type === 'INVOICE'; }); ``` ### Pagination The response body has a `hasMore` flag. If it's `true` not all items are in the response. You will then want to fetch the other items as well. Therefore, you can use the `nextPageUrl` flag from the response body and perform the same request with the new URL again. ```php php theme={null} if ($body->hasMore) { $response = $client->request('GET', $body->nextPageUrl, [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], ]); ... // don't forget to check for errors $body = json_decode((string) $response->getBody()); $items = array_merge($items, $body->items); } ``` If you are running your code only once a day or so, we recommend to perform the request with the new URL until `hasMore` is false. When doing so you can be sure to fetch all currently available items. Please read the [Pagination](/en/api/v2/concept-pagination) section of our API reference for a detailed description. ## Mark an Shipping Notice as Processed To mark a shipping notice as processed, and take it out of the incoming transactions queue, use the API call [Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed). On the happy path of a transaction being processed successfully, you can make an API call such as: ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); $transaction_id = 'abc-123'; // Get the transaction ID from the original `GET /v2/transactions` call $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => true ] ]); ... // Remember to check the request was successful ``` ### Mark Multiple Shipping Notices as Processed In addition to the above, you can specify a list of items that should be marked as processed in a single API call, via the [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed) endpoint. ```php php theme={null} require_once('vendor/autoload.php'); $client = new \GuzzleHttp\Client(); // You can find the IDs from the original `GET /v2/transactions` call $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => true ], [ 'procurosTransactionId' => 'def-456', 'success' => true ] ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ... // Remember to check if the request was successful ``` ## Report an Error Processing an Shipping Notice In the event a shipping notice was not able to be processed, you can use the same 2 API calls listed above ([Mark transaction processed](/en/api/v2/incoming-transactions/mark-transaction-processed) and [Bulk mark transactions processed](/en/api/v2/incoming-transactions/bulk-mark-transactions-processed)) to mark these shipping notices as "failed to process". In this case you must set the `success` flag to `false`. Additionally you should (but are not required to) add a `reason` for the shipping notice not being processed, which will be used for solving the issue. ### Single Shipping Notice ```php php theme={null} $transaction_id = 'abc-123'; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/{$transaction_id}", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'success' => false, 'reason' => 'Invalid address supplied' ] ]); ``` ### Bulk Error Reporting ```php php theme={null} $items = [ [ 'procurosTransactionId' => 'abc-123', 'success' => false, 'reason' => 'Invalid address supplied' ], [ 'procurosTransactionId' => 'def-456', 'success' => true ], ]; $response = $client->request('POST', "https://api.procuros.io/v2/transactions/bulk/mark-processed", [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => [ 'items' => $items ] ]); ``` # Order Responses Source: https://docs.procuros.io/en/api/v2/sending-order-responses This is the right section for you if you are acting as a supplier and looking to send Order Responses to your customers in response to their orders. Throughout this guide you will learn how to send Order Responses to the Procuros API. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). ## Order Response Types Order Responses can have one of three types: * **ACCEPT**: Use when the order is accepted exactly as ordered. The `items` array is optional — omit it to confirm all lines as-is, or include it to selectively confirm specific items with adjusted quantities or dates. * **REJECT**: Use when the order is fully rejected. The `items` array must not be included. * **CHANGE**: Use when part of the order is accepted but either line item quantities or delivery date are changed. The `items` array is required and must contain ALL order line items. Omitting `type` (or setting it to `null`) is treated identically to `REJECT` — the `items` array is prohibited and the order is considered fully rejected. Always provide an explicit `type` to avoid unintended rejections. ## Process These are usually the steps taken when sending an Order Response to Procuros: 1. Check, if this document should be sent via Procuros (see: [Enabled Trade Partners](/en/api/v2/features-enabled-trade-partners)) 2. Verify this document has not already been sent (see: [Tracking Document Status](/en/api/v2/features-tracking-document-status)) 3. Build the transaction payload to be sent via Procuros 4. Send the transaction payload via the Procuros API ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Send Order Responses The API call [Send transaction](/en/api/v2/outgoing-transactions/send-transaction) is used to create transactions, including Order Responses. The following fields are required: * `type` (Transaction type. In this case `ORDER_RESPONSE`) * `content` (The details of the Order Response) Inside the `content` you will need to build the Order Response header and optionally items. All details can be found in the `ORDER_RESPONSE` schema as described in the [API reference](/en/api/v2/outgoing-transactions/send-transaction). ### Example: ACCEPT Response Use this when accepting an order exactly as ordered: ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle 'ORDER_RESPONSE', 'content' => [ 'header' => [ 'type' => 'ACCEPT', 'buyer' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '1100001016310'] ] ], 'supplier' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '1100001016312'] ] ], 'orderResponseIdentifier' => 'RE-PO9383-R45', 'orderResponseDate' => '2024-01-15', 'orderIdentifier' => 'PO9383-R45', 'orderDate' => '2024-01-14', 'requestedDeliveryDate' => '2024-01-20', 'confirmedDeliveryDate' => '2024-01-20', 'confirmedShipmentDate' => '2024-01-18', 'currency' => 'EUR' ] ] ]; $response = $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => $transaction, ]); ``` ### Example: REJECT Response Use this when fully rejecting an order: ```php php theme={null} $transaction = [ 'type' => 'ORDER_RESPONSE', 'content' => [ 'header' => [ 'type' => 'REJECT', 'buyer' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '1100001016310'] ] ], 'supplier' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '1100001016312'] ] ], 'orderResponseIdentifier' => 'RE-PO9383-R45', 'orderResponseDate' => '2024-01-15', 'orderIdentifier' => 'PO9383-R45', 'orderDate' => '2024-01-14', 'currency' => 'EUR', 'comments' => 'Order rejected due to product unavailability' ] ] ]; $response = $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => $transaction, ]); ``` ### Example: CHANGE Response Use this when partially accepting an order with quantity or delivery date changes. The items array must contain ALL order line items, showing both ordered and confirmed quantities: ```php php theme={null} $transaction = [ 'type' => 'ORDER_RESPONSE', 'content' => [ 'header' => [ 'type' => 'CHANGE', 'buyer' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '1100001016310'] ] ], 'supplier' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '1100001016312'] ] ], 'orderResponseIdentifier' => 'RE-PO9383-R45', 'orderResponseDate' => '2024-01-15', 'orderIdentifier' => 'PO9383-R45', 'orderDate' => '2024-01-14', 'requestedDeliveryDate' => '2024-01-20', 'confirmedDeliveryDate' => '2024-01-22', 'confirmedShipmentDate' => '2024-01-20', 'currency' => 'EUR', 'comments' => 'Partial fulfillment due to limited stock' ], 'items' => [ [ 'lineNumber' => 1, 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '4300348765432'] ], 'isDepositItem' => false, 'orderedQuantity' => 20.0, 'confirmedQuantity' => 15.0, 'unitOfMeasure' => 'EA', 'description' => 'First product description', 'unitPrice' => 0.15, 'pricingUnitOfMeasure' => 'CT', 'pricingUnitQuantity' => 100 ], [ 'lineNumber' => 2, 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '4300348765433'] ], 'isDepositItem' => false, 'orderedQuantity' => 19.0, 'confirmedQuantity' => 19.0, 'unitOfMeasure' => 'EA', 'description' => 'Second product description', 'unitPrice' => 1.50, 'pricingUnitOfMeasure' => 'CT' 'pricingUnitQuantity' => 100, ] ] ] ]; $response = $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => $transaction, ]); ``` When using the `CHANGE` type, the `items` array must contain ALL order line items, regardless of whether `orderedQuantity` and `confirmedQuantity` are equal. This allows the buyer to see the complete picture of what will be delivered. ## Mark Document Status Finally, as per the instructions mentioned under [Tracking Document Status](/en/api/v2/features-tracking-document-status) you must now track the status of the document locally, based on the returned HTTP response. The document should be marked with either status `TRANSMITTED` or `NO_ACTION`. If there is an error with the document and it is not accepted, do not mark it with a status so it may be retried. For more information on retrying failed documents, please see: [Retrying Documents](/en/api/v2/features-tracking-document-status#retrying-documents). For example: ```php php theme={null} $statusCode = $response->getStatusCode(); if ($statusCode == 201) { $document->updateProcurosStatus("TRANSMITTED"); } else if ($statusCode == 202) { $document->updateProcurosStatus("NO_ACTION"); } else { // No need to do anything if it's not accepted, in an error case the document should be retried. } ``` # Orders Source: https://docs.procuros.io/en/api/v2/sending-orders This is the right section for you if you are acting as a customer and looking to send orders to your suppliers. Throughout this guide you will learn how to send new orders to the Procuros API. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). ## Process These are usually the steps taken when sending an order to Procuros: 1. Check, if this document should be sent via Procuros (see: [Enabled Trade Partners](/en/api/v2/features-enabled-trade-partners)) 2. Verify this document has not already been sent (see: [Tracking Document Status](/en/api/v2/features-tracking-document-status)) 3. Build the transaction payload to be sent via Procuros 4. Send the transaction payload via the Procuros API ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Send Orders The API call [Send transaction](/en/api/v2/outgoing-transactions/send-transaction) is used to create transactions, including orders. The following fields are required: * `type` (Transaction type. In this case `ORDER`) * `content` (The details of the order items.) Inside the `content` you will need to build all order items. All details can be found in the `ORDER` schema as described in the [API reference](/en/api/v2/outgoing-transactions/send-transaction). The example below shows commonly used fields. The Order schema supports many additional optional fields including: * **Header level**: `deliveryInformation`, `purchasingInformation`, `legalInformation`, `attachments`, `finalRecipient` party, `technicalRecipient` party, `technicalSender` party * **Item level**: `size`, `dimension`, `hsCode`, `cnCode`, `colorCode`, `colorName`, `fscNumber`, `deliveryGracePeriodInDays`, `certificationsRequired`, `attachments` **Date format**: All date fields (e.g. `orderDate`, `requestedDeliveryDate`) must use ISO 8601 format: `YYYY-MM-DD` (e.g. `2023-12-06`). For the complete list of available fields, refer to the OpenAPI schema documentation. An example request would look like: ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle 'ORDER', 'content' => [ 'header' => [ 'orderIdentifier' => 'bestellung-20231203-012', 'orderDate' => '2023-12-03', 'currency' => 'EUR', 'requestedDeliveryDate' => '2023-12-06', 'type' => 'STANDARD', 'comments' => 'Please deliver to loading dock 3', 'contractReference' => 'CONTRACT-2023-ABC', 'buyer' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '3220010000010'] ] ], 'supplier' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '3220010000003'] ] ], 'billTo' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '3220010000010'] ] ], 'shipTo' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '3220010000011'] ] ], 'technicalRecipient' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '3220010000010'] ] ], 'technicalSender' => [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '3220010000012'] ] ], 'AdditionalOrderIdentifiers' => [ 'supplierOrderIdentifier' => 'SUP-ORDER-789', 'shipToOrderIdentifier' => 'SHIP-REF-456' ], 'paymentTerms' => [ [ 'payInNumberOfDays' => 30, 'percentage' => 5 ] ] ], 'items' => [ [ 'identifiers' => [ ['domain' => 'GS1', 'identifier' => '2330000000083'] ], 'lineNumber' => 1, 'quantity' => 10, 'isDepositItem' => false, 'unitOfMeasure' => 'EA', 'description' => 'Premium Organic Coffee Beans 1kg', 'comments' => 'Please handle with care - fragile packaging', 'requestedDeliveryDate' => null, 'requestedEarliestDeliveryDate' => '2023-12-05', 'requestedLatestDeliveryDate' => '2023-12-08', 'minimumRemainingShelfLifeInDays' => 90, 'unitPrice' => 1.23, 'pricingUnitOfMeasure' => 'CT', 'pricingUnitQuantity' => 100, 'recommendedRetailPrice' => 1.85, 'netWeight' => 1000, 'grossWeight' => 1050, 'originCountryCode' => 'BR', 'tax' => [ 'percentage' => 7, 'description' => 'Umsatzsteuer' ], 'brand' => 'kela', 'assortment' => 'ME_GEN', 'consumerGroup' => 'Unisex', 'category' => '1008', 'subCategory' => 'Beverages', 'organicControlPointNumber' => 'DE-ÖKO-006', 'certificationsRequired' => [ 'fairtrade' => true, 'supplierQa' => false, 'eudr' => true ], 'contractReference' => 'ITEM-CONTRACT-XYZ', 'promotionCode' => 'WINTER2023', 'attachments' => [ [ 'fileName' => 'technical_datasheet.pdf', 'url' => 'https://example.com/attachments/technical_datasheet.pdf', 'mimeType' => 'application/pdf', 'type' => 'TECHNICAL_DATASHEET' ], [ 'fileName' => 'product_label.pdf', 'url' => 'https://example.com/attachments/product_label.pdf', 'mimeType' => 'application/pdf', 'type' => 'PRODUCT_LABEL' ] ], 'modificationGroups' => [ [ 'basis' => 12.30, 'level' => 1, 'modifications' => [ [ 'type' => 'ALLOWANCE', 'calculationType' => 'RELATIVE', 'reasonCode' => 'DISCOUNT', 'description' => 'Contract trade discount', 'percentage' => 7 ] ] ] ] ] ] ] ]; $response = $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => $transaction, ]); ``` ## Mark Document Status Finally, as per the instructions mentioned under [Tracking Document Status](/en/api/v2/features-tracking-document-status) you must now track the status of the document locally, based on the returned HTTP response. The document should be marked with either status `TRANSMITTED` or `NO_ACTION`. If there is an error with the document and it is not accepted, do not mark it with a status so it may be retried. For more information on retrying failed documents, please see: [Retrying Documents](/en/api/v2/features-tracking-document-status#retrying-documents). For example: ```php php theme={null} $statusCode = $response->getStatusCode(); $responseBody = json_decode($response->getBody()->getContents(), true); if ($statusCode == 201) { $document->updateProcurosStatus("TRANSMITTED"); $document->updateProcurosTransactionId($responseBody['procurosTransactionId']); } else if ($statusCode == 202) { $document->updateProcurosStatus("NO_ACTION"); $document->updateProcurosTransactionId($responseBody['procurosTransactionId']); } else { // No need to do anything if it's not accepted, in an error case the document should be retried. } ``` # Product Catalogs Source: https://docs.procuros.io/en/api/v2/sending-product-catalogs This is the right section for you if you are acting as a supplier and looking to send product catalogs to your customers. Throughout this guide you will learn how to send product catalogs to the Procuros API. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). ## Process These are usually the steps taken when sending an product catalog to Procuros: 1. Check, if this document should be sent via Procuros (see: [Enabled Trade Partners](/en/api/v2/features-enabled-trade-partners)) 2. Verify this document has not already been sent (see: [Tracking Document Status](/en/api/v2/features-tracking-document-status)) 3. Build the transaction payload to be sent via Procuros. 4. Send the transaction payload via the Procuros API ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Send product catalogs The API call [Send transaction](/en/api/v2/outgoing-transactions/send-transaction) is used to create transactions, including product catalogs. The following fields are required: * `type` (Transaction type. In this case `PRODUCT_CATALOG`) * `content` (The details of the product catalogs items.) Inside the `content` you will need to build all product catalogs items. All details can be found in the `PRODUCT_CATALOG` schema as described in the [API reference](/en/api/v2/outgoing-transactions/send-transaction). An example request would look like: ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle "PRODUCT_CATALOG", "content" => [ "header" => [ "sender" => [ "identifiers" => [ [ "domain" => "GS1", "identifier" => "4200000123456" ] ], "postalAddress" => [ "name" => "Test Sender GmbH", "street" => "Musterstraße 1", "addressExtra" => "c/o Max Mustermann", "city" => "Entenhausen", "postalCode" => "123456", "countryCode" => "DE" ], "name" => "Test Sender GmbH" ], "receiver" => [ "identifiers" => [ [ "domain" => "GS1", "identifier" => "4200000654321" ] ], "postalAddress" => [ "name" => "Test Receiver GmbH", "street" => "Lilienstraße 36", "city" => "Hamburg", "postalCode" => "20095", "countryCode" => "DE" ], "name" => "Test Receiver GmbH" ], "catalogNumber" => "Summer 2025", "catalogDate" => "2024-06-01" ], "items" => [ [ "unitOfMeasure" => "EA", "identity" => [ "senderPartnerId" => "PRD-0001", "receiverPartnerId" => "AB-MM-9988", "gtin" => "12345678901234", ], "lineNumber" => 12, "quantity" => 5, "action" => "NEW", "currency" => "EUR", "isOrderable" => true, "unitPrice" => 44.23, "pricingUnitOfMeasure" => "CT", "pricingUnitQuantity" => 100, "description" => "Description/Name of the product", "hsCode" => "222222", "isDangerous" => false, "hasExpiryDate" => false, "hasBatchNumber" => false, "hasSerialNumber" => false, "originCountryCode" => "US", "nutritionalInformation" => [ "energy" => [ "totalInKcal" => 250.5, "totalInKj" => 1047.2 ], "fats" => [ "totalInGrams" => 15.2, "saturatedInGrams" => 3.5, "monounsaturatedInGrams" => 6.8, "polyunsaturatedInGrams" => 4.9 ], "carbohydrates" => [ "totalInGrams" => 30.5, "sugarsInGrams" => 8.2 ], "proteins" => [ "totalInGrams" => 12.5 ], "saltInGrams" => 0.8, "vitamins" => [ "vitaminCInMicrograms" => 80.0 ] ], "additives" => [ [ "identifiers" => [ "gdsn" => "E300", "senderInternal" => "ADD-001" ], "name" => "Ascorbic Acid (Vitamin C)" ] ], "certifications" => [ "eudr" => [ "verificationNumber" => "FAHLHGK7", "referenceNumber" => "24ITYGBJFOS258" ] ] ] ] ] ]; $response = $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => $transaction, ]); ``` ## Mark Document Status Finally, as per the instructions mentioned under [Tracking Document Status](/en/api/v2/features-tracking-document-status) you must now track the status of the document locally, based on the returned HTTP response. The document should be marked with either status `TRANSMITTED` or `NO_ACTION`. If there is an error with the document and it is not accepted, do not mark it with a status so it may be retried. For more information on retrying failed documents, please see: [Retrying Documents](/en/api/v2/features-tracking-document-status#retrying-documents). For example: ```php php theme={null} $statusCode = $response->getStatusCode(); if ($statusCode == 201) { $document->updateProcurosStatus("TRANSMITTED"); } else if ($statusCode == 202) { $document->updateProcurosStatus("NO_ACTION"); } else { // No need to do anything if it's not accepted, in an error case the document should be retried. } ``` # Shipping Notices Source: https://docs.procuros.io/en/api/v2/sending-shipping-notices This is the right section for you if you are acting as a supplier and looking to send shipping notices to your customers. Throughout this guide you will learn how to send shipping notices to the Procuros API. PHP examples are included but you will likely also want to look at the relevant API calls in the [API reference](/en/api/v2/overview). ## Process These are usually the steps taken when sending a shipping notice: 1. Check, if this document should be sent via Procuros (see: [Enabled Trade Partners](/en/api/v2/features-enabled-trade-partners)) 2. Verify this document has not already been sent (see: [Tracking Document Status](/en/api/v2/features-tracking-document-status)) 3. Build the transaction payload to be sent via Procuros. 1. If products being shipped are perishable and thus require shelf-life tracking, batch information needs to be added (see: [Batches & Best Before Dates](/en/api/v2/features-batches-best-before-dates)) 2. If you are sending large shipments on Euro Pallets, additional shipment identification needs to be provided. (see: [Package Identification](/en/api/v2/features-package-identification)) 4. Send the transaction payload via the Procuros API ## Authentication You will need an API token to authenticate. We use a bearer token which has to be included in each request you send to the API. Please read the [Authentication](/en/api/v2/concept-authentication) section of our API reference for a detailed description. ## Error Handling The API will return a `2xx` status code for successful requests. Anything else indicates an error. Please read the [Errors](/en/api/v2/concept-error-handling) section of our API reference for a detailed description plus examples of how to handle them. ## Send Shipping Notices The API call [Send transaction](/en/api/v2/outgoing-transactions/send-transaction) is used to create transactions, including shipping notices. The following fields are required: * `type` (Transaction type. In this case `SHIPPING_NOTICE`) * `content` (The details of the shipping notice items.) Inside the `content` you will need to build all shipping notice items. All details can be found in the `SHIPPING_NOTICE` schema as described in the [API reference](/en/api/v2/outgoing-transactions/send-transaction). Each item in `transportUnits` must have a `unitType`. The following values are supported: | Value | Description | | - | - | | `EURO_PALLET` | Euro Pallet (120 × 80 cm) | | `EURO_PALLET_HALF` | 1/2 Euro Pallet (80 × 60 cm) | | `EURO_PALLET_QUARTER` | 1/4 Euro Pallet (60 × 40 cm) | | `PALLET` | Generic / non-Euro pallet | | `PACKAGE` | Package | | `CARTON` | Carton | | `CONTAINER` | Shipping container | An example request would look like: ```php php theme={null} // install dependency // $ composer require guzzlehttp/guzzle 'SHIPPING_NOTICE', 'content' => [ 'header' => [ 'buyer' => [ 'name' => 'ACME Co. Ltd.', 'identifiers' => [ [ 'identifier' => '3220010000005', 'domain' => 'GS1' ] ] ], 'supplier' => [ 'name' => 'Testsupplier', 'identifiers' => [ [ 'identifier' => '3220010000010', 'domain' => 'GS1' ] ] ], 'shipTo' => [ 'identifiers' => [ [ 'identifier' => '3220010000005', 'domain' => 'GS1' ] ] ], 'billTo' => [ 'identifiers' => [ [ 'identifier' => '3220010000006', 'domain' => 'GS1' ] ] ], 'technicalRecipient' => [ 'identifiers' => [ [ 'identifier' => '3220010000006', 'domain' => 'GS1' ] ] ], 'technicalSender' => [ 'identifiers' => [ [ 'identifier' => '3220010000007', 'domain' => 'GS1' ] ] ], 'shippingNoticeIdentifier' => 'SN9383-R45', 'shippingNoticeDate' => '2021-11-24', 'orderIdentifier' => 'PO9383-R45', 'orderDate' => '2021-11-20', 'despatchDate' => '2021-11-05', 'requestedDeliveryDate' => '2021-11-06', 'expectedDeliveryDate' => '2021-11-06' ], 'transportUnits' => [ [ 'unitIdentifier' => '34000000000001', 'unitType' => 'EURO_PALLET', 'containedTradeUnitCount' => 10, 'items' => [ [ 'lineNumber' => 1, 'orderLineNumber' => 1, 'orderIdentifier' => 'PO9383-R45', 'identifiers' => [ [ 'identifier' => '2330010000061', 'domain' => 'GS1' ], [ 'identifier' => 'filter-coffee', 'domain' => 'BUYER' ], [ 'identifier' => 'supplier-filter-coffee', 'domain' => 'SUPPLIER' ] ], 'isDepositItem' => false, 'orderedQuantity' => 20, 'shippedQuantity' => 20, 'description' => 'First product description.', 'certifications' => [ 'eudr' => [ 'verificationNumber' => 'FAHLHGK7', 'referenceNumber' => '24ITYGBJFOS258' ] ], 'batches' => [ [ 'batchIdentifier' => 'BATCH_ID_1', 'expirationDate' => '2022-12-24', 'quantity' => 15 ], [ 'batchIdentifier' => 'BATCH_ID_2', 'expirationDate' => '2022-12-31', 'quantity' => 5 ] ] ], [ 'lineNumber' => 2, 'orderLineNumber' => 2, 'orderIdentifier' => 'PO9383-R45', 'identifiers' => [ [ 'identifier' => '2330010000019', 'domain' => 'GS1' ], [ 'identifier' => 'bread-crumbs-bulk', 'domain' => 'BUYER' ], [ 'identifier' => 'supplier-bread-crumbs-bulk', 'domain' => 'SUPPLIER' ] ], 'isDepositItem' => false, 'orderedQuantity' => 19, 'shippedQuantity' => 15, 'openQuantityAction' => 'DISCARDED', 'batches' => [ [ 'batchIdentifier' => 'BATCH_ID_2', 'expirationDate' => '2022-05-01', 'quantity' => 15 ] ], 'description' => 'Sparkling Water - Crate (6x0.75l).' ] ] ] ] ] ]; $response = $client->request('POST', 'https://api.procuros.io/v2/transactions', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer ', ], 'json' => $transaction, ]); ``` ## Mark Document Status Finally, as per the instructions mentioned under [Tracking Document Status](/en/api/v2/features-tracking-document-status) you must now track the status of the document locally, based on the returned HTTP response. The document should be marked with either status `TRANSMITTED` or `NO_ACTION`. If there is an error with the document and it is not accepted, do not mark it with a status so it may be retried. For more information on retrying failed documents, please see: [Retrying Documents](/en/api/v2/features-tracking-document-status#retrying-documents). For example: ```php php theme={null} $statusCode = $response->getStatusCode(); if ($statusCode == 201) { $document->updateProcurosStatus("TRANSMITTED"); } else if ($statusCode == 202) { $document->updateProcurosStatus("NO_ACTION"); } else { // No need to do anything if it's not accepted, in an error case the document should be retried. } ``` ## Advanced Use Cases When it comes to sending shipping notices, there are a number of advanced cases, such as [Bottle Deposits](/en/api/v2/features-bottle-deposits), [Batches & Best Before Dates](/en/api/v2/features-batches-best-before-dates) and [Package Identification](/en/api/v2/features-package-identification). Please see the Features section of our API reference for a detailed description of all advanced use cases. # Download Transport Label Source: https://docs.procuros.io/en/api/v2/transport-labels/download-transport-label /en/api/v2/openapi-v2.yaml get /v2/transactions/{transportLabelUrl}/download Download the file content of a transport label. Use the value of the `zplUrl` or `pdfUrl` field from the `transportLabel` object of a transport unit (available on Shipping Notice and Dispatch Instruction Response transactions) as the `transportLabelUrl` path parameter, depending on whether you want the raw ZPL or the rendered PDF. The response is the streamed file content for download. # Procuros AS2 Details Source: https://docs.procuros.io/en/connectors/as2/as2 Technical information for connecting to Procuros via AS2 The AS2 connection from Procuros enables secure and reliable electronic data exchange between you and your trading partners. This technical documentation contains all necessary parameters for configuring your AS2 connection. ## Technical Contact Person If you have questions about AS2 setup or connection issues, the following contact options are available: * Email: [help@procuros.io](mailto:help@procuros.io) ## Connection Addresses Use one of the following endpoint addresses for configuration: * HTTPS: `https://as2.procuros.io/receive/v1` (Port: 443) * HTTP: `http://as2.procuros.io/receive/v1` (Port: 80) AS2 Identifier: `procuros` ## Technical Details The following settings are required for a successful AS2 connection with Procuros: * Message Encryption: Yes (Algorithm: 3DES) * Message Compression: No * Message Signing: Yes (Algorithm: SHA1) * MDN: Yes * Mode: Sync * Signed: Yes (Algorithm: SHA1) These configuration details can be used for both production and test environments. ## IP Addresses ### Outgoing IP Addresses Procuros uses the following outgoing IP addresses when your AS2 server is addressed: ``` 51.116.233.35, 51.116.171.49, 51.116.233.33, 51.116.233.22, 51.116.168.104, 51.116.175.17, 51.116.233.87, 51.116.175.51, 20.113.11.136, 20.113.11.85, 20.113.10.168, 20.113.8.64, 3.70.10.129, 3.76.51.85, 52.28.170.162, 52.59.155.142 ``` ### Incoming IP Addresses The Procuros AS2 server can be reached at the following incoming IP addresses: ``` 20.101.181.60, 35.157.232.59, 35.159.186.102 ``` Ensure that these IP addresses are whitelisted in your firewalls and security systems to ensure smooth communication. ## Certificates For encrypted communication, you need the Procuros certificates. These are available in various formats: * procuros\_as2\_certificate.cer * procuros\_as2\_certificate.txt * procuros\_as2\_certificate.pem * procuros\_as2\_certificate.p7b Download the certificate in the required format from the list above. Import the certificate into your AS2 software according to the instructions from your AS2 provider. ## Frequently Asked Questions Yes, the AS2 connection can be used for both environments. # Troubleshooting Common Errors Source: https://docs.procuros.io/en/connectors/ms-business-central/common-errors Overview of common errors and how to fix them in MS Business Central ## Troubleshooting Common Errors Below you will find an overview of the most common errors (import, export, status) and how you can fix them. ### Import Error ![Import Error 1](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/RgYg5BcjeiBDDFwMguIx-oqmQXnIto9CD62mVz5OwcA/Screenshot%202023-10-18%20at%2015.43.39-xvc.png) ![Import Error 2](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/D6gkv9iCk1Lsajkma8Ndk7PyU-HvQWfix-Jx7lNz_Oc/Screenshot%202023-10-18%20at%2015.44.02-bLE.png) ### Export Error ![Export Error 1](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/iXoKxCWv-THCE9rY79x8wu6XMyblV9JI9yzkGo8s8cU/Screenshot%202023-10-18%20at%2015.45.48-a5Y.png) ![Export Error 2](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/roBQKpce1B572SqSg6WQOVa_BsJWtJeqMjPZNBAATr0/Screenshot%202018-10-18%20at%2015.46.21-B1I.png) ### Status Error ![Status Error 1](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/UT880X84BqJINlXP7qY9To62tKu3yi-3WnyPiSzBZIo/Screenshot%202023-10-18%20at%2015.46.49-2Zw.png) ![Status Error 2](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/0Sa_RirYy18535D6dWZ-igdmnTjdQV2OJVV52O0fCAo/Screenshot%202023-10-18%20at%2015.47.18-QjI.png) ![Status Error 3](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/WC5vLN9E2CsW5P-IVtXDFzywxlb_BssQrJ9kbgpCdGY/Screenshot%202023-10-18%20at%2015.48.31-2g0.png) # Overview MS Business Central Connector Source: https://docs.procuros.io/en/connectors/ms-business-central/getting-started/overview Overview of the capabilities and benefits of the Procuros MS Business Central Connector ## Overview of the MS Business Central Connector The Procuros MS Business Central Connector enables integration between your Microsoft Dynamics 365 Business Central system and the Procuros platform, allowing automated exchange of business documents between you and your business partners. ## Supported Document Types The MS Business Central Connector currently supports the following document types: Receiving: * Orders * Confirm/Reject Orders Sending: * Delivery Notes * Invoices ## Benefits of Integration * **Optimized Workflows**: Streamlines data exchange between you and your business partners. * **Enhanced Capabilities**: Includes support for discounts, deposit items, product hierarchies, and batches. * **Automated Document Handling**: Procuros seamlessly processes business documents automatically. # Technical Setup Source: https://docs.procuros.io/en/connectors/ms-business-central/getting-started/technical-setup Learn how to set up Microsoft Business Central integration with Procuros Learn how to give Procuros access to your Business Central system and set the correct permissions & settings. ## Installing the app To connect Business Central to Procuros, you need the "simple\_EDI" app. Depending on whether your Business Central instance is hosted in the cloud or on-premise, you can download the app from [Microsoft App Source](https://appsource.microsoft.com/en-us/product/dynamics-365-business-central/pubid.mp-solutions%7Caid.mp_simpleedi%7Cpappid.46655971-0727-4a01-93c2-35e7facb1ab9?tab=overview) or contact us for the download link for on-premise installation. In the case of an on-premise installation, please provide us with your partner's PSBC ID so that we can authorize them for the installation and ensure that the required [object ids](https://onedrive.live.com/edit.aspx?resid=A9C0C8416014A546!70356\&ithint=file%2cxlsx\&wdo=2\&authkey=!AAJBs71il7XKwJ8) are approved. ## Basics app We created a new role center called "simple\_EDI". It contains all the lists, settings and actions you need to implement the module in your BC - and also to work in your day-to-day business: ![Business Central Role Center](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/SyawEFnQk6DzXvIcm50MrBpZTkjKQ1z4RBETv4u_Yfo/Screenshot%202023-10-18%20at%2014.46.03-ZCY.png) Installing/publishing the simple|EDI app creates two new permission sets: ![Permission Sets](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/sUsCSjldXwYdo7i9azixG-hguW99AB0o_FjEbIVTlNM/1697633234993-PW8.png) The "ALL" permission set contains all permissions for all objects added by the module. The "READ" permission set includes only read permissions on all tables and the permissions to execute pages and code units that are added. Make sure all users processing orders have full permissions to the module. ## Setting up the app First, you need to set up the API connection and transaction transfer options: ![API Connection Setup](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/EktBaal4H1VMnqUOsqcIpmF79sq_OEN5OVAyLgycRS8/1697633368560-Lyo.png) Please follow the steps below to edit fields, options and features: ![Setup Steps](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/_qaDdIDY1GJj0Pfiaqy8d_gko88Yth_YLoMkPXaXpwI/1697633369501-dUQ.png) 1. Enter the URL and API token (provided to you by Procuros) and activate the setup with the specified API version (currently v2). 2. Decide at what time/action the incoming and outgoing transactions will be triggered: * **Import orders:** * **Manual** to receive orders only when the function is called from this setup page * **Interval-based** to use a job queue that allows you to control start times and the time between runs. We recommend using this option. If not already done, initialize the job queue: ![Job Queue Initialization](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/Zo7dHBewbexP07EQEy88vsfRbzmQRUKdCS7fk6Y25ow/1697633658920-Mss.png) Determine the time intervals between runs: ![Time Intervals](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/ckpOts2-qvHiQzJivUylHig_eucydkGh61hDj6xepzY/1697633721067-WXM.png) If you want, you can edit the job queue: ![Edit Job Queue](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/wHhMdZRZMKcAPjpsmDlMRMLzCTViME80AriqbOZqZlQ/1697633734515-J5w.png) If you decide to switch from the interval-based to the manual option, the job queue will be automatically cleared. If the import method is "interval-based", you cannot import manually. Enable setup to ensure the transfer works. If you want to import new orders in the background without confirmation messages, it is helpful to activate the "Hide validation dialog" flag. ## Activation of the app It is necessary to enter the GLN of your own company or the companies in your database if there is more than one company. You may have already done this on the Company Information page. If this has already happened, the Sync GLN Information function populates the simpleEDI Business Relationships table: ![Sync GLN Information](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/eQlpR9pvvHMallw8ie6ia_MJtYs29YR199KS_Iap6No/1697633846160-R7k.png) If you have not yet entered a GLN code for your company, either enter it in the "Company Information" card, or (recommendation) create a new entry here in the "simpleEDI - Business Relationships" table for each company in your database to be linked to Procuros: ![Business Relationships](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/RGmoZHsozXCL8SvwObfhkiB3j08DqGkeW99NZlIXQg0/1697633869737-mb4.png) ## Setup Checklist Use this checklist to ensure that key facilities are completed. ### Initial Setup Checklist * You have successfully downloaded and installed the **simple\_EDI app** * You have assigned the new **authorizations** to the **users** who will process EDI orders * You entered a **valid API token** on the setup page (provided by Procuros) * You have entered the **GLN for your company** and activated the business relationship with Procuros # How to setup Article Master Data in Business Central Source: https://docs.procuros.io/en/connectors/ms-business-central/master-data-configuration/article-master-data Step by step guide to configure your article master data Items are identified via the EAN/GTIN code, and the corresponding item information such as item name or prices is pulled from your Business Central master data. ## Article GTIN / EAN Setup After the customers, their addresses and their own company(s) have been activated for transmission via EDI, the GTIN must - if not already done - be entered on the item card. ![Item GTIN Setup](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/96vihztM0HiXPvnOgGy5ftaF7XUUfFkwMBAgIwTAIeQ/Screenshot%202023-10-18%20at%2015.04.16-F3A.png) Please be careful not to include spaces or other special characters - the GTIN / EAN must adhere to the GS1 standards. ## Deposit Items Configuration There is also the option of automatically adding additional items to the customer order, for example for deposits. A new table is used here to link these items - the ordered item and the deposit item. Set up the relationship between ordered items and deposit items. ![Deposit Items Step 1](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/wZbrMGOKDP1KmtTv8P43w-gZ6R9AQXoSM9F47jpO82o/Screenshot%202023-10-18%20at%2015.05.14-AQs.png) Link the ordered item with the corresponding deposit item. ![Deposit Items Step 2](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/FtEDwxWAf2PdJzpF0r4-5yKDnLfYJDjf5LNQDXvYW6w/Screenshot%202023-10-18%20at%2015.06.16-mqE.png) The transmitted indicator "is deposit" is not necessary for linked items to be included in the customer order. If there is an entry in this table without the "deposit" indicator, the linked item is also included in the document. ## Translations of Units of Measure Your customers may not use the same codes as you, e.g. B. for pieces, sets or lump sums. To avoid entering every code a customer uses into your database and setting up sales prices for them, you can set associations. Set up unit of measure translations for your trading partners. ![Unit Translations Step 1](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/wErSWPTW-LjE6hrYsQ-EdcOvygwTSyNjHDERUSc7b_g/Screenshot%202023-10-18%20at%2015.08.53-T5g.png) Map your customer's unit codes to your internal unit codes. ![Unit Translations Step 2](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/VqHH-yi41eR7nnoKqNU5d4Qzp0y3mNvQrttpBZzHeiQ/Screenshot%202023-10-18%20at%2015.10.13-PEA.png) ## Master Data Checklist Use this checklist to ensure that all necessary master data is correctly stored: * GTIN/EAN stored for each article relevant for trade * Article number and description filled out for each article * Format of GTIN/EAN correct (no spaces, only numeric characters) * Deposit items configured and linked to ordered items (if applicable) * Unit of measure translations set up for trading partners * No duplicate GTIN/EAN codes in the system The correct setup of your master data forms the foundation for successful integration with Procuros and your trading partners. # How to setup Customer Master Data in Business Central Source: https://docs.procuros.io/en/connectors/ms-business-central/master-data-configuration/customer-master-data Step by step guide to configure your customer master data In order to work with the "simple-EDI" app in day-to-day business, you must complete the customer master data setup. Customers in your Business Central instance are identified via the GLN and the corresponding master data such as addresses are pulled from your Business Central instance based on the GLN code. ## Customer GLN Setup On the customer card, you must fill in the GLN field in the "Invoicing" section. ![Customer GLN Setup](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/Aw1FquFT4ugQcmZ2PplcKZYroIOnxWS-rtf7hGQ6W5s/1697634183979-QEE.png) You also need to ensure that all relevant shipping addresses for this customer exist and that the GLN field is populated with the correct identifiers. ![Shipping Address GLN](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/ptwO-EZGIP-1VwsArUWWdMs_fFQDZ51TbscikFHhfaI/Screenshot%202023-10-18%20at%2015.03.25-nwg.png) ## Configure Business Relationships To set up the basic functionality, you need to identify the customers (and their shipping addresses) whose sales transactions should be processed via EDI. To do this, open the "simpleEDI - Business relationships" page. ![Business Relationships Page](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/TRU2joOyngjQfBMYJUW6dxDup7RzkukIum2QQHBDHfk/Screenshot%202023-10-18%20at%2015.12.15-ECk.png) If you have previously entered GLNs into customer cards and/or shipping addresses, you can sync this information into the list used for this module. ![Sync GLN Information](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/yNGOa7EsaebtUSWP2wYz7qUqXN_NSv3QCjXfBeRmdWI/Screenshot%202023-10-18%20at%2015.12.40-5h4.png) Select the "Business relationship with Procuros" checkbox to enable the possibility of exchanging data via Procuros. For each customer, you also have to decide which type of document you want to send via Procuros. ![Enable Procuros Relationship](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/agFKAphIe4kSuu4nyE8yYldGkJgdRhIUdI4j6cgz12A/Screenshot%202023-10-18%20at%2015.13.11-XbA.png) In the context of the customer, you also need to decide whether the submitted prices should be included in the order or (if this is not desired) whether the standard BC rules for prices and discounts of an item should be included in the order. ![Configure Pricing Options](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/0bKZMGI3SsOYIPAkddpHUBeWLyV5_W7YG8pyszeQin8/Screenshot%202023-10-18%20at%2015.13.57-fBU.png) If you have different shipping addresses for a customer, make sure you have entered a GLN and that you have enabled these addresses for transfer via Procuros. If the case arises that not all delivery addresses (and/or customers) should be sent via Procuros, you can deactivate the checkbox. After you have installed/published the simple|EDI module and synchronized your existing customers as described, you can also maintain the GLN on the customer card or on the delivery address card if you want. However, we recommend that you do this on our "simpleEDI - Business relationships" page, as you can activate and edit the individual entries more quickly here. ## Master Data Checklist Use this checklist to ensure that all necessary master data is correctly stored: * GLN stored for each trading partner * GLN stored for different billing and delivery addresses * Business relationship with Procuros enabled for relevant customers * Document types configured for each customer (orders, invoices, etc.) * Pricing options configured (submitted prices vs. standard BC rules) * All relevant shipping addresses enabled for Procuros transfer # Confirm/Reject Orders Source: https://docs.procuros.io/en/connectors/ms-business-central/receiving-documents/confirm-reject-orders Learn how to confirm, modify, or reject orders received from your trading partners ## Confirm/Reject Orders To find orders initialized by Procuros, you can use the following call in your role center: ![Orders List View](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/UTYS6Dn_AuV2rpczvdOaQFw2nGh5G3F9hR99GJ16_Es/Screenshot%202023-10-18%20at%2015.29.50-q-A.png) In this list view you will only find customer orders that were submitted successfully and without errors. This means that the following records were successfully found in your system: * Customer (sales, invoice recipient) via GLN * Delivery address via GLN (if different from the selling customer's GLN) * Position(s) via GTIN * Unit of measure(s) (in the unit of measure list and in the allocation table) It depends on your institution (see Business Relationships table) whether the unit price is taken from Procuros or from your data in BC. If address identifiers are transferred from Procuros, they are not transferred to the sales order document. As with "non-Procuros customer orders", the address data is taken from your BC. ## Order Approval Workflow After importing the orders, you can use a standard approval workflow to request and approve the document. If you have not activated an approval workflow, the document is automatically released after changing the simple|EDI status field: ![EDI Status Field](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/qmCrvLkxF1WxRdicK0H8W5fmzSauxVQB7E4Ityy_LkM/Screenshot%202023-10-18%20at%2015.31.37-jb8.png) ## Order Status Options So you have the following options: If you have no changes, such as adding items, changing the quantity or delivery date, you can mark this order as accepted. Each line (or all lines) of the sales order that you want to ship and invoice as a whole. If you have changed the order, mark it as "changed". This allows you to partially ship and invoice the order if you wish. If you do not want to process this order, mark it as such. If you have set an immediate reply to Procuros, selecting this option will delete the document immediately. If you submit the order confirmation manually, the order will be deleted after successful transmission. Depending on your settings, this status will be sent to Procuros immediately after entering the status or manually in response to the order. ## Error Handling You may receive an error message if you try to select any of these options. This is because the following mandatory fields are checked when the EDI status is changed: * The invoice recipient's VAT ID is not empty * The customer and his delivery address and, if applicable, "invoice recipient" are activated in the simple|EDI business relationship table * Name, address, city, postal code, contact person name and region code are filled (for sales, delivery and invoice recipients) According to the standard functionalities, you can delete the sales order until a delivery is booked. The filled "simple|EDI status field" does not prevent deletion. # Receiving Orders from Trading Partners Source: https://docs.procuros.io/en/connectors/ms-business-central/receiving-documents/receiving-orders Learn how to receive and process orders from your trading partners in Business Central ## Receive orders from your trading partners Once you have prepared your data for incoming and outgoing transactions, you can import the first customer orders into your system. Depending on your setup, this can be done through the job queue or manually. The manual import can be accessed via the role center: ![Manual Import Role Center](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/LmeIjfdf9sTydcbKtkHy1T-UV9M8_wcyXaGvsL8TBUg/Screenshot%202023-10-18%20at%2015.25.41-f9I.png) ## Error Handling If the import of one or more transactions was unsuccessful, you will see an error entry in your role center: ![Error Entry Role Center](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/gdCeU8KHVcJZKG0VhF_3wZMqPyVgsQscG2B32JjpDMU/Screenshot%202023-10-18%20at%2015.26.19-Xdw.png) We recommend that you go to the Procuros portal to see what error occurred. There you can resend the transaction to your Business Central and run the import function again. ## Log Archive If you want to see all the log entries in your system, you can open the log archive: ![Log Archive](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/fAHY74ccOH4YFGqEavgBkJjxNGdj_Rua3BFfp_RGFQE/Screenshot%202023-10-18%20at%2015.27.02-ugU.png) Here you can also find the reasons for the errors and whether these reports have been sent to Procuros: ![Log Details](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/P4Cg7rI8lDZ_vd0bEb-ZNstxB6A2phw5Bw1Lf4KxEuA/Screenshot%202023-10-18%20at%2015.27.33-Ilk.png) The log archive provides detailed information about all transactions processed through the simple\_EDI app, including success and error status for each document. # Send Delivery Notes Source: https://docs.procuros.io/en/connectors/ms-business-central/sending-documents/delivery-notes Learn how to send delivery notes to your trading partners through Business Central ## Send Delivery Notes You can use almost all functions and options of the standard BC for released documents. The simple|EDI status "accepted" or "changed" is a requirement for posting shipments and/or invoices, regardless of whether the order response must be sent via Procuros or not. This is because some mandatory fields cannot be edited subsequently. ## Order Status Requirements Please remember the following: ### Accepted Status If the sales order has the simple EDI status "accepted": Only complete shipments are permitted for an order line. Therefore, the "quantity to ship" in each line must be either zero or equal to the original quantity: ![Accepted Status Shipment](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/GZ7P7Fqu5Ia2n7bXgc-Vsess3zyyJkdXfEwuHIj6ZOs/Screenshot%202023-10-18%20at%2015.35.37-5SM.png) The second line cannot be processed this way. ### Changed Status The sales order has the simple|EDI status "modified": it is possible to book the shipment in whole or in part: ![Changed Status Shipment](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/j7QQdb7gwRhwZ9Mjmf-wiszdGkWp5pdke2w2W-kfK_c/Screenshot%202023-10-18%20at%2015.35.58-dkw.png) If you do not plan to send an order confirmation to Procuros, we recommend the "modified" option to be more flexible. ## Important Remarks For all outgoing documents, please check whether you have set the transmission to "manual" or "interval-based" on the simpleEDI setup page. If they are not set to "interval-based" they will not be sent automatically. Instead, you have to send them manually from the sales order list or from the Role Center page. ## Delivery Note Process Ensure the sales order has the required simple|EDI status ("accepted" or "changed") before posting shipments. For "accepted" orders: Only complete shipments are allowed (quantity to ship must be zero or equal to original quantity). For "changed" orders: Partial shipments are permitted. Use the standard Business Central shipment posting process. The simple\_EDI app will handle the delivery note transmission. Verify your transmission settings are configured for automatic or manual sending as required. The simple|EDI status is a critical requirement for posting shipments. Make sure the order has been properly processed through the confirm/reject workflow before attempting to post delivery notes. Delivery notes are automatically generated when shipments are posted and will be sent to Procuros based on your transmission configuration and business relationship settings. # Send Invoices Source: https://docs.procuros.io/en/connectors/ms-business-central/sending-documents/invoices Learn how to send invoices to your trading partners through Business Central ## Send Invoices After the shipment, the "order decision" influences the options for posting an invoice. ![Invoice Posting Options](https://cdn.elev.io/file/uploads/HtCBL3r5zap4ITiuJ39dA9VqDKIf2Pl11yhl_S3kqkE/vOI-HIR6UItAHYDMkFc8fSk5o6Xtl8Phj-Utop20g6k/Screenshot%202023-10-18%20at%2015.37.20-gKA.png) We do not currently support the ability to send a single sales invoice to Procuros via the API. So you cannot use the "get shipment Lines..." function to separate an invoice from your order. ## Important Remarks For all outgoing documents, please check whether you have set the transmission to "manual" or "interval-based" on the simpleEDI setup page. If they are not set to "interval-based" they will not be sent automatically. Instead, you have to send them manually from the sales order list or from the Role Center page. The invoice sending process is directly linked to the order confirmation workflow. Make sure your order decisions are properly configured before attempting to send invoices. ## Invoice Sending Process Ensure that the shipment has been completed and the order decision has been made (Accepted, Changed, or Rejected). Verify that your transmission settings are configured correctly on the simpleEDI setup page. Use the standard Business Central invoice posting process. The simple\_EDI app will automatically handle the transmission to Procuros based on your settings. If transmission is set to "manual", you must manually trigger the sending process from the sales order list or Role Center. The invoice will be automatically sent to Procuros once posted, provided your transmission settings are configured for automatic sending. The system will use the business relationship settings to determine which trading partners should receive the invoice. # Procuros SFTP Details Source: https://docs.procuros.io/en/connectors/sftp/sftp Technical information for connecting to Procuros via SFTP Procuros SFTP connection enables secure document exchange between you and your trade partners. This connection method supports EDIFACT documents and provides a reliable way to transfer business documents like orders and invoices through our network. ## Technical Details ### Connection Information Our SFTP server connection requires specific credentials and settings for proper operation. * **SFTP Server Address (Endpoint)**: sftp.procuros.io * **Port**: 22 (SSH) * **Username**: Provided by Procuros * **Password**: Provided by Procuros Password authentication is preferred but public key authentication is also available. ### Directory Structure The SFTP connection uses a specific directory structure to organize document flow. * **Inbound directory** (You → Procuros): `partner2procuros` * **Outbound directory** (Procuros → You): `procuros2partner` You can upload **any** file format (including .csv, .edi, .xml, .desadv, .invoic, .txt) Custom directory structures as required by your EDI software are possible. Please inform Procuros about your specific requirements. ## Using Your Own SFTP Server If you prefer to use your own SFTP server for document exchange, we can connect to it. Please whitelist all of the following **outbound** IP addresses so that Procuros can connect to your server: * 3.70.10.129 * 3.76.51.85 * 3.76.66.206 * 52.28.170.162 * 52.59.155.142 Please ensure all of the IP addresses above are whitelisted in your firewall or security settings. Please share the following information with our team: * Your SFTP Server Address * Port number * Username * Password * Directory Structure ## Frequently Asked Questions Currently, we only provide EDIFACT documents via SFTP. Share the **outbound** IP addresses listed in the table above. These are the IPs Procuros connects from when reaching out to third-party SFTP servers. For partners sending documents **to** Procuros, they need to whitelist our **inbound** IP addresses. These are tied to the AS2 proxy's Network Load Balancer. Please contact the Procuros Solutions Team for the current inbound IP addresses. ## Technical Support If you need assistance with SFTP setup or encounter any issues: * **Contact**: Solutions Team * **Email**: [help@procuros.io](mailto:onboarding@procuros.io) # How to set up Article Hierarchies Source: https://docs.procuros.io/en/connectors/weclapp/features/article-hierarchies Step by step guide to setting up article hierarchies in Weclapp ## Creation of Article Hierarchy & Bills of Materials in Weclapp Create a new item in weclapp for a display, a box, a deposit item, etc. Article Hierarchy1 Jp Add a name, item number, and other parameters to the BOM. In the lower area on the same input mask, please select "Sales bill of material" for "Article type", then please click "Save and details". Article Hierarchy2 Jp Please make sure that all Items in the sub-items contain an EAN. Important! Please remember to enter the corresponding EAN in the "EAN field". Without an EAN, the Item information will not be sent correctly and the message will not be delivered to your Trade Partner. Article Hierarchy3 Jp You can then add the sub-items under the "Sales parts list sub-items" tab. Article Hierarchy4 Jp The EAN for the main item is absolutely necessary for the article hierarchy to be transmitted correctly. ### Specific Requirements - 3 Layer Article Hierarchies Some Trade Partners such as Edeka always require that the smallest consumer unit (unit that will be purchased by the end consumer) to be factorized and displayed on the invoice. Most ERP systems do not support multi (>2) level article hierarchies. For this reason, item master data must be set in a certain way in order for Procuros to pick them up correctly: 1. **Article hierarchies are correctly set up via the bill of material feature in weclapp** * When creating an article hierarchy, the correct article type is selected. Only then you can add the child items to the parent item * Make sure all the quantities and prices are correctly set 2. **Make sure all the quantities and prices are correctly set** * In weclapp you can decide whether you want the parent item or the child items to be the invoiced items (having a price) * Please select the correct case for your use cases by ticking or not ticking the appropriate fields on the article configuration page 3. **The GTIN of the article hierarchy is either unique or the same as the article that only has another deposit article** * The GTIN of the article hierarchy should be unique, such that Procuros can find one article if a customer orders one * In case the article hierarchy is being used for deposit articles, it is fine that the same GTIN is being used for the main article and the article hierarchy 4. **Article Hierarchy SKU Breakdown** * Make a copy and fill in following [Article Hierarchy SKU Breakdown](https://docs.google.com/spreadsheets/d/1Zil6O7QbsRHl41mjxhK7Arc-0ioM-7uSUvyJXyC-IfA/edit?gid=0#gid=0) * Procuros will then use this Article Hierarchy to correctly process and send the documents to Trade Partners # How to set up Batches Source: https://docs.procuros.io/en/connectors/weclapp/features/charges Step by step guide to setting up batches in Weclapp ### Batch Setup in Weclapp Batches are stored using the 'Stock Movement' Feature in Weclapp. Batches are added to Line Items on shipments. Expiration dates are added to all batches. Multiple batches are added by adding a new line item. The correct management of batches and best-before dates is particularly important for companies subject to legal traceability obligations. # How to set up Deposits Source: https://docs.procuros.io/en/connectors/weclapp/features/deposits Step by step guide to setting up deposits in Weclapp ### Deposit Article Setup in Weclapp It is necessary that your Deposit Articles are also assigned a GTIN. GTINs for deposit items can be generated on [**GS1's Check Digit Calculator**](https://www.gs1-germany.de/serviceverzeichnis/pruefziffernrechner/#c418). **Step 1** The Deposit Article must be set up as a single item. The "Product group" must be set to a "Deposit". The "Unit of measure" must also be a "Deposit" (not a "Piece", for example). This can be set universally in the settings for the "Unit of measure". The Deposit Article requires a GTIN/EAN (set up beforehand). **Step 2** Articles with a Bottle Deposit must be created as a "Parts List". Parts Lists can be created in weclapp. A separate Bill of Materials (BOM) is therefore required for each item subject to a deposit. Each of these BOMs must be created with the following parameters: * the item for which a deposit is charged * the Deposit article with the "Unit" set as "deposit" * Important: the deposit product must correspond to the container size of the product: e.g. 4x water → 4x deposit (= 1 item), and NOT 4 x 1x deposit (= 4 items) * the EAN/GTIN of the deposit item The corresponding EAN/GTIN is then deleted from the deposit item itself and added to the BOM, the deposit item must be assigned a newly generated EAN/GTIN. Using the Unit of Measure (Deposit) it is then possible to differentiate between the deposit product and the deposit item. Customer Masterdata Article DEPOSIT Jp # How to set up Discounts Source: https://docs.procuros.io/en/connectors/weclapp/features/discounts Step by step guide to setting up discounts in Weclapp Weclapp allows for two types of discounts: Header level discount & Article level discount. ### Header Level Discount * The Header level discount will apply to the whole document / all articles * You can create Header level discounts by going into the specific 'Customer Tab' → 'Sales surcharges and discounts' tab' and then apply them for the respective customer * IMPORTANT: If your traded items include a deposit article (such as bottle deposit), the discount must be setup at item level so that the discount is not applied to the deposit amounts Headerdiscount Jp ### Item Level Discounts A distinction is made between generally applicable Item Level discounts and trading partner-specific scenarios (option 1 & option 2). You then link the product groups to relevant articles. **Option 1: General Discount - Applied to all Trade Partners** The following describes how to create discounts for material groups that apply to **all** business partners. Navigate to "Merchandise categories" in the "Articles" menu and select an existing product group or create a "+ New merchandise category" Articlediscount1 Jp Add the Item Level discount to the product group in the "Surcharge and reduction" tab by clicking on "+ Surcharge and reduction" Articlediscount2 Jp In the window that opens, select the appropriate type (Surcharge / Reduction), Sales Channel, Percentage value and Start date. Then please save. Articlediscount3 Jp **Option 2: Specific Discount - Applied to individual Trade Partner/s** The following describes how to create the material group and corresponding discounts for **one or more** specific business partners. Navigate to the customer for whom the discount should apply and open the tab "Sales surcharges and discounts". There you can either add new entries (via "+ Surcharge and discount sale") or edit existing entries Articlediscount4 Jp In the window that opens, select the product group you just created. And please select the distribution channel, discount percentage and start date, then please save. Articlediscount5 Jp **Link merchandise category to article** Link the category to a relevant article. If you only want to configure parts of an item bill of materials (e.g. the individual item without a deposit in a bill of materials), it is important that the product group of this individual item is created and linked accordingly. Articlediscount6 Jp The article will be displayed in the corresponding product group. Articlediscount7 Jp The stored discounts are taken into account for the configured customers. # How to set up Fulfillment Source: https://docs.procuros.io/en/connectors/weclapp/features/fulfilment Step by step guide to setting up fulfillment in Weclapp ## Setting up the fulfillment integration for 3PL documents * The shipping instructions are sent to the fulfillment service provider (3PL) as soon as the corresponding delivery note has the status "created" in weclapp * As soon as the fulfillment service provider (3PL) sends a shipping instruction feedback to weclapp, the status of the corresponding delivery note in weclapp is automatically changed to "sent" ### Setting Up Warehouse A warehouse must be set up in weclapp for each fulfillment service provider. In this way, Procuros can distinguish between different fulfillment service providers and the associated warehouses. Warehouse11 Jp Go to Settings → Warehouse and create / edit a warehouse entity. Warehouse21 Jp Add all the required details: * Warehouse name * The delivery address of the Warehouse * GLN - without the GLN, Procuros will not be able to send the document to the correct Fulfiller Warehouse3 Jp Please then send the relevant warehouse identifier ("ID") to Procuros. To do this, open the relevant warehouse and copy the ID that you can find in the URL. Procuros needs this information to identify the specific Warehouse. Without the GLN, Procuros cannot send the document to the correct Fulfiller. ### Sending a Dispatch Instruction Make sure the *shipment* is in weclapp status "*Delivery note created*". The shipment you choose for testing must have a "date" AFTER `activeFromDate`. Make sure the correct *Warehouse / Lager* is selected while creating the *shipment*. Ensure the following mandatory data fields are filled on the shipment: * *Customer order number* * *Shipping date* # Overview Weclapp Connector Source: https://docs.procuros.io/en/connectors/weclapp/getting-started/overview Overview of the capabilities and benefits of the Procuros Weclapp Connector ## Overview of the Weclapp Connector The Procuros Weclapp Connector enables integration between your Weclapp ERP system and the Procuros platform, allowing automated exchange of business documents between you and your business partners. ## Supported Document Types The Weclapp Connector currently supports the following document types: Receiving: * Orders * Dispatch Instruction Response Sending: * Shipping Notice * Dispatch Instruction * Invoice * Credit Note ## Benefits of Integration * **Optimized Workflows**: Streamlines data exchange between you and your business partners. * **Enhanced Capabilities**: Includes support for discounts, deposit items, product hierarchies, bills of materials, and batches. * **Automated Document Handling**: Procuros seamlessly processes business documents automatically. # How to connect your Weclapp instance to Procuros Source: https://docs.procuros.io/en/connectors/weclapp/getting-started/technical-setup Step by step guide to setup your technical connection between your Weclapp and Procuros ## Setting Up Authentication The *Procuros Weclapp Connector* must be granted access to your Weclapp system so that Procuros can automatically process your business documents. The following instructions will help you create the correct access data and make the necessary configurations. Click on your initials in the top right corner to access the Weclapp settings. API1 Jp Create a new API token for the Procuros integration. API2 Jp Create a new API name, e.g., "Procuros". API3 Jp Save the new API token. API4 Jp Please provide Procuros with the following information (ideally through the portal, alternatively via the onboarding form): * *Weclapp API-URL* → copy from the browser line * *Weclapp API name* * *Weclapp API token* ## Setting Up Procuros Free-field The default Procuros setup is that all documents correctly created will be sent to a Trade Partner for which you are connected with. If you prefer to filter/send only certain documents for a Business Relationship with a Trade Partner, you will need to configure a Free-field. Navigate to Settings ("Gear") and click "Additional Fields", then "Manage Additional Fields". This usually requires a user with administration rights. Freefield1 Jp Click on "+ New additional field". Freefield2(4) Jp Please enter the following setup values completely and then save them: * Captions: PROCUROS * Linked Entities (via "+ New Link"): Quote, Order, Order Line, Purchase Order, Purchase Invoice, Customer/Prospect, Vendor, Delivery, Invoice, Goods Receipt * Data type: list (single selection) * Active: yes * Show on overview pages: yes * Show when creating: yes * Manage values (via "+ Add"): CUSTOMER * Active: yes Freefield3 Jp In the same view ("Manage additional fields") from the address line of the browser, please note the "entityID" value. Please pass this value on to Procuros. For each trading partner/customer, please enter the value "Customer" in the Procuros free field that has just been created. Freefield4 Jp Only Trade Partners/Documents marked with this Free-field will be pulled by the Procuros Weclapp Connector. ## Testing the Connection After configuring the API credentials and the Procuros free field, a connection test should be performed: 1. Procuros sets up the connector with your access data 2. A test document is created to verify correct transmission 3. After successful verification, you will be informed about the operational connection Ensure that all required information has been correctly transmitted to Procuros to ensure a successful connection. ## Troubleshooting If problems occur during setup: 1. **API Access Rights**: Ensure that the created token has sufficient rights 2. **Free-field Configuration**: Check if the Procuros free field is correctly set up and assigned to trading partners 3. **Weclapp Version**: Confirm that your Weclapp version is compatible with the connector If problems occur, contact the Procuros support team at [help@procuros.io](mailto:help@procuros.io) with a detailed description of the problem. # How to setup Article Master Data in Weclapp Source: https://docs.procuros.io/en/connectors/weclapp/master-data-configuration/article-master-data Step by step guide to configure your article master data ### Article GTIN / EAN Create the GTIN/EAN in the article master data of your articles that you use in transactions with your trading partners. To do this, open the item card of a corresponding item and store the GTIN/EAN in the "EAN" field. Customer Masterdata Article EAN Jp You will also need to provide an article number and the description of the item. Please be careful not to include spaces or other special characters - the GTIN / EAN must adhere to the GS1 standards. ## Master Data Checklist Use this checklist to ensure that all necessary master data is correctly stored: * GTIN/EAN stored for each article relevant for trade * Article number and description filled out for each article * Format of GTIN/EAN correct (no spaces, only numeric characters) ## Special Adaptations for Special Article Types For special article types such as bills of materials, deposit items, or hierarchical article structures, additional setups are required. These are explained in more detail in the corresponding sections under "Connector Features": * Article Hierarchies / Bills of Materials * Deposit Articles * Batches & Best Before Dates The correct setup of your master data forms the foundation for successful integration with Procuros and your trading partners. # How to setup Customer Master Data in Weclapp Source: https://docs.procuros.io/en/connectors/weclapp/master-data-configuration/customer-master-data Step by step guide to configure your customer master data ### Creating Trading Partner GLNs Open a customer's customer card and add or change addresses by clicking on the "plus" sign. Masterdata Opencustomercard Jp Check all boxes relevant to this address. Pay attention to different billing or delivery addresses. These must be created separately - details can be found in the official Weclapp documentation. Masterdata Customer GL Nandaddress Jp Paste the GLN into the appropriate field located at the bottom. Please be careful not to include spaces or other special characters - the GLN must adhere to the GS1 standards. ### Creating Trading Partner Sales Tax IDs Set up the sales tax ID / VAT ID in your customer's master data. To do this, open a corresponding customer and in the "Overview" tab scroll down to the "VAT ID number" field and enter the customer's VAT ID there. Customer Masterdata VAT Jp The correct setup of the VAT ID is particularly important for the correct tax treatment in cross-border trade. ## Master Data Checklist Use this checklist to ensure that all necessary master data is correctly stored: * GLN stored for each trading partner * GLN stored for different billing and delivery addresses * VAT ID stored for each trading partner * Procuros free field filled out with "CUSTOMER" value for each relevant trading partner # Sending Credit Notes Source: https://docs.procuros.io/en/connectors/weclapp/sending-documents/credit-notes Step by step guide to sending credit notes from Weclapp to Procuros ## Credit Note Prerequisites IMPORTANT! An invoice associated with the credit is mandatory for setup. * Procuros can only send credit notes that are based on an existing invoice. Please ensure this is always the case. You can easily check this: * If you go to the "Documents" tab on the credit note, you should find the associated invoice. ### Required Fields * Invoicing-GLN * ShipTo-GLN * Article GTINs / EANs ### Credit Note Workflow Relevant credits are generated via the "Create credit" button. The "Create credit note" option is only displayed if you have previously selected "Create open items" for the associated invoice. In order for Procuros to be able to export the credit, it must have the status "Open items created". This status is achieved by simply saving the credit. ## Troubleshooting Document Sending If problems occur when sending documents: 1. **Missing mandatory fields**: Check if all required fields are filled out 2. **Incorrect status**: Make sure the correct status is set 3. **Missing master data**: Check if all necessary master data (GLN, GTIN, etc.) is stored 4. **Missing link for credit notes**: Check if the credit note is linked to an invoice For persistent problems, please contact Procuros support at [help@procuros.io](mailto:help@procuros.io) with a detailed description and the affected document numbers. # Sending Dispatch Instructions Source: https://docs.procuros.io/en/connectors/weclapp/sending-documents/dispatch-instructions Step by step guide to sending dispatch instructions from Weclapp to Procuros ### Fulfillment Integration Setup In order to be able to use the Procuros fulfillment function, your weclapp must be set up correctly so that Procuros can pick up the documents correctly. * The shipping instructions are sent to the fulfillment service provider (3PL) as soon as the corresponding delivery note has the status "created" in weclapp. * As soon as the fulfillment service provider (3PL) sends a shipping instruction feedback to weclapp, the status of the corresponding delivery note in weclapp is automatically changed to "sent". ### Warehouse Configuration A warehouse must be set up in weclapp for each fulfillment service provider. In this way, Procuros can distinguish between different fulfillment service providers and the associated warehouses. Go to Settings → Warehouse and create / edit a warehouse entity. Add all the required details: * Warehouse name * The delivery address of the Warehouse * GLN - without the GLN, Procuros will not be able to send the document to the correct Fulfiller Please then send the relevant warehouse identifier ("ID") to Procuros. To do this, open the relevant warehouse and copy the ID that you can find in the URL. Procuros needs this information to identify the specific Warehouse. Without the GLN, Procuros cannot send the document to the correct Fulfiller. ### Dispatch Instruction Flow Make sure the *shipment* is in weclapp status "*Delivery note created*". The shipment you choose for testing must have a "date" AFTER `activeFromDate`. Make sure the correct *Warehouse / Lager* is selected while creating the *shipment*. Ensure the following mandatory data fields are filled on the shipment: * *Customer order number* * *Shipping date* ## Troubleshooting Document Sending If problems occur when sending documents: 1. **Missing mandatory fields**: Check if all required fields are filled out 2. **Incorrect status**: Make sure the correct status is set 3. **Missing master data**: Check if all necessary master data (GLN, GTIN, etc.) is stored 4. **Missing link for credit notes**: Check if the credit note is linked to an invoice For persistent problems, please contact Procuros support at [help@procuros.io](mailto:help@procuros.io) with a detailed description and the affected document numbers. # Sending Invoices Source: https://docs.procuros.io/en/connectors/weclapp/sending-documents/invoices Step by step guide to sending invoices from Weclapp to Procuros ### Invoice Prerequisites Create a (test) invoice that can be exported from Procuros and sent to your trading partners for testing purposes to obtain your trading partner's approval for this document type. The procedure for sending this document type is then the same in productive operation. **The basic requirement** is that you meet the requirements of this [**weclapp checklist**](https://help.procuros.io/en/articles/64). ### Required Fields * Invoicing-GLN * ShipTo-GLN * Article GTINs / EANs Missing or incorrect information in these mandatory fields can lead to rejection of the invoice by the trading partner. ### Invoice Status Configuration For Procuros to export the invoice and send it to trading partners, the invoice must have a certain status. In the standard configuration, invoices with the status "Open items created" are picked up by Procuros. ### Process for Sending Invoices Create an invoice from a corresponding order/shipping notice. Make sure the invoice has the status "Open items created". If all prerequisites are met, the invoice will be automatically exported by Procuros. ## Troubleshooting Document Sending If problems occur when sending documents: 1. **Missing mandatory fields**: Check if all required fields are filled out 2. **Incorrect status**: Make sure the correct status is set 3. **Missing master data**: Check if all necessary master data (GLN, GTIN, etc.) is stored 4. **Missing link for credit notes**: Check if the credit note is linked to an invoice For persistent problems, please contact Procuros support at [help@procuros.io](mailto:help@procuros.io) with a detailed description and the affected document numbers. # Sending Shipping Notes Source: https://docs.procuros.io/en/connectors/weclapp/sending-documents/shipping-notices Step by step guide to sending shipping notices from Weclapp to Procuros ### Shipping Notice Prerequisites Create a (test) shipping notice that can be exported from Procuros and sent to your trading partners for testing purposes to obtain your trading partner's approval for this document type. The procedure for sending this document type is then the same in productive operation. **The basic requirement** is that you meet the requirements of this [**weclapp checklist**](https://help.procuros.io/en/articles/64). ### Shipment Requirements * A corresponding order must be available * Mandatory fields that must be filled in on all related documents (order): "Customer Order Number", "Planned Delivery Date", GLNs * Important: In order for Procuros to export this document, the document must be in the weclapp workflow status "created" Missing or incorrect information in these mandatory fields can lead to rejection of the shipping notice by the trading partner. ### SSCC / NVE Some Trade Partners will request you to provide the SSCC / NVE number (18-digit GS1 Identification Key used to identify a logistic unit) on each Shipping Notice for a warehouse delivery. Weclapp currently does not support a SSCC / NVE function. In order for you to provide this number, there are two options: * A direct connection with your fulfillment provider (3PL) - please see **Fulfillment integration** tab for more information * Direct input on our Portal, after the document has been created in weclapp ### Shipping Document Creation Flow Create a shipping notice from a corresponding order. Make sure the shipping notice has the status "created". If all prerequisites are met, the shipping notice will be automatically exported by Procuros. If SSCC/NVE is required, enter this information via the Procuros portal or use the fulfillment integration. ## Troubleshooting Document Sending If problems occur when sending documents: 1. **Missing mandatory fields**: Check if all required fields are filled out 2. **Incorrect status**: Make sure the correct status is set 3. **Missing master data**: Check if all necessary master data (GLN, GTIN, etc.) is stored 4. **Missing link for credit notes**: Check if the credit note is linked to an invoice For persistent problems, please contact Procuros support at [help@procuros.io](mailto:help@procuros.io) with a detailed description and the affected document numbers. # Procuros x400 Details Source: https://docs.procuros.io/en/connectors/x400/x400 Technical information for connecting to Procuros via x400 ## Technical Contact Person If you have questions about X.400 setup or technical issues, the following contact options are available: * Email: [help@procuros.io](mailto:help@procuros.io) * Phone: +49 40 87709293 ## X.400 Address Information The following address table contains all necessary components of the Procuros X.400 address: | Address Component | Value | | - | - | | C (Country) | DE | | A (ADMD) | VIAT-AS2 | | P (PRMD) | | | S (surname) | Procuros | | G (Given name) | | | O (organization) | Procuros-GmbH | | CN (Common Name) | Procuros | | n-id | 2063352 | Ensure that all address components are entered exactly as specified in your X.400 system. Empty fields should not be transmitted. Enter the X.400 address components specified above into your X.400 system. After configuration, we recommend performing a test transmission to verify correct setup. The X.400 connection can be used for both production and test environments. # How to set up Article Hierarchies Source: https://docs.procuros.io/en/connectors/xentral/features/article-hierarchies Step by step guide to setting up article hierarchies in Xentral ## What are Article Hierarchies/Bills of Materials? Article hierarchies and bills of materials enable the structured representation of composite products. ### Basic Requirements for Article Hierarchies * Each bill of materials must be linked to individual articles (including GTINs/EANs) * Bills of materials should contain corresponding sub-positions in appropriate numbers with article prices * Prices should (if possible) be listed at the level of the individual sub-positions ## Map parts list via Procuros * **Artikelhierarchie-SKU-Breakdown** * Create a copy and complete the following item hierarchy SKU breakdown: [**Artikelhierarchie-SKU-Breakdown**](https://docs.google.com/spreadsheets/d/1Zil6O7QbsRHl41mjxhK7Arc-0ioM-7uSUvyJXyC-IfA/edit?gid=0#gid=0) * Procuros will then use this item hierarchy to process and send the documents to trading partners correctly The correct representation of article hierarchies is important, as many trading partners expect these to be correctly displayed in invoices. # How to set up Batches Source: https://docs.procuros.io/en/connectors/xentral/features/charges Step by step guide to setting up batches in Xentral ## What are Batches? Batch management enables product traceability and is particularly important in the food and pharmaceutical industries. ### Setting Up Batches First, navigate to batch management in the Xentral system settings. Chargen (1).jpg Create a new Report and name it: Procuros: Gelieferte Chargeninformationen Chargen 11.jpg Create a new variable with the following values: * the variable name must be LIEFERSCHEINID * the ‘default value’ must be an ID from a delivery note that contains batches: * to find this ID, go to a delivery note that contains batches that already exist in your system * open this delivery note * copy the ID from the URL and enter it in the Default value field Chargen 7.jpg Copy the following SQL-Code-Snippet and paste it into the SQL Field. Click the play-Button afterwards. ``` SELECT *FROM mhd_log WHERE doctype = 'lieferschein' AND doctypeid = '{LIEFERSCHEINID}' ``` Chargen 8.jpg Click on "generate columns" Chargen 9.jpg Go over to the "Transfer"-Tab and set the following API Access settings: Chargen 10.jpg Open the report and you will find the ID in the URL (e.g. ...\&id=170). This number must be sent to Procuros. If you are not sure which number to use, simply send us the entire link. Send an e-mail to [edi@procuros.io](mailto:edi@procuros.io) - we will then store this ID in our system. ### Managing Best-Before Dates Closely connected to batch management is the management of best-before dates: Activate the management of best-before dates in the article settings MHD1 (1).jpg Navigate to Best Before + Batch and enter the number of items, the corresponding best-before date and the desired storage location of the item. MHD3 (2).jpg The correct management of batches and best-before dates is particularly important for companies subject to legal traceability obligations. # How to set up Deposits Source: https://docs.procuros.io/en/connectors/xentral/features/deposits Step by step guide to setting up deposits in Xentral ## What are Deposits? The configuration of deposit items enables correct billing and management of deposit fees. ### Setting Up Deposit Items Create a separate article in Xentral for each type of deposit (e.g., bottles, crates). Assign a unique GTIN/EAN to each deposit item. Mark the article as a deposit item in the system. ### Bills of Materials for Articles with Deposits Bills of materials must be created for articles with deposits: Create a bill of materials that contains both the main article and the deposit item(s). Specify the correct number of deposit items per main article. Store the prices for both the main article and the deposit items. # How to set up Discounts Source: https://docs.procuros.io/en/connectors/xentral/features/discounts Step by step guide to setting up discounts in Xentral ### Header Discounts (e.g., Invoice Discount) Header discounts are applied at the document level: Enter the discount in the discount field of the document. Rabatt (1).jpg For multiple discount levels, calculate the total combined discount and enter it. Depending on how the discounts are applied you need to calculate them differently. You can find a spreadsheet tool to help you calculate the combined discount [here](https://docs.google.com/spreadsheets/d/186BCs-W_IrTwNoSy5CIm7iN-9fu6deYzAzBZmOraw1w/edit?gid=0#gid=0). ### Calculation Examples for Discounts 1. **Combined discount with different discount levels**: * Example: 4% cash discount and 1.5% invoice discount plus 3% central purchasing discount * Formula: `(1-((1-0.04)\*(1-(0.0015+0.03))) = 5.09%` 2. **Sum discount at the same level**: * Example: 2% logistics discount and 1.5% invoice discount, which apply to the same level (initial price) * Formula: `0.02+0.015 = 3.5%` The correct calculation and representation of discounts is important for the acceptance of invoices by your trading partners. # How to set up Fulfillment Source: https://docs.procuros.io/en/connectors/xentral/features/fulfilment Step by step guide to setting up fulfillment in Xentral ## What is fulfillment? The fulfillment integration enables the connection of logistics service providers to your Procuros workflow. ### Warehouse Configuration for Fulfillment Set up a warehouse for each fulfillment provider in Xentral under "Warehouse Management". Lager (1).jpg Assign each warehouse its own, exclusive project. LAger2 (1).jpg Assign each warehouse an address of the fulfillment service provider that contains the "ship to GLN". LAger3 (1).jpg Each project may only be assigned to a single warehouse. If the same project is assigned to multiple warehouses, Procuros cannot pick up the correct documents. ### Project IDs for Fulfillment The project IDs are crucial for the correct assignment of shipments: The project IDs can be found in the URL of the project page in Xentral. Share these IDs with the Procuros team so they can be stored on their side for correct identification. ## Summary of Features The advanced features of the Procuros Connector offer extensive possibilities to optimize your business processes and improve data exchange with your trading partners. By correctly configuring these functions, you can fully exploit the capabilities of the connector. * Batch and BBD management activated and configured * Article hierarchies/bills of materials correctly set up * Deposit items created and linked to main articles * Tax rates configured for all scenarios * Discount structures defined and tested * Fulfillment integration set up with correct warehouse and project settings If you have questions about setting up or using these features, please contact the Procuros support team at [help@procuros.io](mailto:help@procuros.io). # Overview Xentral Connector Source: https://docs.procuros.io/en/connectors/xentral/getting-started/overview Overview of the capabilities and benefits of the Procuros Xentral Connector The connector links your Xentral system with the Procuros platform and enables automated exchange of business documents. ## Supported Document Types The Xentral Connector currently supports the following document types: **Receiving:** * [Orders](/en/connectors/xentral/receiving-documents/orders) * Dispatch instructions Response * [Inventory reports](/en/connectors/xentral/receiving-documents/inventory-reports) **Sending:** * [Shipping notes](/en/connectors/xentral/sending-documents/shipping-notices) * [Invoices](/en/connectors/xentral/sending-documents/invoices) * [Credit notes](/en/connectors/xentral/sending-documents/credit-notes) * [Dispatch instructions](/en/connectors/xentral/sending-documents/dispatch-instructions) ## Benefits of the Procuros Xentral Connector * Simplification of data exchange between you and your trading partners * Automated document processing for more efficient workflows * Comprehensive data access to articles, customers, orders, and invoices * Bidirectional data exchange for receiving and sending documents * Support for discounts, deposit items, article hierarchies, and batches # How to connect your Xentral instance to Procuros Source: https://docs.procuros.io/en/connectors/xentral/getting-started/technical-setup Step by step guide to setup your technical connection between your Xentral and Procuros The setup of the Xentral Connector is done via a Personal Access Token in Xentral. Click on your username in the bottom left and select **Account Settings**. Xentral API Token (1).jpg Go to **Developer Settings > Personal Access Token**. Here you will see a list of all active tokens. Xentral API Token 7.jpg Click on **+ Create Token**. If no tokens are active, you will find the button in the center of the screen. Otherwise, it appears at the top right above your token list. Xentral API Token 8.jpg Enter a unique name for your token (maximum 50 characters). Xentral API Token 9.jpg Click on **Create Token**. The new token will appear on the screen. Xentral API Token 10.jpg Click on the copy icon to copy the token to the clipboard. Xentral API Token 11.jpg Keep the token safe, as it will not be displayed again after leaving the page. ## Token Scopes The token needs the following scopes so that Procuros can create orders and send documents in your Xentral: | Scope | Used for | | - | - | | `salesOrder:create` | Creating incoming orders | | `salesOrder:release` | Releasing incoming orders | | `deliveryNote:send` | Sending shipping notices | | `creditNote:send` | Sending credit notes | A token without these scopes cannot be used for the actions above. If you created your token before these scopes were required, create a new one that includes them. ## Enable the Delivery Notes Feature in Xentral Xentral enables the `api-v3-delivery-notes` feature flag per tenant. It must be enabled for your Xentral tenant, so please ask Xentral to activate it before the connection is switched. ## Submit Access Information to Procuros The following information is required for the setup: 1. **Xentral API URL**: This consists of your browser URL + "/api" 2. **Xentral PAT**: Encrypt this via [https://eu.onetimesecret.com/](https://eu.onetimesecret.com/) and send it by email to [help@procuros.io](mailto:help@procuros.io) 3. **Xentral Project ID**: If relevant for your integration Never transmit the Personal Access Token unencrypted via email. ## Test Connection After configuration by the Procuros team, a connection test is performed: 1. Procuros sets up the connector with your access data 2. A test document is created to verify correct transmission 3. After successful verification, you will be informed about the operational connection ## Troubleshooting If problems occur during setup: 1. **API Access Rights**: Ensure that the created token includes all the [scopes listed above](#token-scopes) and that the `api-v3-delivery-notes` feature flag is enabled for your tenant 2. **Firewall Settings**: Check if your firewall settings allow connections from Procuros 3. **Xentral Version**: Confirm that your Xentral version is compatible with the connector If problems occur, contact the Procuros support team at [help@procuros.io](mailto:help@procuros.io) with a detailed description of the problem. # How to setup Article Master Data in Xental Source: https://docs.procuros.io/en/connectors/xentral/master-data-configuration/article-master-data Step by step guide to configure your article master data For successful integration between your Xentral system and the Procuros platform, various master data must be correctly configured. This guide walks you through the necessary steps. ## Article Master Data Correctly stored article master data is crucial for error-free transmission of business documents. ### GTIN (Global Trade Item Number)/EAN A GTIN/EAN must be stored for each article that is traded with trading partners. Enter the GTIN/EAN in the appropriate field on the article card. Artikel (1).jpg Make sure the GTIN/EAN is known to all connected trading partners. Do not use spaces or non-numeric characters in the GTIN/EAN fields. ### Internal and External Article Identifiers If additional article identifiers are used: Determine which internal and external article identifiers are relevant for your trading partners. Enter these identifiers in the appropriate fields of the article card. ### Unit and Tax Class When Procuros creates an order in Xentral, the unit and the tax class of each line come from the article master data, not from the order message. Make sure both are correctly maintained on the article card. A line shows the unit of the article itself, typically "Stk". ### Disabled Articles An order line that points at a disabled article is rejected right away with an error that names the article identifier. To resolve it, re-enable the article in Xentral or correct the article mapping. ## Master Data Checklist Use this checklist to ensure that all necessary master data is correctly stored: * GTIN/EAN stored for each article relevant for trade * Format of GTIN/EAN correct (no spaces, only numeric characters) * Additional article identifiers stored as needed * Unit and tax class maintained on the article * Articles that are traded with trading partners are enabled The correct setup of your master data forms the foundation for successful integration with Procuros and your trading partners. # How to setup Customer Master Data in Xental Source: https://docs.procuros.io/en/connectors/xentral/master-data-configuration/customer-master-data Step by step guide to configure your customer master data For successful integration between your Xentral system and the Procuros platform, various master data must be correctly configured. This guide walks you through the necessary steps. ## Company Master Data The correct configuration of your company master data is a basic requirement for smooth communication with trading partners. ## Customer Master Data Specific data must be stored for each trading partner connected via Procuros. ### GLN (Global Location Number) Each trading partner needs an assigned GLN in the "GLN" field on the customer card ("Address"). Kunden-GLN (1).jpg Check the box for "Different billing address" and enter the GLN of the different billing address in the additional fields. Abw. Lieferadresse (1).jpg Do not use spaces or non-numeric characters in the GLN fields. ### VAT ID The VAT ID is a mandatory field for all trading partners connected via Procuros: Enter the ID in the "Payment Terms / Taxation" tab in the "VAT ID" field. Ust.ID (1).jpg Do not use spaces in the text field. Always use the same free field for the value "PROCUROS" for each customer to ensure consistency. ## Master Data Checklist Use this checklist to ensure that all necessary master data is correctly stored: * GLN correctly stored * VAT ID correctly stored * Additional identifiers stored as needed * GLN stored for each trading partner * GLN stored for different billing addresses * VAT ID stored for each trading partner * Procuros free field filled out for each trading partner The correct setup of your master data forms the foundation for successful integration with Procuros and your trading partners. # Receiving Inventory Reports Source: https://docs.procuros.io/en/connectors/xentral/receiving-documents/inventory-reports Step by step guide to receiving inventory reports in Xentral from Procuros. ## Receiving Inventory Reports Inventory reports are sent by a fulfilment provider to Xentral to update stock levels and manage inventory. ### Prepare your instance for receiving inventory reports A warehouse needs to be set up in Xentral for the fulfilment provider you're trying to connect with. The warehouse designation must be provided to Procuros. images/en/guides/xentral/xentral-warehouse-management.png All the products that are to be received in the inventory report must be properly set up in Xentral, including any wanted batch related option. images/en/guides/xentral/xentral-stock-product-edit.png Go to Settings > System > Process Starter and make sure that the process named "Übertragenmodul (Fulfillment, Übertragen, EDI, XML)" is activated and set to be running every 10 minutes. ### Create a new transfer for the inventory report Go to Settings -> Administration -> Data Exchange -> Transfers and click "Create New Transfer" images/en/guides/xentral/xentral-transfers.png * API: Select the relevant api account. If you don't have any, go to the APIs menu, in Settings -> Administration -> Data Exchange, and create one. * Transfer format: XML * Type: SFTP * Server: to be provided by Procuros * Port: to be provided by Procuros * Username: to be provided by Procuros * Password: to be provided by Procuros * Antwort-Speicherort (Eingang): to be provided by Procuros * Delete files after download: Checked/Active Anything not mentioned here can be left as default. * Stock numbers received: Checked/Active * Storage behaviour: "Override" * Display error message for unknown items: Checked/Active Anything not mentioned here can be left as default. Make sure you save the transfer settings after adjusting them. This will ensure that the transfer is correctly configured for receiving inventory reports. # Receiving Orders Source: https://docs.procuros.io/en/connectors/xentral/receiving-documents/orders Step by step guide to receiving orders in Xentral from Procuros. ## Receiving Orders Procuros creates the orders of your trading partners directly in Xentral, using the Xentral API. ## Prerequisites Make sure your API token has the `salesOrder:create` and `salesOrder:release` scopes. See [Technical Connection](/en/connectors/xentral/getting-started/technical-setup#token-scopes). Procuros creates the order in Xentral and then releases it. Decide whether incoming orders should arrive **released** or as a **draft**, and tell the Procuros team. We then set this status for your connection. You do not configure this in Xentral yourself. ## Troubleshooting If problems occur when receiving orders: The unit and the tax class of an order line are taken from the article master data in Xentral, not from the order message. A line therefore shows the unit of the article itself, typically "Stk". See [Article Master Data](/en/connectors/xentral/master-data-configuration/article-master-data#unit-and-tax-class). An order line that points at a disabled article is rejected right away with an error that names the article identifier. To resolve it, re-enable the article in Xentral or correct the article mapping. # Sending Credit Notes Source: https://docs.procuros.io/en/connectors/xentral/sending-documents/credit-notes Step by step guide to sending credit notes from Xentral to Procuros ## Sending Credit Notes Credit notes are used to correct invoices that have already been issued. ### Prerequisites for Credit Notes The following prerequisites must be met for sending credit notes: * A corresponding invoice must already exist * The credit note must be marked as a "**Cancellation invoice**" * Procuros only transmits credit notes of this type * Your API token has the `creditNote:send` scope (see [Technical Connection](/en/connectors/xentral/getting-started/technical-setup#token-scopes)) Only credit notes marked as "Cancellation invoice" are accepted by trading partners. This checkbox must be set when processing the credit note. ### Required Fields The following fields must be correctly filled out: * Customer order number (on order & delivery note) * Planned delivery date (on order & delivery note) * GLNs (Global Location Numbers) * Procuros free field on the customer * GLN of the delivery address on the customer ### Process for Sending Credit Notes Create a test cancellation invoice from a relevant existing invoice and mark it as a "Cancellation invoice". Gutschrift 2.jpg The document must be in the workflow status "approved". If all prerequisites are met, the cancellation invoice will be automatically exported by Procuros. Share the document number with Procuros and provide a PDF example. After positive feedback, credit notes can be sent regularly. # Sending Dispatch Instructions Source: https://docs.procuros.io/en/connectors/xentral/sending-documents/dispatch-instructions Step by step guide to sending dispatch instructions from Xentral to Procuros ## Sending Dispatch Instructions Dispatch instructions are used to inform fulfillment service providers about pending shipping activities. ### Set Up Fulfillment Integration The connector uses the same shipping function for delivery notifications and dispatch instructions. For integration with fulfillment service providers, there are specific requirements: 1. A separate warehouse is required for each fulfillment service provider 2. Each warehouse must be assigned a unique project 3. Each warehouse must be linked to an address of the fulfillment service provider ### Warehouse Configuration Set up a warehouse for each fulfillment provider in Xentral under "Warehouse Management". Assign each warehouse its own, exclusive project. The project name is the only mandatory field. Assign each warehouse an address of the fulfillment service provider that contains the "ship to GLN". Make sure that only one combination exists for each project/warehouse combination. The project IDs can be found in the URL of the project page. Share these IDs with Procuros. If the same project is assigned to multiple warehouses, Procuros cannot pick up the correct documents! ### Process for Sending Dispatch Instructions Make sure that the shipment has been assigned the correct project and fill out all mandatory fields (customer number, order number). The shipment and the associated delivery note must be in the status "approved". The dispatch instruction will be sent to the fulfillment service provider as soon as all conditions are met. Share the document number with Procuros and wait for positive feedback from the fulfillment service provider. ## Troubleshooting Document Sending If problems occur when sending documents: 1. **Missing mandatory fields**: Check if all required fields are filled out 2. **Incorrect workflow status**: Make sure the correct status is set 3. **Missing master data**: Check if all necessary master data (GLN, GTIN, etc.) is stored 4. **Incomplete batch information**: Check if all batch information is complete For persistent problems, please contact Procuros support at [help@procuros.io](mailto:help@procuros.io) with a detailed description and the affected document numbers. # Sending Invoices Source: https://docs.procuros.io/en/connectors/xentral/sending-documents/invoices Step by step guide to sending invoices from Xentral to Procuros ## Sending Invoices Invoices are a central component of the business process. The Procuros Connector enables automated and standardized transmission. ### Prerequisites for Invoices Before an invoice can be sent, the following prerequisites must be met: * A corresponding order must exist * All related documents (order and delivery note) must be correctly created * The basic requirements of the Xentral checklist must be fulfilled ### Required Fields The following mandatory fields must be filled out on all related documents (order **and** delivery note): * Customer order number * Shipping Note number * GLNs (Global Location Numbers) Missing or incorrect information in these mandatory fields can lead to rejection of the invoice by the trading partner. ### Configure Invoice Status The workflow status of the invoice must be set to "sent" so that Procuros can export it automatically and send it to trading partners. ### Process for Sending Invoices Create an invoice from a relevant productive order/delivery note and process it to the status "sent". If all prerequisites are met, the invoice will be automatically exported by Procuros. Please inform Procuros of the document number and provide a PDF example. After positive feedback, invoices can be sent as normal. # Sending Shipping Notes Source: https://docs.procuros.io/en/connectors/xentral/sending-documents/shipping-notices Step by step guide to sending shipping notices from Xentral to Procuros ## Sending Shipping Notes Delivery notes document the handover of goods to the recipient. ### Token Scope Sending delivery notes requires the `deliveryNote:send` scope on your API token. See [Technical Connection](/en/connectors/xentral/getting-started/technical-setup#token-scopes). ### Configure Delivery Note Status The delivery note must be in the Xentral workflow status "approved" or "Sent" for Procuros to export the document. This is a mandatory step in the shipping process. ### Process for Sending Delivery Notes A corresponding order must exist and mandatory fields (customer order number, planned delivery date, GLNs) must be filled out. Create a delivery note from a relevant productive order and process it to the agreed status. If the prerequisites are met, the delivery note will be automatically exported by Procuros. Share the document number of the delivery note with Procuros and provide a PDF example. After positive feedback, documents can be sent regularly. ## Troubleshooting Document Sending If problems occur when sending documents: 1. **Missing mandatory fields**: Check if all required fields are filled out 2. **Incorrect workflow status**: Make sure the correct status is set 3. **Missing master data**: Check if all necessary master data (GLN, GTIN, etc.) is stored For persistent problems, please contact Procuros support at [help@procuros.io](mailto:help@procuros.io) with a detailed description and the affected document numbers. # Manage Company Data Source: https://docs.procuros.io/en/general/admin/company-data Learn how to maintain and update your company details and business identifiers in the Procuros Portal. ## Editing Company Data Click on "Settings" in the left navigation bar and then select "Company Data." Fill in the required fields in the upper section: * Company Name * Street and House Number * Postal Code and City * Country In the lower "Standard Settings" section, you can enter the following identifiers: * Default Bill From Address  (GLN) * Default Bill Address from Domain * Default Tax ID All changes will only be applied and activated after clicking "Save." ## Standard Company Identifiers The stored standard identifiers are automatically used in all transactions to ensure the correct assignment of documents. Maintaining these details is particularly important for: * Automatic document assignment * Correct invoicing * Unique identification within the network The following identifiers can be set as standard: 1. **GLN (Global Location Number)** * Your unique identification number in the Procuros network * Used for document addressing * Format: 13-digit number 2. **Bill From Address Domain** * Defines the standard domain for electronic invoices * Important for the correct delivery of documents 3. **VAT ID** * Your VAT identification number * Automatically applied to invoices * Country-specific format (e.g., DE123456789) # Invite Team Members Source: https://docs.procuros.io/en/general/admin/invite-new-team-members Learn how to add and manage team members in Procuros. ## Team Members Overview Click on "Settings" in the left navigation bar and then select the "Team Members" section. There, you will find a tabular overview of all current team members with the following information: * Team member's name * Assigned email address ## Invite a New Team Member Click the "Add Member" button in the upper right corner of the team members overview. In the dialog that appears, enter the email address and name of the new team member. Ensure the email address is spelled correctly. Confirm your entries. The system will automatically send an invitation email to the specified address. The invited team member will receive a personalized invitation link that is valid for 3 months. After this period, a new invitation must be sent. # Notifications Management Source: https://docs.procuros.io/en/general/admin/notifications-management Learn how to manage document-level and relationship-level responsible users for notifications in the Procuros Portal. Procuros allows you to control who receives notifications about document exchanges. You can configure notification recipients at two levels: **document-level** and **relationship-level**. Together, these give you flexible control over who gets notified — from broad company-wide defaults down to specific overrides for individual trade partners. ## Understanding Notification Levels ### Document-Level Responsible Users Document-level responsible users are the **default recipients** for notifications related to a specific document type (e.g., Invoices, Credit Notes, Price Catalogs). These are configured centrally in your company settings and apply across **all** your trade partner connections. For example, if you add `accounting@yourcompany.com` as a document-level responsible user for Invoices, that address will receive invoice-related notifications from every trade partner — unless a relationship-level override is in place. ### Relationship-Level Responsible Users Relationship-level responsible users allow you to **override the document-level defaults** for a specific trade partner connection. When set, they completely replace the document-level responsible users for that particular partner and document type — the two lists are not merged. This is useful when different teams or contacts within your organization are responsible for specific trade partners. For example, you might want `team-a@yourcompany.com` to handle invoice notifications from Partner A, while all other partners continue using the default `accounting@yourcompany.com`. ## Contacts Declared by Your Trade Partner Besides the responsible users you configure, Procuros can also use contacts that your trade partner declares directly inside the documents they send you. This behavior is controlled by the **Include document specific contacts** toggle, which is available at both the document level and the relationship level. When **Include document specific contacts** is selected and a document includes contact email addresses, those contacts will also receive notifications in addition to your default recipients. Enable **Include document specific contacts** when your partner routinely includes the right operational contact in the documents they send, and you want those contacts to be notified automatically without having to maintain them manually. ## Editing Responsible Users When you click **Edit** (either at the document level or relationship level), a dialog opens where you can manage the list of email addresses. Enter a valid email address in the input field and click **+ New Email Address** to add it to the list. Remove existing email addresses by clicking the remove button next to them. Click **Save** to apply your changes, or **Cancel** to discard them. ## Managing Document-Level Responsible Users To configure the default notification recipients for each document type, navigate to the Notifications Management settings page. Navigate to **Settings** in the left sidebar and select **Notifications Management**. The page lists all available document types (e.g., Invoices, Credit Notes, Price Catalogs, Remittance Advices, Sales Reports) along with the currently configured responsible users for each. Click the **Edit** button next to a document type to add or remove email addresses. Changes apply to all trade partners that do not have relationship-level overrides. Each document type also has an **Include document specific contacts** toggle. Enable it to also notify contact email addresses included in a document, in addition to your default recipients. See [Contacts Declared by Your Trade Partner](#contacts-declared-by-your-trade-partner) for details. If a document type shows "No recipients configured", no one will receive notifications for that document type unless relationship-level responsible users are set for specific partners. ### Viewing Relationship-Level Overrides When one or more trade partners have custom responsible users configured for a document type, you will see a green indicator below the document type with the text **"Custom recipients set in X trade partner(s)"**. Click **View Details** to open a side panel that shows which partners have custom responsible users and the email addresses configured for each. You can search by partner name or email address to quickly find specific overrides. ## Managing Relationship-Level Responsible Users To configure notification recipients for a specific trade partner and document type, navigate to the connection's Notifications Management tab. Go to **My Connections** in the left sidebar, select a trade partner, and open the relevant document type. Click the **Notifications Management** tab in the document type detail view. The page shows both parties in the connection. Click **Edit** next to a party to configure who receives notifications for this specific partner and document type. The same **Include document specific contacts** toggle is available here for this specific partner and document type, and it overrides the document-level choice for that connection. Enable it to also notify contact email addresses included in a document, in addition to your default recipients. See [Contacts Declared by Your Trade Partner](#contacts-declared-by-your-trade-partner) for details. **Editing permissions depend on your partner's status.** If your trade partner is not a Procuros customer, you can edit the responsible users for both parties in the connection. If your trade partner is also a Procuros customer, you can only edit your own party's responsible users — the other party's recipients are managed by them and shown as read-only with the label "Recipients are defined by your trade partner". ## Unrecognized Email Domains To protect against misconfigured notifications, Procuros verifies the email domains used for notification recipients. When you save changes that include email addresses from domains that have not been previously approved for your organization, Procuros will show a review dialog before applying the changes. The dialog separates the email addresses into two categories: * **Approved** — Email addresses from domains that are already recognized by your organization. These are added immediately and will start receiving notifications right away. * **Require domain approval** — Email addresses from domains that are not yet recognized. These will **not** become active until the domain has been approved internally. The email addresses are shown highlighted in yellow to indicate they are pending. To submit unrecognized domains for review, click **Request Approval**. You can also click **Back** to return to the edit dialog and remove or correct the email addresses before proceeding. Until a domain is approved, email addresses from that domain will not receive any notifications. Make sure to follow up on approval requests if notifications are time-sensitive. This page covers managing **who** receives notifications. To configure **which types** of notifications you personally receive (e.g., issue alerts, incoming documents, sent documents), visit [Profile & Preferences](/en/general/admin/profile-preferences). # Change Password Source: https://docs.procuros.io/en/general/admin/password Learn how to securely change your password in the Procuros Portal Your new password must meet security requirements and should be different from your previous password. Navigate to "Settings" in the left sidebar. You can find the settings section at the bottom under "Your Account." In the "Account" section, select the "Password" menu option. The password change form will be displayed. * Enter your current password in the "Current Password" field * Enter your desired new password * Repeat the new password for confirmation Click "Save" to apply the password change. After a successful update, you can log in with your new password. Store your new password securely and do not share it with others. If you lose your password, please contact Procuros Support. * At least 8 characters in length * A combination of uppercase and lowercase letters * At least one number * At least one special character * No reuse of previous passwords # Manage Profile & Preferences Source: https://docs.procuros.io/en/general/admin/profile-preferences Learn how to customize your personal settings in the Procuros Portal, including language, name, and notification preferences. In the Profile & Preferences settings, you can manage your personal data and choose which notifications you want to receive from Procuros. These settings are specific to each user and do not affect other team members' preferences. ## Manage Profile Information In this section, you can update basic information about your user profile. Navigate to "Settings" in the left sidebar and select "Profile & Preferences" from the menu. At the top of the page, you will find your email address and the option to update your name. Choose your preferred language from the dropdown menu. Currently, German and English are available. ## Configure Notifications Control which notifications you want to receive from Procuros. Notifications help keep you informed about important activities in your network. * **Issue Notifications**: Receive alerts when there are issues with a transaction * **New Incoming Documents**: Get notified when new documents arrive from your trading partners * **Successfully Sent Documents**: Receive confirmation when your documents have been successfully sent to trading partners **Exception for WebEDI users** If you send and receive documents via our portal (WebEDI), you will receive all transaction-related notifications (e.g. new documents and reminders), even if you deactivate them in your profile. This is because emails are the only communication channel for WebEDI suppliers as they do not receive documents directly in their system. Use the toggles next to each notification type to turn them on or off. Click "Save" to apply your changes. The new settings will take effect immediately. Even if you disable notifications, you can still view all your documents and transactions within the portal. # SSCC Settings Source: https://docs.procuros.io/en/general/admin/sscc-settings Learn how to configure your GS1 company prefix, serial numbers, and label printer resolution for SSCC labels in the Procuros Portal. SSCC Settings is only available if the SSCC Labels feature is enabled for your company. If you don't see this page in your Settings, contact Procuros to have it activated. ## What Is an SSCC? An **SSCC (Serial Shipping Container Code)** is a globally unique 18-digit number used to identify a logistics unit, such as a pallet, carton, or container, as it moves through the supply chain. It is made up of four parts: 1. **Extension digit** — 1 digit, used to extend the capacity of the serial reference. 2. **GS1 company prefix** — 7 to 10 digits, assigned to your company by GS1. 3. **Serial reference** — fills the remaining digits, issued sequentially by Procuros. 4. **Check digit** — 1 digit, calculated automatically to detect scanning errors. Procuros assembles the full 18-digit SSCC for you from the GS1 company prefix and serial number configured on this page — you never have to type or track a full SSCC yourself. SSCCs are used to identify transport units on shipping notices. See [Sending Shipping Notices](/en/general/portal/transactions/sending-shipping-notices) for how they fit into a shipment, and [Package Identification](/en/api/v2/features-package-identification) for how they appear in the API. ## SSCC Generation Click on **Settings** in the left navigation bar and then select **SSCC Settings**. In **GS1 company prefix**, enter the digits GS1 assigned to your company. Every SSCC you issue is built on this prefix. You can obtain a prefix from your national GS1 member organization if you don't already have one. **Next serial number** shows the next serial number that will be issued for your prefix. It is managed automatically and stays read-only unless you change the prefix above. Changing the GS1 company prefix turns the field into **First serial number** — the serial number to start from. Leave it empty to start from 1, or set it if you've already printed SSCCs elsewhere and want numbering to continue instead of starting over. Changing your GS1 company prefix restarts your serial number sequence, and issuing a serial number that has already been printed produces duplicate SSCCs on the network. Trading partners may reject shipping notices that reference a duplicate SSCC. Only change your prefix when GS1 has actually reassigned it, and double-check the next serial number if you do. ## Labels Printing In **Printer resolution**, select the dots per millimeter (dpmm) of the label printer you use for SSCC labels: | Printer resolution | Equivalent | | - | - | | 6 dpmm | 152 dpi | | 8 dpmm | 203 dpi | | 12 dpmm | 300 dpi | | 24 dpmm | 600 dpi | If you're not sure which resolution your printer uses, check its spec sheet or configuration label. Selecting the wrong resolution can cause labels to render at the wrong physical size, which may prevent the SSCC barcode from scanning correctly. All changes will only be applied and activated after clicking **Save**. Click **Cancel** to discard your changes. # AI Agents Source: https://docs.procuros.io/en/general/portal/ai-agents Here's a look at how Procuros's AI Agents work, what they do, and where they fit into your document flow. Procuros offers several AI Agents that take manual work off your plate and keep your data clean across document exchange. Think of them as extra teammates: one reads the PDFs landing in your inbox, another translates documents into the format your ERP expects, and others cross-check incoming documents and enrich them using data from previous transactions. Together, they let documents flow from your trade partners straight into your systems with far less manual effort on your side. ## Document Understanding Agent When a trade partner emails you a document, an AI Agent can read the PDF and extract the data automatically — no copy-pasting into your ERP. The agent classifies each document, matches it to the right sender, and passes the data on to your system. Document Understanding is a paid feature. Each document the agent processes uses credits from your account. ## Data Enrichment Not every incoming document is complete. A supplier might send an invoice without the article numbers your ERP needs, or a purchase order that's missing a reference your system relies on. Instead of bouncing the document back, an AI Agent can look at related documents and past transactions with that trade partner, finds the matching information, and fills in the gaps automatically. The more you and your partner exchange documents, the smarter this gets — every transaction becomes context the agent can draw on next time. Data Enrichment is currently in beta — free to use while we refine it. ## Transformation between formats You and your trade partners probably don't use the same systems or file formats. An AI Agent sits in the middle: it takes whatever the sender sends, fills in any missing details from your master data, and delivers it in the exact format your system expects. Custom Transformations is currently in beta — free to use while we refine it. ## How to know when an agent was involved? Whenever an AI Agent has worked on a document, it's clearly marked with an AI tag in the Portal. That way you can tell at a glance which transactions went through an agent and which didn't — useful for spot-checks, audits, or just knowing where the agent stepped in. # My Connections Source: https://docs.procuros.io/en/general/portal/connections An overview of your trading partner connections in Procuros – check status, activate new connections, and manage existing ones. ## Overview of Trading Partner Connections The main view displays all your trading partners and their connection status. Each partner is shown along with the available document types and their current status. ### Document Type Status Different document types are indicated by color codes: * **Green**: Document type is active and live * **Blue**: Ready for test or live transactions * **Gray**: Document type is inactive or awaiting partner action ## Navigation and Filtering Use the search field "Search by partner name" to quickly find specific trading partners. Filter the view by: * Message type (e.g., orders, invoices) * Actions required * Show deactivated partners ## Managing Trading Partner Connections ### Open Detail View Click on a trading partner or document type to open the detail view. This displays: * Current connection status * Progress of document type activation * Required actions Using the three-dot menu next to each partner, you can: * Request new document types * View transaction overview * Access price lists (if available) ### Activating New Document Types **Testing Phase Requirement** A testing phase is generally required when a buyer and supplier are connected via an integration. If a supplier is using the portal to send and receive documents, testing is typically not necessary. For integrated connections, follow these steps to complete the testing phase: 1. Open the detail view of the desired document type. 2. Follow the displayed test instructions. 3. Send the required test documents. 4. Wait for validation from the trading partner. The specific steps for sending test documents vary depending on the integration type. Detailed instructions can be found in the integration guide for your chosen integration method. # Document Understanding Agent Source: https://docs.procuros.io/en/general/portal/document-understanding-agent > The Document Understanding Agent is one of the AI Agents in Procuros. Where the [Order Agent](/en/general/portal/order-agent) digitizes the purchase orders coming in, the Document Understanding Agent handles the documents that come back: order confirmations, shipping notices, invoices, and credit notes. It reads the PDFs your trade partners email you, checks them against the original order, flags anything that needs a look, and delivers them into your system. ## What the agent does When a trade partner emails you a document, the Document Understanding Agent reads the PDF and extracts the data automatically — no copy-pasting into your ERP. The agent: 1. Classifies the document type. 2. Matches the document to the right trade partner. 3. Extracts the data you need from the PDF. 4. Matches the document to the related order and enriches it with data from that order that isn't in the PDF itself. 5. Flags anything it can't resolve cleanly, so it can be reviewed. 6. Delivers the document into your ERP once it's ready — or holds it in the Procuros Portal for review first (depending on your setup). ## Reviewing transactions During digitization, each document runs through a set of automatic verification checks that confirm the extracted data lines up with the original order. For any check the agent can't resolve on its own, it raises a flag for review in the Portal. The review is done by whoever is assigned as the [issue resolver](/en/general/troubleshooting/blocked-transactions#the-issue-resolver) — which can vary by document type (order, invoice, etc.) and trade partner. Depending on how your relationship with a given trade partner is set up, that's either you or them. A flagged document is held in the Portal and is not delivered until the review is complete. The issue resolver receives an email notification whenever a document is waiting for them. If the review falls to you: 1. **Open the transaction in the Portal.** The email notification links straight to it, or you can find it in your transaction list. 2. **Inspect the warnings.** Each flag is pinned to the field or line it concerns. See [Understanding warnings](#understanding-warnings) for what each one means. 3. **Compare against the original PDF.** Check the flagged data against the source document to decide whether the extraction was correct. 4. **Edit the data if needed.** A warning doesn't always mean the extraction was wrong — sometimes the document genuinely differs from the original order. Correct the data only where the extraction doesn't match the PDF. 5. **Mark the transaction as reviewed.** The document then continues on its way and is delivered as normal. ## Understanding warnings Each flag appears as a warning pinned to the field or line it concerns. | Flag | What it means | | - | - | | Date looks unusual | A date on the document (for example the delivery or document date) is outside the normally expected range. | | Higher quantity than ordered | A line shows a quantity greater than what was originally ordered. | | New line not on the original order | A line appears on the document that wasn't on the original order. | | Ordered line missing | One or more lines from the original order weren't found on the document. | | Total quantity is zero | The document's total quantity came through as zero. | | Total quantity doesn't match | The overall total quantity on the document doesn't match the sum of its individual line items. | For each flag, check the data against the original attachment to confirm whether it's valid. # Getting Started Source: https://docs.procuros.io/en/general/portal/getting-started Learn about the core functions of Procuros. This guide walks you through the key areas of the platform and explains how to get started. Procuros is your central platform for digital collaboration with your trading partners. As a network, Procuros connects buyers and suppliers, enabling the automated exchange of business documents such as orders, order confirmations, and invoices. ## Signing in to Procuros You can access Procuros via portal.procuros.io. No password is required—magic links sent to your email provide seamless login when new orders arrive or when a trading partner invites you to Procuros. However, passwords are available as an alternative login method. When you first log in via a magic link, a password is automatically assigned, which you can change or reset anytime in the portal. On the login page, you can either enter your password or request a new magic link. ## Navigation and Key Features The sidebar serves as the central navigation tool for the platform. Here, you will find all essential functions arranged from top to bottom: ### Dashboard