Introduction

This is the PSI Backend API Documentation.

This documentation aims to provide all the information you need to work with our API.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_BEARER_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Authentication

Authenticate

POST
https://api.psiproductfinder.de
/v2/auth

This endpoint allows you to authenticate and retrieve an access_token and a refresh_token. The access_token must be included in the header of every API request to access protected resources. You can log in using your standard PSI account credentials. However, to avoid potential issues caused by password changes of regular user accounts, we strongly recommend creating a dedicated Sub-Account for API access. You can set up a Sub-Account in your PSI account settings (https://www.psi-network.de/).

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://api.psiproductfinder.de/v2/auth" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"username\": \"demo@psi-network.de\",
    \"password\": \"password\"
}"
Example response:
{
    "access_token": "eyJ0eXAidemoV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcLmRlIiwiYXVkIjoicHNpcHJvZHVjdansmRlci5kZSIsImp0adIeoQzNjMwIiwiaWF0IjoxNzM3MDE5NTQ2LjE2OTkyMiwibmJmIjoxNzM3MDE5NTQ2LjE2OTkyMiwiZXhwIjoxNzM3MDE5NTQ2LjE2OTkyMiwicGF5bG9hZCI6eyJwc2lubyI6NDM2MzAsInVzZXJfaWQiOjEyNDcyOSwiZ3JvdXBzIjoiMTQiLCJlbWFpbCI6ImZyYW5rQHJoZWluc2NoYWZlLmRlIn19",
    "refresh_token": "07070512341eacdemo3a64267c377cdcf06501",
    "expires_in": 1737019546
}
{
    "errors": "Username or Password is wrong."
}

Refresh Token

POST
https://api.psiproductfinder.de
/v2/refresh

Your access_token is valid for the duration specified in the expires_in field of the authentication response (e.g., typically 1 hour). Once the token expires, you must generate a new one to continue accessing protected resources.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://api.psiproductfinder.de/v2/refresh" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"username\": \"demo@psi-network.de\",
    \"refresh_token\": \"07070512341eacdemo3a64267c377cdcf06501\"
}"
Example response:
{
    "access_token": "eyJ0eXAidemoV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcLmRlIiwiYXVkIjoicHNpcHJvZHVjdansmRlci5kZSIsImp0adIeoQzNjMwIiwiaWF0IjoxNzM3MDE5NTQ2LjE2OTkyMiwibmJmIjoxNzM3MDE5NTQ2LjE2OTkyMiwiZXhwIjoxNzM3MDE5NTQ2LjE2OTkyMiwicGF5bG9hZCI6eyJwc2lubyI6NDM2MzAsInVzZXJfaWQiOjEyNDcyOSwiZ3JvdXBzIjoiMTQiLCJlbWFpbCI6ImZyYW5rQHJoZWluc2NoYWZlLmRlIn19",
    "expires_in": 1737020073
}

Product Controller

Get Entities

GET
https://api.psiproductfinder.de
/v2/products
requires authentication

The Get Entities endpoint allows you to retrieve all products associated with your PSI number. It returns all products that belong to your account, but you can customize the results using optional query parameters.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

language
string
Must be one of:
  • de
  • en
Example:
en
locale
string
Must be one of:
  • de
  • en
Example:
en
filter
string
Example:
outdated
search
string
Example:
Suchen
page
number

Must be at least 1.

Example:
1
size
number

Must be at least 1. Must not be greater than 100.

Example:
6
Example request:
curl --request GET \
    --get "https://api.psiproductfinder.de/v2/products?language=en&locale=en&filter=outdated&search=Suchen&page=1&size=6" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "code": 200,
    "status": "OK",
    "data": [],
    "meta": {}
}
{
    "code": "404",
    "status": "Not found",
    "message": "No products found."
}

Get Entity

GET
https://api.psiproductfinder.de
/v2/products/{identifier}
requires authentication

This endpoint is used to retrieve a specific product or variant. You can identify the entity using one of the following methods: Internal Identifier: A unique identifier generated from your master_product_number, PSI number, and product_number. Identifiers starting with p- refer to a master product, and identifiers starting with v- refer to a variant. Product Number: You can also use your custom product_number as an identifier. Note: If you request a master product (p-), the response will include all associated variants.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

identifier
string

required.

Example:
p-c2a1cf5x

Query Parameters

language
string
Must be one of:
  • de
  • en
Example:
en
locale
string
Must be one of:
  • de
  • en
Example:
en
Example request:
curl --request GET \
    --get "https://api.psiproductfinder.de/v2/products/p-c2a1cf5x?language=en&locale=en" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "code": 400,
    "status": "Bad request"
}
{
    "code": 404,
    "status": "Not found",
    "message": "No product found with identifier 'v-demo'."
}
Headers
                                                            cache-control
                                                            : no-cache, private
                                                                                                                    content-type
                                                            : application/json
                                                                                                                    vary
                                                            : Origin
                                                         
{
    "message": "Server Error"
}

Create Entity

POST
https://api.psiproductfinder.de
/v2/products/store
requires authentication

To create a variant or translation, simply post a payload containing the required parameters. If you specify a language other than the default (en), a new translation for the specified language will be added.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://api.psiproductfinder.de/v2/products/store" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Demo Product\",
    \"product_number\": \"demo-001\",
    \"language\": \"en\",
    \"locale\": \"en\",
    \"master_product_number\": \"demo-001\",
    \"brand\": \"PSI-Demo\",
    \"description\": \"This is just a demo product\",
    \"tags\": \"demo1, demo2\",
    \"ean_code\": \"1234567890\",
    \"product_groups\": [
        \"05138008\",
        \"08094001\"
    ],
    \"certificates\": [
        \"CERT-04200000\"
    ],
    \"colors\": [
        \"CG-BLAK5\"
    ],
    \"color_description\": \"red\",
    \"country_origin\": \"CC-DE\",
    \"made_in\": \"CC-DE\",
    \"images\": [
        {
            \"src\": \"https:\\/\\/psiproductfinder.de\\/images\\/logo\\/logo.svg\",
            \"name\": \"Demo logo image\",
            \"description\": \"Custom description\"
        }
    ],
    \"delivery_time_max\": 3,
    \"delivery_time_min\": 1,
    \"finishings\": [
        {
            \"group\": \"FG-APPN11\",
            \"included\": true,
            \"description\": \"Demo application\"
        }
    ],
    \"finishings_information\": \"Finishing information\",
    \"legal_information\": \"Legal information\",
    \"material_description\": \"Material description\",
    \"materials\": [
        \"MG-ACRC7\"
    ],
    \"measurement_length\": 100,
    \"measurement_volume\": 10,
    \"measurement_height\": 150,
    \"measurement_width\": 135,
    \"measurement_information\": \"Measurement information\",
    \"weight_netto\": 10,
    \"weight_brutto\": 13,
    \"minimum_order_amount\": 1,
    \"packaging\": 2,
    \"price_ranges\": [
        {
            \"amount\": 1,
            \"price_ek\": 1.5,
            \"price_uvp\": 2
        },
        {
            \"amount\": 5,
            \"price_ek\": 1,
            \"price_uvp\": 1.5
        }
    ],
    \"price_ranges_information\": \"Price ranges information\",
    \"product_information\": \"Product information\",
    \"stock_available\": true,
    \"delivery_information\": \"Delivery information\",
    \"target_group\": \"Target group\",
    \"video\": \"https:\\/\\/www.youtube.com\\/watch?v=pCHJAj5oPu0\"
}"
Example response:
{
    "code": 200,
    "status": "OK",
    "message": "Product with identifier 'v-1b93b0c9' has been successfully created.",
    "data": {
        "product_id": "9df97825-f13f-44b0-a20f-126b463d25eb",
        "product_identifier": "p-9a33ae89",
        "selected_identifier": "v-1b93b0c9",
        "variant_id": "9df97825-f2c2-43ea-9f3d-e2b3c8a1ebf5",
        "variant_identifier": "v-1b93b0c9",
        "master_article_number": "43630S31463938362D64424946456578573178",
        "master_product_number": "1F986-dBIFEexW1x",
        "available_translations": [
            "en"
        ],
        "brand": null,
        "certificates": [],
        "color_description": null,
        "colors": [],
        "country_origin": null,
        "delivery_information": null,
        "delivery_time_max": null,
        "delivery_time_min": null,
        "description": null,
        "ean_code": null,
        "finishings_information": null,
        "finishings": [],
        "images": [],
        "legal_information": null,
        "made_in": null,
        "material_description": null,
        "materials": [],
        "measurement_height": null,
        "measurement_information": null,
        "measurement_length": null,
        "measurement_volume": null,
        "measurement_width": null,
        "minimum_order_amount": null,
        "name": "Demo Product",
        "packaging": null,
        "price_ranges_information": null,
        "price_ranges": [],
        "product_groups": [],
        "product_information": null,
        "product_number": "demo-001",
        "stock_available": false,
        "tags": null,
        "target_group": null,
        "video": null,
        "weight_brutto": null,
        "weight_netto": null
    }
}
{
    "code": 400,
    "status": "Bad Request",
    "errors": []
}

Update Entity

PATCH
https://api.psiproductfinder.de
/v2/products/update/{identifier}
requires authentication

To update variants and translations, you need to specify the variant_identifier (e.g., v-88c62663). For updating a translation, you must also include the language parameter.
All parameters available in the "Create Entity" endpoint can also be used when updating an entity, allowing for flexible modifications.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

identifier
string
Example:
v-88c62663

Body Parameters

Example request:
curl --request PATCH \
    "https://api.psiproductfinder.de/v2/products/update/v-88c62663" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Demo Product updated\",
    \"language\": \"en\",
    \"locale\": \"en\",
    \"description\": \"This is just a demo product - updated\"
}"
Example response:
{
    "code": 200,
    "status": "OK",
    "message": "Product with identifier 'v-88c62663' has been successfully updated.",
    "data": {
        "product_id": "9dfb33f7-03b7-4598-9178-9799e3710560",
        "product_identifier": "p-76ca02e6",
        "selected_identifier": "v-88c62663",
        "variant_id": "9dfb33f7-061d-4737-93fb-71e62bc9b25d",
        "variant_identifier": "v-88c62663",
        "master_article_number": "43630S64656D6F2D303031",
        "master_product_number": "1F43C-UQlQJ9yMwQ",
        "available_translations": [
            "en"
        ],
        "brand": "PSI-Demo",
        "certificates": [
            {
                "group": "CERT-04200000",
                "label": "Fair for life"
            }
        ],
        "color_description": "red",
        "colors": [
            {
                "group": "CG-BLAK5",
                "label": "Black"
            }
        ],
        "country_origin": null,
        "delivery_information": "Delivery information",
        "delivery_time_max": 3,
        "delivery_time_min": 1,
        "description": "This is just a demo product - updated",
        "ean_code": "1234567890",
        "finishings_information": "Finishing information",
        "finishings": [
            {
                "group": "FG-APPN11",
                "label": "Application",
                "description": "Demo application",
                "included": true
            }
        ],
        "images": [
            {
                "src": "https://psiproductfinder.de/images/logo/logo.svg",
                "name": "Demo logo image",
                "description": "Custom description"
            },
            {
                "src": null,
                "name": null,
                "description": null
            }
        ],
        "legal_information": "Legal information",
        "made_in": null,
        "material_description": "Material description",
        "materials": [
            {
                "group": "MG-ACRC7",
                "label": "Acrylic"
            }
        ],
        "measurement_height": 150,
        "measurement_information": "Measurement information",
        "measurement_length": 100,
        "measurement_volume": "10.00",
        "measurement_width": 135,
        "minimum_order_amount": 1,
        "name": "Demo Product updated",
        "packaging": 2,
        "price_ranges_information": "Price ranges information",
        "price_ranges": [
            {
                "amount": 1,
                "price_ek": 1.5,
                "price_uvp": 2
            },
            {
                "amount": 5,
                "price_ek": 1,
                "price_uvp": 1.5
            }
        ],
        "product_groups": [
            {
                "label": "Kitchen Items > Slicer",
                "group": "05138008"
            },
            {
                "label": "Beverages > Beer",
                "group": "08094001"
            }
        ],
        "product_information": "Product information",
        "product_number": "demo-001",
        "stock_available": true,
        "tags": "demo1, demo2",
        "target_group": "Target group",
        "video": "https://www.youtube.com/watch?v=pCHJAj5oPu0",
        "weight_brutto": 13,
        "weight_netto": 10
    }
}
{
    "code": 400,
    "status": "Bad Request",
    "message": []
}
{
    "code": 404,
    "status": "Not found",
    "message": "No product found with identifier 'sapiente'."
}

Delete Entity

DELETE
https://api.psiproductfinder.de
/v2/products/delete/{identifier}
requires authentication

To delete a variant, translation, or product, you need to provide the identifier (e.g., p-88c62663 for a product or v-88c62663 for a variant). If you want to delete a translation in a language other than the default (English), you must also specify the language parameter.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

identifier
string
Example:
v-88c62663

Body Parameters

Example request:
curl --request DELETE \
    "https://api.psiproductfinder.de/v2/products/delete/v-88c62663" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"language\": \"en\"
}"
Example response:
{
    "code": 200,
    "status": "success",
    "message": "Product with identifier ':identifier' has been successfully deleted."
}
{
    "code": "404",
    "status": "Not found",
    "message": "No translation found for the product with identifier 'v-88c62663' in locale 'en'."
}

Image Controller

Receive Identifier

GET
https://api.psiproductfinder.de
/v2/upload-identifier
requires authentication

To upload an image, the system requires a unique identifier for each image, which acts like an access token for the upload process. First, call the dedicated endpoint to generate the identifier. Once you have the identifier, use it to upload the image through the upload endpoint.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
curl --request GET \
    --get "https://api.psiproductfinder.de/v2/upload-identifier" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "identifier": "57842050-b8be-4a0a-9383-130b0fa4d84e"
}

Upload Image

POST
https://api.psiproductfinder.de
/v2/upload-image
requires authentication

To upload images directly to the Productfinder, use a multipart form upload. Each image requires a unique identifier, which can be obtained by calling the respective endpoint beforehand. Once the images are uploaded, the returned URLs can be used as image URLs and assigned to variants.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
multipart/form-data
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://api.psiproductfinder.de/v2/upload-image" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "identifier=57842050-demo-4a0a-9383-130b0fa4d84e"\
    --form "image=@/tmp/phpjfX9Zj" 
Example response:
{
    "identifier": "57842050-demo-4a0a-9383-130b0fa4d84e",
    "filename": "42d0050d623c8ec4481539245c1e6de9.png",
    "absolute": "https://media.psiproductfinder.de/__temp/43630/57842050-b8be-4a0a-9383-130b0fa4d84e/42d0050d623c8ec4481539245c1e6de9.png"
}
{
    "message": "Validation failed.",
    "errors": {
        "image": [
            "The image field is required."
        ]
    }
}

Endpoints

POST v2/products/translation

POST
https://api.psiproductfinder.de
/v2/products/translation
requires authentication

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
curl --request POST \
    "https://api.psiproductfinder.de/v2/products/translation" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Product Group Controller

POST
https://api.psiproductfinder.de
/v2/productGroups/search
requires authentication

The Group Search allows you to query available group codes, which are also listed in the XLSX file (download). You can use the search parameter to filter results by a specific term and the locale parameter (en or de) to retrieve the corresponding results in your preferred language. This makes it easy to find and integrate group codes into your workflow.

Headers

Authorization
Example:
Bearer {YOUR_BEARER_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://api.psiproductfinder.de/v2/productGroups/search" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"locale\": \"en\",
    \"search\": \"Jackets\"
}"
Example response: