---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Cloud API documentation

**Relevant Products**

*YSoft SAFEQ Cloud* *API documentation* is available in BREEZE MFD PRO MFD

Public API is accessible on HTTPS via `/api/v1`.

All functions require an X-API-Key header to be present which holds an API key.

If API key header is missing, an HTTP error 403 (forbidden) is returned.

All functions follow RESTful design. They can return either application/json or application/xml MIME type depending on the Accept header. By default JSON results are returned.

For POST requests they are sent as request body with application/x-www-form-urlencoded type.

Any special characters used to specify a resource name in an API request URL should be percent-encoded following the RFC 3986 standard.

Depending on API key settings a user and/or device token might be required to be provided in the `Authorization` HTTP header when calling API endpoints.

API calls expect only ASCII characters in the request URL. Non-ASCII characters should be percent-encoded.  
YSoft SAFEQ Cloud contains a very broad range of API's internally to control virtually every aspect of SAFEQ Cloud. If you're missing a capability or a function in the API, contact us, and we'll extend this public API as needed.

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# API Functions

**Relevant Products**

*API Functions* are available in BREEZE MFD PRO MFD

## Common / Security

### API key permissions

Almost all API functions require **Advanced API permissions** on API key to be checked and a precise list of rights to be selected. An API call that does not require this option has a note"Does not require Advanced API permissions."

Advanced API permissions allow to address the power of the API key for exact API functions. Whenever the **Advanced API permissions** option is selected, the permissions are checked within the API call, even if the API call does not require this access level.

Each API function has the "Permission info" note, where the list of required permissions is mentioned.

When the user token is used within the API call, the API key used for login has to match the API key used for the API call. The user token contains the user permissions that must match the **"Permission info"** note in each API call. For API calls whose descriptions do not contain a note "Does not require Advanced API permissions.", the "Advanced API permissions" of the used API key must correspond to the permissions listed in the "Permission info" note in each API call.  
Security

We highly recommend you to use this option and select only the necessary permissions for each API key.  
If **Allow unauthenticated requests** option is disabled in the API key settings, all functions except **login** require a **user token** to be provided in the form of HTTP header: `Authorization: Bearer <user_token>`.

## Version

### Get server version

Permission info

Does not require Advanced API permissions.

Path: `/version`

* Method: `GET`

* Parameters: none

* Returns: ` ServerVersionInfo `

  ord print/copy/scan jobs:
* Errors: 403

## Account

### Get account information

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccount permission.

Does not require Advanced API permissions.

* Path: `/account`

* Method: `GET`, `HEAD`

* Parameters: `domainname: string` optional domain name. If not specified, the request address is used

* Returns: `AccountInfo` for GET request, empty 200 status for HEAD request

* Errors: 404

* Notes:

  * For `HEAD` request the X-API-Key header is not required

  * The returned AccountInfo includes primaryDomain --- the account's primary domain (the domainname flagged as primary, or the first domain if none is flagged; absent for a domain-less account).

### Create account

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccount permission together with the create permission matching the accounttype :

* CreateVendorAccount - vendor

* CreateAccount - customer

* CreateContainer - container.

* Path: `/account`

* Method: `PUT`

* Parameters:

  * `parentdomain: string` The domain name of the parent account

  * `accountname: string` Name of the account

  * `accounttype: int` Type of the account: 1 = vendor, 2 = customer, 3 = container

  * \[optional\] `primarydomain: string` The account's primary domain. If the value is not among the submitted domainname values, it is added to the account's domain list and flagged primary. When omitted, the first domain becomes the primary.

  * `domainname: string` Account domain name. This parameter can be specified more than once. The domain name can contain letters, numbers, hyphens, and periods. Any part of the domain name (separated by a period) should begin and end with a letter or number.

  * `applicationname: string` Account application name

  * \[optional\] `trustallclients: bool` Automatically trust the account value

  * \[optional\] `locationid: int` Id of the existing location to be assigned to the created account

* Returns: `ErrorCodeInfoId`

cURL example:

    #!/bin/sh
    `curl -X PUT -i -v -H "X-Api-Key:" -d "parentdomain=" -d "accountname=" -d "accounttype=" -d "primarydomain=" -d "domainname=" -d "applicationname=" -d "trustallclients=" -d "locationid=" -k "https://:7300/api/v1/account"`

Replace all with real values.

Example of resulting domain list and primary domain:  

| domainname sent | primarydomain sent |    Returned domainNames     | Returned primaryDomain |
|-----------------|--------------------|-----------------------------|------------------------|
| a.com, b.com    | -                  | \["a.com","b.com"\]         | "a.com"                |
| a.com, b.com    | b.com              | \["b.com","a.com"\]         | "b.com"                |
| a.com, b.com    | c.com              | \["c.com","a.com","b.com"\] | "c.com"                |
| -               | -                  | \[\]                        | (absent)               |
| -               | b.com              | \["b.com"\]                 | "b.com"                |

### Update account

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccount permission together with the modify permission matching the accounttype :

* ModifyVendorAccount - vendor

* ModifyCustomerAccount - customer

* ModifyAccount - container

* Path: `/account`

* Method: `PATCH`

* Parameters:

  * \[optional\] `accountname: string` Name of the account

  * \[optional\] `primarydomain: string` The account's primary domain. If the value is not in the resulting domain list, it is added and flagged primary. When omitted, the existing primary domain is preserved.

  * \[optional\] `domainname: string` Account domain name. This parameter can be specified more than once

    A domain name can contain letters, numbers, hyphens, and periods. Any part of the domain name (separated by a period) should begin and end with a letter or number.

  * \[optional\] `applicationname`: `string `Account application name

  * \[optional\] `trustallclients: string `Automatically trust the account value

  * \[optional\] `locationid: string `Id of the existing location to be assigned to the created account

  * \[optional\] `locale: string `Account's language - expected values: "pt-BR" (Brazilian Portuguese), "zh" (Chinese), "cs" (Czech), "da" (Danish), "nl" (Dutch), "en" (English), "fr" (French), "de" (German), "id" (Indonesian), "it" (Italian), "ja" (Japanese), "ko" (Korean), "ms" (Malay), "no" (Norwegian), "pl" (Polish), "pt" (Portuguese), "sk" (Slovak), "es" (Spanish), "sv" (Swedish), "th" (Thai)

  * \[optional\] `defaultpapersize: string` Account's default paper size - expected values: "A3", "A4", "A5", "Letter"

  * \[optional\] `theme: string` Account's color theme - expected values: "blue", "orange", "purple", "red", "green", "breeze"

  * \[optional\] `timezone: string` Account's default timezone - expected values: IANA time zone ID (e.g. America/Halifax) or empty string to set "Default timezone".

* Returns: `ErrorCodeInfoId`

cURL example:

    curl -X PATCH "https://server_name:7300/api/v1/account" -H "X-Api-Key: key" -d "accountname=" -d "primarydomain=" -d "domainname=" -d "applicationname=" -d "trustallclients=" -d "locationid=" -d "locale=" -d "defaultpapersize=" -d "theme=" -d "timezone="

Example of resulting domain list and primary domain for an existing account:

domainNames = \["a.com","b.com"\], primaryDomain = "a.com".  

| domainname sent | primarydomain sent |    Returned domainNames     | Returned primaryDomain |
|-----------------|--------------------|-----------------------------|------------------------|
| -               | -                  | \["a.com","b.com"\]         | "a.com"                |
| -               | b.com              | \["b.com","a.com"\]         | "b.com"                |
| -               | c.com              | \["c.com","a.com","b.com"\] | "c.com"                |
| b.com, c.com    | -                  | \["b.com","c.com"\]         | "b.com"                |
| b.com, c.com    | c.com              | \["c.com","b.com"\]         | "c.com"                |
| b.com, c.com    | a.com              | \["a.com","b.com","c.com"\] | "a.com"                |

### Get containers

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccount permission.

* Path: `/account/containers`

* Method: `GET`

* Parameters: None

* Returns: list of `ContainerInfo`

* Errors: 403

cURL example:

    curl -X GET -H "X-Api-Key: advanced_api_permissions_key" -k "https://server_name:7300/api/v1/account/containers"

### Update container

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccount and ModifyAccount permissions.

* Path: `/account/container/*id*`

* Method: `PUT`

* Parameters:

  * \[optional\] `primarydomain: string` The container's primary domain. If not among the submitted domainname values, it is added and flagged primary. When omitted, the existing primary domain is preserved.

  * `domainname: string` Container domain name. This parameter can be specified more than once

  * `containername: string` Name of the container

  * \[optional\] `applicationname: string` Container application name

  * \[optional\] `locationid: int` Id of the existing location to be assigned to the container

  * \[optional\] `timezone: string` Container default timezone - expected values: IANA time zone ID (e.g. America/Halifax) or empty string to set "Default timezone".

* Returns: `ErrorCodeInfoId`

* Errors: 403, 404

cURL example:

    curl -X PUT -H "X-Api-Key: advanced_api_permissions_key" -k "https://server_name:7300/api/v1/account/container/CONTAINER_ID" -d primarydomain= -d domainname= -d containername= -d applicationname= -d locationid= -d timezone=

Replace all `CONTAINER_ID` with real value.

### Delete container

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccount and DeleteAccount permissions.

* Path: `/account/container/*id*`

* Method: `DELETE`

* Parameters:

  * \[optional query parameter\] `withsubnodes: boolean` true/false, whether to delete the non-empty container

* Returns: `ErrorCodeInfoId`

* Errors: 403, 404

cURL example:

    curl -X DELETE -H "X-Api-Key: advanced_api_permissions_key" -k "https://server_name:7300/api/v1/account/container/CONTAINER_ID?withsubnodes=true"

Replace all `CONTAINER_ID` with real value.

## Login

### User authentication

Permission info

Does not require Advanced API permissions.

Authorization with a device token or allowing untrusted endpoints is required .

Path: `/login`

* Method: `POST`

* Parameters:

  * `authtype: integer` 0=password, 1=cardid, 2=shortid, 3=nameonly, 4=email

  * `userid: string` the id to authenticate

  * `password: string` an optional secret (required for authtype=0, optional for authtype=1, ignored for other types)

* Returns: `UserInfo`

* Errors: 401, 403

cURL example:

    #!/bin/sh
    curl -X POST -H "X-Api-Key: key" -d "authtype=0" -d "userid=username" -d "password=password" "https://serveraddress:7300/api/v1/login"

## Documents

If the "Allow untrusted endpoints" option is disabled in the API key settings, this function requires a device token to be present in the form of an HTTP header: `Authorization: Bearer <device_token>`

### Get list of documents for user

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewJob permission.

Does not require Advanced API permissions.

Authorization with user token is required. Cannot call with an insecure API key.

* Path: `/documents`

* Method: `GET`

* Parameters:

  * \[optional\] `status: list[int]` Status list for the documents. If not provided 0 =\> READY will be used. 0 =\> READY,1 =\> PRINTED, 2 =\> DELETED, 3 =\> EXPIRED, 4 =\> FAILED, 5 =\> RECEIVED, 6 =\> AWAITING_CONVERSION, 7 =\> CONVERTING, 8 =\> CONVERSION_FAILED, 9 =\> STORED. For more details see [Document Status Flowchart](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md#Document-Status-Flowchart).

  * \[optional\] `maxRecords: int` The number of records to be retrieved. If not provided, 50 is the default value. Max value 500

* Returns: `list `of` DocumentInfo`

* Errors: 403

### Get documents' history

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewReport permission.  
Restriction info

Only available for Customer account type. It is not possible to call this on Vendor or Container account types. In such case, the call returns a 400 error.  
Restriction info

The timeout for this API endpoint is 5 minutes.

This endpoint is designed to get raw document data for building custom dashboards. Since the output can potentially be very large, the endpoint is equipped with paging functionality.

* Path: `/documents/history`

* Method: `GET`

* Parameters:

  * \[optional\] `maxrecords: int` Maximum number of records on the single response page. The default value is 200, maximum is 2000.

  * \[optional\] `pagetoken: string` If the number or records for your query exceeds `maxrecords` value, the endpoint responds with exactly `maxrecords` documents and non-empty `nextPageToken` field. Use value of `nextPageToken` as a `pagetoken` parameter to get the next page.

  * \[optional\] `datestart: datetime` ISO-8601 instant formatted start point for documents' creation dates range. Example: `2021-09-21T16:38:10.972Z`

  * \[optional\] `dateend: datetime` ISO-8601 instant formatted endpoint for documents' creation dates range. The maximum allowed timeframe is 1 week. `datestart` should be less than `dateend` , and the latter should be in the future. The default value is "last 24 hours".

  * \[optional\] `domainname: string` If you want to narrow the request scope to one of your accounts, you can provide its domain name. Queried account should be a sub-account related to the account you are querying. When this parameter is not provided, the query is made against the account that has domain, taken from URL and all its subdomains.

  * \[optional\] `username: string` The exact login name of the user for which you want data to be delivered. When not specified, no filtering takes place.

  * \[optional\] `portname: string` The exact name of the port where the document was printed. When not specified, no filtering takes place.

  * \[optional\] `status: ` `list[int]` Status list for the documents. When not specified, no filtering takes place. 0 =\> READY,1 =\> PRINTED, 2 =\> DELETED, 3 =\> EXPIRED, 4 =\> FAILED, 5 =\> RECEIVED, 6 =\> AWAITING_CONVERSION, 7 =\> CONVERTING, 8 =\> CONVERSION_FAILED, 9 =\> STORED. For more details see [Document Status Flowchart](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md#Document-Status-Flowchart).

  * \[optional\] `jobtype: string Document job type (PRINT, COPY, SCAN, FAX)`

Returns:

* `documents`: array of `DocumentInfo`

* `recordsOnPage: Integer`

* `nextPageToken: String`

* `dateStart: String`

* `dateEnd: String`

* `domainName: String`

* `userName: String`

* `portName: String`

`DocumentInfo`:

* `providerId: Int`

* `uuid: String`

* `documentName: String`

* `documentType: Int`

* `userName: String`

* `totalPages: Int`

* `colorPages: Int`

* `duplex: Int`

* `copies: Int`

* `grayscale: Boolean`

* `paperSize: String`

* `dateTime: Long`

* `storageOnline: Boolean`

* `secure: Boolean`

* `tags: list[TagInfo]`

* `collate: Boolean`

* `status: Int` Type of Status: 0 =\> READY,1 =\> PRINTED, 2 =\> DELETED, 3 =\> EXPIRED, 4 =\> FAILED, 5 =\> RECEIVED, 6 =\> AWAITING_CONVERSION, 7 =\> CONVERTING, 8 =\> CONVERSION_FAILED, 9 =\> STORED. For more details see [Document Status Flowchart](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md#Document-Status-Flowchart).

* `outputPortId: Int`

* `outputPortName: String`

* `jobType: String` (PRINT, COPY, SCAN, FAX)

* `scanWorkflowId: Int`

* `scanConnectorId: Int`

`TagInfo`

* `tagType: Int` Type of Tag: 0 = Department, 1 = Group

* `name: String` Tag name

`Errors: 400`

Usage example:

Example request

    curl --request GET 'https://yourhost:7300/api/v1/documents/history?datestart=2021-09-07T16:38:10.972Z&amp;dateend=2021-09-10T16:38:10.972Z&amp;domainname=testaccount1&amp;username=admin&amp;maxrecords=2' \
    --header 'X-Api-Key: advanced_api_permissions_key' \

Example response

    {
        "documents": [
            {
                "providerId": 65,
                "uuid": "1b83f9ca-a05b-44cf-8c0b-ae7b4c934f92",
                "documentName": "Importand document 12345",
                "documentType": 0,
                "userName": "admin",
                "totalPages": 0,
                "colorPages": 0,
                "duplex": 0,
                "copies": 1,
                "grayscale": false,
                "paperSize": "",
                "dateTime": 1631205678743,
                "storageOnline": false,
                "tags": [
                   {
                     "tagType": 0,
                     "name": "dev dep"
                   },
                   {
                     "tagType": 1,
                     "name": "dev"
                   },
                   {
                     "tagType": 1,
                     "name": "devsupport"
                   }
                 ],
    			"collate": false,
    			"status": 1,
    			"outputPortId": 1,
    			"outputPortName" "Test printer",
    			"jobType": "PRINT"
            },
    ...
        ],
        "recordsOnPage": 2,
        "nextPageToken": "8a63ee56-3d9e-404f-a131-86b3bf9025b8",
        "dateStart": "2021-09-07T16:38:10.972Z",
        "dateEnd": "2021-09-10T16:38:10.972Z",
        "domainName": "testaccount1",
        "userName": "admin",
        "portName": ""
    }

Presence of the `nextPageToken` means that there's more data than you received on this page and you have to query next portion like the following:

    curl --location --request GET 'https://yourhost:7300/api/v1/documents/history?pagetoken=8a63ee56-3d9e-404f-a131-86b3bf9025b8' \
    --header 'X-Api-Key: advanced_api_permissions_key' \

Repeat paging until returned `nextPageToken` becomes blank.

### Record print/copy/scan jobs:

The request can be authentication either by using a device token or a user token.

1. If you want to use a user token, the user for the job record is taken from the user token.

2. If you want to use a device token, the user for the job record is taken from the required parameters "username" and "providerid".

In any case, the request requires API key configured with an authenticated request or a trusted endpoint.

* Path: `/documents/history`

* Method: `POST`

* Parameters:

  * \[required\] `jobtype: String ` Document job type: `PRINT, COPY, SCAN, FAX.`

  * \[optional\] `totalpages: String ` Total pages of the document.

  * \[optional\] `colorpages: String ` Color pages of the document.

  * \[optional\] `papersize: String ` Size of document paper.

  * \[optional\] `duplex: Boolean ` Types of duplex printing: If true use LONG otherwise `SHORT` .

  * \[optional\] `title: String ` Title of the document.

  * \[optional\] `serialnumber: String ` Serial number to find output port.

  * \[optional\] `address: String ` Address to find output port.

  * \[optional\] `username: String ` User name, if you use a device token.

  * \[optional\] `providerid: String ` Authentication provider identifier, if you use a device token.

  * \[optional\] `datetime: String ` Date time in format `YYYY-MM-DDTHH:mm:ss+HH:mm` to set concrete time of the record.

Returns: 200 Success

Errors: 400, 401, 403

Example request:

    curl -i -X POST -H "X-Api-Key:" -H "Authorization:" -d "jobtype=PRINT" "https://:7300/api/v1/documents/history"

### Upload document

Permission info

If you provide a user token, make sure the user for whom the token was issued has the AddJob permission.

Does not require Advanced API permissions.

* Path: `/documents`

* Method: `PUT`

* Parameters (**multipart/form-data** request):

  * \[optional\] `providerid: int` The ID of the authentication provider for the given user. If not provided or zero, the server will attempt to guess it.

  * `data: form-data` A multipart form parameter with **Content-Disposition: form-data; name="data"; filename="xxx"** header and

    content type `application/octet-stream`

  * `username: string` Name of the user

  * `portname: string` Name of the input port (queue)

  * `title: string` Document title

  * \[optional\] `copies: string` Number of copies

  * \[optional\] `grayscale: string` Should print grayscale true/false

  * \[optional\] `duplex: string` Duplex flag: 0=simplex, 1=long edge, 2=short edge

  * \[optional\] `outputpagesize` `: string` Output page size ("Original", "A3", "A4", "A5", "A6", "Letter", "Legal", "Ledger", "Tabloid" or custom "\<Width\>x\<Height\>" width and height in points - for example for A4 "595x842")

  * \[optional\] `pageorientation` `: string` Page orientation: 0 = portrait, 1 = landscape (Note: Some page output page sizes do not support page orientation - like Ledger or Tabloid.)

  * \[optional\] `scale` `: string` Scale in percent (1-100)

  * \[optional\] `collate: string` Should enable collation of the document true/false

* Returns: `DocumentInfo`

* Errors: 400, 403

cURL example:

    curl -X PUT -i -v -H "X-Api-Key: "  -F "username=" -F "portname=" -F "title=" -F "data=@;filename=" -k https://:7300/api/v1/documents

Replace all with real values.

The "@" symbol in `-F "data="` is mandatory.

If the extension of the 'filename' is different than pdf, please make sure that you include that extension to the 'title' parameter.

For example, if the filename=file.docx, the title should be test.docx.  
Limitations for uploading MS Office files:

* The maximum document size the user can upload is 200 MB.

* Print preview of one Microsoft Excel file can contain at most 10 thousand pages.

* The duration of conversion from MS Office files to PDF is limited to 5 minutes.

If the user exceeds any of these limitations, it will result in conversion failure.  
^Parameters outputpagesize, pageorientation, scale are supported only using the push print (when job is sent directly to the printer).^

^With pull print (when job is downloaded on MFD and printed) these parameters are ignored.^  
Uri upload is no longer supported for documents endpoint!

### Delete document

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewJob and DeleteJob permissions.

Does not require Advanced API permissions for a user who owns the document.

* Path: `/documents/<uuid>`

* Method: DELETE

* Parameters:

  * `uuid: pathparam` Document UUID taken from the request path

* Returns: `ErrorCodeInfo`

* Errors: 403

### Send document to output port

Permission info

If you provide a user token, make sure the user for whom the token was issued has ReleaseJob permission.

Does not require Advanced API permissions for a user who owns the document.

An insecure API key is not allowed for this request.

* Path: `/documents/<uuid>/<address or SN>`

* Method: POST

* Parameters:

  * `uuid: pathparam` Document UUID

  * `address: pathparam` Output port address

  * `SN`: `pathparam` Output port serial number

  * `copies: int` Number of copies requested

  * `grayscale: bool` Whether to output in grayscale (true/false)

  * `retain: bool` Whether to keep the document after printing (true/false), default is false

  * `duplex: int` Duplex flag: 0=simplex, 1=long edge, 2=short edge

* Returns: `ErrorCodeInfo`

* Errors: 400, 403

Content

Content-type application/x-www-form-urlencoded has to be specified even when no additional parameters are specified.

### Download document

Permission info

If you provide a user token, make sure the user, for whom the token was issued, has ViewJob permission.

Does not require Advanced API permissions for a user who owns the document.

Insecure API key is not allowed for this request.

* Path: `/documents/<uuid>.content`

* Method: GET

* Parameters:

  * `uuid: pathparam` Document UUID

  * `copies: int` Number of copies requested

  * `grayscale: bool` Whether to output in grayscale (true/false)

  * `retain: bool` Whether to keep the document after printing (true/false), default is false

  * `duplex: int` Duplex flag: 0=simplex, 1=long edge, 2=short edge

* Returns: 200 Success

* Errors: 400, 403, 404, 503

## Output Ports

### Get list of output ports for user

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort permission.

* Path: `/outputports`

* Method: `GET`

* Parameters:

  * \[optional\] `providerid: int` The ID of the authentication provider for the given user. If not provided or zero, the server will attempt to guess it.

  * \[optional\] `username: string` name of the user for which the ports will be retrieved

  * \[optional\] `enrichPorts: boolean` specify whether ports should include additional information, such as account, container and location id. Default: false

* Returns: `list`

* Errors: 403

### Create output port - POST

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort and CreateOutputPort permissions.

* Path: `/outputports`

* Method: `POST`

* Parameters:

  * `domainname: string` Domain name of the parent account

  * `portname: string` Name of the port

  * `address: string` Port address

  * `porttype: int` Port type: 0 = dummy, 1 = printer

  * \[optional\] `serviceid: int` Id of the service (document output or terminal service) which this port will use. This parameter can be specified multiple times.

  * \[optional\] `vendor: string` Short name of the printer vendor (unknown, fujifilm, ricoh, km, sharp, hp, lexmark, xerox, kyocera, toshiba, canon, brother, epson, eop)

  * \[optional\] `embedded: bool` Whether this printer has embedded client (true/false)

  * \[optional\] `printprotocol: int` Printing protocol: 0 = tcp, 1 = ipp, 2 = spooler (CUPS)

  * \[optional\] `outputtype: int` Output type: 0 = raw, 1 = PDF, 3 = PCL6, 4 = Postscript level 3, 5 = Postscript level 2. The value of 2 is deprecated and should not be used.

  * \[optional\] `reversefinisher: bool` Whether this printer has a finisher with reversed path (true/false)

  * \[optional\] `printerippurl: string` Printer IPP URL

  * \[optional\] `modelfamily: int` printer model family: if PrinterVendor is RICOH =\> 0 = "Ricoh SDK/J" ;1 -\> "Ricoh SOP" \| if PrinterVendor is XEROX =\> 0 = "WorkCentre"; 1 = "AltaLink"; 2 = "VersaLink"

  * \[optional\] `monochromeprinter: bool` Monochrome printer (true/false)

  * \[optional\] `ipreaderaddress: string` IP Reader address

  * \[optional\] `embeddedconfiguration: int` Id of Embedded configuration

  * \[optional\] `deviceserial: string` IP Reader address

  * \[optional\] `matchinginputport: bool` If true, a matching input port is automatically created (true/false)

  * \[optional\] `description: string` Port description

  * \[optional\] `softwareCopyCollation:` `bool `Use software copy collation instead of internal printer copy collation (true/false)

  * \[optional\] `sendusername:` `bool `Jobs printed on this output port contain usernames instead of anonymous (true/false) (IPP only)

  * \[optional\] `deviceAdminUsername : string`Machine credentials for the specific output port (overrides credentials specified in Embedded configuration if given)

  * \[optional\] `deviceAdminPassword : string`Machine credentials for the specific output port (overrides credentials specified in Embedded configuration if given)

  * \[optional\] `active : bool` Whether this printer is activated or not (requires `ViewLicense`, `ModifyLicense` permissions)

  * \[optional\] `groupNo : string` string identifying the license group (can be found as part of group label MA123456:0 -\> 0 will be groupNo) (requires `ViewLicense`, `ModifyLicense` permissions)

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X POST -i -H "X-Api-Key:" -k "https://account-domain-name:7300/api/v1/outputports" -d domainname= -d portname= -d address= -d porttype= -d ipreaderaddress= -d deviceserial= -d reversefinisher= -d printerippurl= -d modelfamily= -d monochromeprinter= -d embeddedconfiguration= -d description= -d softwareCopyCollation= -d sendusername=

Replace all with real values.

### Create output port - PUT

This endpoint is being deprecated and will not be updated in future releases, please use POST create output port endpoint above.  
Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort and CreateOutputPort permissions.

* Path: `/outputports`

* Method: `PUT`

* Parameters:

  * `domainname: string` Domain name of the parent account

  * `portname: string` Name of the port

  * `address: string` Port address

  * `porttype: int` Port type: 0 = dummy, 1 = printer

  * \[optional\] `serviceid: int` Id of the service (document output or terminal service) which this port will use. This parameter can be specified multiple times.

  * \[optional\] `vendor: string` Short name of the printer vendor (unknown, fujifilm, ricoh, km, sharp, hp, lexmark, xerox, kyocera, toshiba, canon, brother, epson, eop)

  * \[optional\] `embedded: bool` Whether this printer has embedded client (true/false)

  * \[optional\] `printprotocol: int` Printing protocol: 0 = tcp, 1 = ipp, 2 = spooler (CUPS)

  * \[optional\] `outputtype: int` Output type: 0 = raw, 1 = PDF, 3 = PCL6, 4 = Postscript level 3, 5 = Postscript level 2. The value of 2 is deprecated and should not be used.

  * \[optional\] `reversefinisher: bool` Whether this printer has a finisher with reversed path (true/false)

  * \[optional\] `printerippurl: string` Printer IPP URL

  * \[optional\] `modelfamily: int` printer model family: if PrinterVendor is RICOH =\> 0 = "Ricoh SDK/J" ;1 -\> "Ricoh SOP" \| if PrinterVendor is XEROX =\> 0 = "WorkCentre"; 1 = "AltaLink"; 2 = "VersaLink"

  * \[optional\] `monochromeprinter: bool` Monochrome printer (true/false)

  * \[optional\] `ipreaderaddress: string` IP Reader address

  * \[optional\] `embeddedconfiguration: int` Id of Embedded configuration

  * \[optional\] `deviceserial: string` IP Reader address

  * \[optional\] `matchinginputport: bool` If true, a matching input port is automatically created (true/false)

  * \[optional\] `description: string` Port description

  * \[optional\] `softwareCopyCollation: bool` Use software copy collation instead of internal printer copy collation (true/false)

  * \[optional\] `deviceAdminUsername : string`Machine credentials for the specific output port (overrides credentials specified in Embedded configuration if given)

  * \[optional\] `deviceAdminPassword : string`Machine credentials for the specific output port (overrides credentials specified in Embedded configuration if given)

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X PUT -i -H "X-Api-Key:" -k "https://account-domain-name:7300/api/v1/outputports" -d domainname= -d portname= -d address= -d porttype= -d ipreaderaddress= -d deviceserial= -d reversefinisher= -d printerippurl= -d modelfamily= -d monochromeprinter= -d embeddedconfiguration= -d description=

Replace all with real values.

### Update output port - PATCH

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort and ModifyOutputPort permissions.

* Path: `/outputports/<outputportid>`

* Method: `PATCH`

* Parameters:

  * `outputportid: pathparam` Existing output port id

  * `domainname: string` Domain name of the parent account

  * `portname: string` Name of the port

  * `address: string` Port address

  * `porttype: int` Port type: 0 = dummy, 1 = printer

  * \[optional\] `serviceid: int` Id of the service (document output or terminal service) which this port will use. This parameter can be specified multiple times.

  * \[optional\] `vendor: string` Short name of the printer vendor (unknown, fujifilm, ricoh, km, sharp, hp, lexmark, xerox, kyocera, toshiba, canon, brother, epson, eop)

  * \[optional\] `embedded: bool` Whether this printer has embedded client (true/false)

  * \[optional\] `printprotocol: int` Printing protocol: 0 = tcp, 1 = ipp, 2 = spooler (CUPS)

  * \[optional\] `outputtype: int` Output type: 0 = raw, 1 = PDF, 3 = PCL6, 4 = Postscript level 3, 5 = Postscript level 2. The value of 2 is deprecated and should not be used.

  * \[optional\] `reversefinisher: bool` Whether this printer has a finisher with reversed path (true/false)

  * \[optional\] `printerippurl: string` Printer IPP URL

  * \[optional\] `modelfamily: int` printer model family: if PrinterVendor is RICOH =\> 0 = "Ricoh SDK/J" ;1 -\> "Ricoh SOP" \| if PrinterVendor is XEROX =\> 0 = "WorkCentre"; 1 = "AltaLink"; 2 = "VersaLink"

  * \[optional\] `monochromeprinter: bool` Monochrome printer (true/false)

  * \[optional\] `ipreaderaddress: string` IP Reader address

  * \[optional\] `embeddedconfiguration: int` Id of Embedded configuration

  * \[optional\] `deviceserial: string` IP Reader address

  * \[optional\] `matchinginputport: bool` If true, a matching input port is automatically created (true/false)

  * \[optional\] `description: string` Port description

  * \[optional\] `softwareCopyCollation: bool` Use software copy collation instead of internal printer copy collation (true/false)

  * \[optional\] `sendusername: bool `Jobs printed on this output port contain usernames instead of anonymous (true/false) (IPP only)

  * \[optional\] `deviceAdminUsername : string`Machine credentials for the specific output port (overrides credentials specified in Embedded configuration if given)

  * \[optional\] `deviceAdminPassword : string`Machine credentials for the specific output port (overrides credentials specified in Embedded configuration if given)

  * \[optional\] `active : string` "true" / "false" Whether this printer is activated or not (requires `ViewLicense`, `ModifyLicense` permissions)

  * \[optional\] `groupNo: string` string identifying the license group (can be found as part of group label MA123456:0 -\> 0 will be groupNo) (requires `ViewLicense`, `ModifyLicense` permissions)

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X PATCH -i -H "X-Api-Key:" -k "https://account-domain-name:7300/api/v1/outputports/<outputportid>" -d domainname= -d portname= -d address= -d porttype= -d ipreaderaddress= -d deviceserial= -d reversefinisher= -d printerippurl= -d modelfamily= -d monochromeprinter= -d embeddedconfiguration= -d description= -d softwareCopyCollation= -d sendusername= 

Replace all with real values.

### Update output port - PUT

This endpoint is being deprecated and will not be updated in future releases, please use PATCH update output port endpoint above.  
Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort and ModifyOutputPort permissions.

* Path: `/outputports`

* Method: `PUT`

* Parameters:

  * `id: int` Existing output port id

  * same parameters as for "Create output port - PUT"

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X PUT -i -H "X-Api-Key:" -k "https://account-domain-name:7300/api/v1/outputports" -d domainname= -d portname= -d address= -d porttype= -d ipreaderaddress= -d deviceserial= -d reversefinisher= -d printerippurl= -d modelfamily= -d monochromeprinter= -d embeddedconfiguration= -d description= -d id=

Replace all with real values.

### Move output port

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort and ModifyOutputPort permissions.

* Path: `/outputports/<outputportid>/move`

* Method: `PUT`

* Parameters:

  * `outputportid: pathparam` Existing output port id

  * `domainname: string` Domain name of the parent account

  * `destinationdomainname: string` Specifies the domain name of the target account or container where the output port will be moved in the tree

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X PUT -i -H "X-Api-Key:" -k "https://account-domain-name:7300/api/v1/outputports/<outputportid>/move" -d domainname= -d destinationdomainname

Replace all with real values.  
The output port can only be moved within the same parent account and cannot be transferred outside of its current account hierarchy.

### Delete output port

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewOutputPort and DeleteOutputPort permissions.

* Path: `/outputports/`

* Method: DELETE

* Parameters:

  * `outputportid: pathparam` Id of the output port to delete

* Returns: `ErrorCodeInfo`

* Errors: 403

## Input Ports

### Create input port

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewInputPort and CreateInputPort permissions.

* Path: `/inputports`

* Method: `PUT`

* Parameters:

  * `domainname: string` Domain name of the parent account

  * `portname: string` Name of the port

  * `porttype: int` Port type: 0 = Pull queue, 1 = Push queue

  * \[optional\] `outputportid: int` Id of the mapped output port for push queue types

  * \[optional\] `portFlags: long` flags of the input port. Each bit from the long value represents a flag. Flags: AvailableByDefault: ...000001 (long value 1) -- enabled and ...000000 (long value 0) -- disabled.

  * \[optional\] `locationid: id` Id of the existing location to be assigned to the created input port

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X PUT -H "X-Api-Key: advanced_api_permissions_key" -k "https://server_name:7300/api/v1/inputports" -d domainname= -d portname= -d porttype= -d outputportid= -d locationid=

Replace all with real values.

### Update input port

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewInputPort and ModifyInputPort permissions.

* Path: `/inputports`

* Method: `PUT`

* Parameters:

  * `id: int` Existing input port id

  * same parameters as for "Create input port"

* Returns: `ErrorCodeInfoId`

curl example:

    curl -X PUT -H "X-Api-Key: advanced_api_permissions_key" -k "https://server_name:7300/api/v1/inputports" -d domainname= -d portname= -d porttype= -d outputportid= -d locationid= -d id=

Replace all with real values.

### Get list of input ports for user

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewInputPort permission.

Does not require Advanced API permissions.

* Path: `/inputports`

* Method: `GET`

* Parameters:

  * \[optional\] `providerid: int` The ID of the authentication provider for the given user. If not provided or zero, the server will attempt to guess it.

  * \[optional\] `username: string` name of the user for which the ports will be retrieved

  * \[optional\] `locationids: int` location id. This parameter can be specified more than once.

  * \[optional\] `enrichPorts: boolean` specify whether ports should include additional information, such as account, container and location id. Default: false

* Returns: `list`

* Errors: 403

### Delete input port

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewInputPort and DeleteInputPort permissions.

* Path: `/inputports/`

* Method: DELETE

* Parameters:

  * `inputportid: pathparam` Id of the input port to delete

* Returns: `ErrorCodeInfo`

* Errors: 403

## Users

### Get user information

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewUser permission.

* Path: `/users`

* Method: `GET`

* Parameters:

  * `username: string` Name of the user

  * `providerid` `: int` Identifier of the authentication provider to which the user belongs.

* Returns: `UserInfo`

* Errors: 403, 404

Curl example:

    curl -X GET -i -H X-Api-Key: -k https://account-domain-name:7300/api/v1/users?username=john.doe&providerid=3

### Get all users of authentication provider

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewUser permission.

* Path: `/users/all`

* Method: `GET`

* Parameters:

  * `providerid` `: int` Identifier of the authentication provider to which the user belongs.

  * \[optional\] `maxrecords: int` Maximum number of records on the single response page. The default value is 50, maximum is 1000.

  * \[optional\] `pagetoken: string` If the number of records for your query exceeds maxrecords value, the endpoint responds with exactly maxrecords number of users and non-empty nextPageToken field. Use value of nextPageToken as a pagetoken parameter to get the next page.

* Returns: `List<UserInfo>`

* Errors: 403

Curl example:

    curl -X GET -i -H X-Api-Key: -k https://account-domain-name:7300/api/v1/users/all?providerid=3

    curl -X GET -i -H X-Api-Key: -k https://account-domain-name:7300/api/v1/users/all?providerid=3&pagetoken=50&maxrecords=100

### Create user

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewUser and CreateUser permissions.

* Path: `/users`

* Method: `PUT`

* Parameters:

  * `username: string` Name of the user

  * \[optional\] `providerid` `: int` Identifier of the authentication provider under which the user will be created. If the providerid is not specified, the user will be created under a local provider.

  * \[optional\] `detailtype: int` Type of the user detail to add: 0=full name, 1=email, 2=homefolder, 3=password, 4=cardid, 5=shortid, 6=pin, 7=alias, 11=department, 12=expiration, 14=externalid

  * \[optional\] `detaildata: string` Detail data. `detailtype` and `detaildata` can be repeated multiple times

* Returns: `ErrorCodeInfo`

* Errors: 403

curl example:

    curl -X PUT -i -H X-Api-Key: -d username=john.doe -d detailtype=3 -d detaildata=password1 -d detailtype=1 -d detaildata=john.doe@cool.com -k https://account-domain-name:7300/api/v1/users

    curl -X PUT -i -H X-Api-Key: -d username=john.doe -d providerid=129 -d detailtype=3 -d detaildata=password1 -d detailtype=1 -d detaildata=john.doe@cool.com -k https://account-domain-name:7300/api/v1/users

### Delete user

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewUser and DeleteUser permissions.

* Path: `/users/<username>`

* Method: DELETE

* Parameters:

  * `username: pathparam` Name of the user to delete

  * \[optional query parameter\] `providerid` `: int` Identifier of the authentication provider of the user who will be deleted. Users with the same username but different authentication providers will not be deleted. If the providerid is not specified, the user with the given username will be deleted from the local provider.

* Returns: `ErrorCodeInfo`

* Errors: 403

curl example:

    curl -X DELETE -i -H X-Api-Key: -k https://account-domain-name:7300/api/v1/users/john.doe

    curl -X DELETE -i -H X-Api-Key: -k https://account-domain-name:7300/api/v1/users/john.doe?providerid=129

### Update user details

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewUser, ModifyUser, GenerateShortID, GenerateOTP, and CardManagement permissions.

GenerateShortID, GenerateOTP, or CardManagement permissions are required only when the Short ID, One time password, or Card number is updated. If you do not change any of these values, none of these permissions is required.

* Path: `/users/<username>`

* Method: POST

* Parameters:

  * `username: pathparam` Name of the user to update

  * \[optional\] `providerid` `: int` Identifier of the authentication provider where the user will be searched for. If the providerid is not specified, the user will be searched for in a local provider.

  * `detailtype: int` Type of the user detail to update: 0=full name, 1=email, 2=homefolder, 3=password, 4=cardid, 5=shortid, 6=pin, 7=alias, 11=department, 12=expiration, 14=externalid

  * \[optional\] `detaildata: string` Detail data. If not specified, the given detail is deleted from the user. An alias can be specified with "#PID" suffix where PID is a provider ID, for example: "user@domain.com#1234"

  * \[optional\] `invalidatetokens: boolean` When password value is changed this toggle can be used to invalidate all user sessions and user refresh tokens. Default value is `false`.

  * Note that this API call can update only one user detail. If multiple details are provided, only the first will be updated.

* Returns: `ErrorCodeInfo`

* Errors: 403

curl example:

    curl -X POST -i -H X-Api-Key: -d detailtype=3 -d detaildata=password1 -k https://account-domain-name:7300/api/v1/users/john.doe

    curl -X POST -i -H X-Api-Key: -d providerid=129 -d detailtype=3 -d detaildata=password1 -k https://account-domain-name:7300/api/v1/users/john.doe

### Import users from csv

Permission info

If you provide a user token, make sure the user for whom the token was issued has CreateUser and ModifyUser permissions.

* Path: `/users/import`

* Method: `POST`

* Parameters:

  * `data: file` Csv file in format: username;firstname;lastname;mail;usergroup

  * `group: string` Name of the local group where the users will be imported

  * `mapping: string` Fields mapping in csv file (ex: userName:0,firstName:1,lastName:2,email:3,group:4)

  * \[optional\] `separator: string` Field separator in file (The default value is ',')

  * \[optional\] `hasheader: boolean` Check if the first row is a header inside the file (The default value is false)

  * \[optional\] `async: string` Check if you wish to wait for the synchronization to be finished (The default value is false)

* Returns: `ErrorCodeInfo`

* Errors: 400

curl example:

    curl -X POST -i -H X-Api-Key: --form-string "separator=;" -F "mapping=userName:0,firstName:1,lastName:2,email:3,group:4" -F "hasheader=false"  -F "group=" -F"data=@" -k https://account-domain-name:7300/api/v1/users/import

All imported users will be added to the group available in the request (-F "group=group_name")  
Only users part of the group sent in the request (-F "group=group_name") will be deactivated after the synchronization.

### Register card for user

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser, ModifyUser, and CardManagement permissions.

Does not require Advanced API permissions.

* Path: `/users/<username>/cards`

* Method: POST

* Parameters:

  * `username: pathparam` Name of the user to whom the card is registered

  * `cardid: string `The ID of the registered card

* Returns: `ErrorCodeInfo`

* Errors: 400, 403

    curl -X POST -H "X-Api-Key: " -H "Authorization: " -k "https://:7300/api/v1/users/<username>/cards" -d cardid=

### Get list of groups for a given local user

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser permission.

* Path: `/users/USERNAME/groups`

* Method: `GET`

* Parameters:

  * `USERNAME: pathparam` path parameter which contains local user name; specify user name (case insensitive) between two slashes in the path, e.g. for TestUser: `/users/testuser/groups`

* Returns: `list`

* Errors: 400

cURL example:

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/users//groups"

    curl -X GET -i -H  'X-Api-Key:46405b18-8e1b-4db9-b930-bedd9ae839af' -k https://<ac:structured-macro ac:name="scroll-conditional-content-inline" ac:schema-version="1"><ac:parameter ac:name="content">SAFEQ Cloud</ac:parameter><ac:parameter ac:name="labels">safeq_cloud</ac:parameter></ac:structured-macro><ac:structured-macro ac:name="scroll-conditional-content-inline" ac:schema-version="1"><ac:parameter ac:name="content">Dispatcher Paragon Cloud</ac:parameter><ac:parameter ac:name="labels">dipa_cloud</ac:parameter></ac:structured-macro><ac:structured-macro ac:name="scroll-conditional-content-inline" ac:schema-version="1"><ac:parameter ac:name="content">CloudStream</ac:parameter><ac:parameter ac:name="labels">cloudstream</ac:parameter></ac:structured-macro><ac:structured-macro ac:name="scroll-conditional-content-inline" ac:schema-version="1"><ac:parameter ac:name="content">pmc</ac:parameter><ac:parameter ac:name="labels">pmc</ac:parameter></ac:structured-macro>1.test.local:7300/api/v1/users/mytestuser/groups

### Add local user to a list of provided groups

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser and ModifyUser permissions.

* Path: `/users/USERNAME/groups`

* Method: `PUT`

* Parameters:

  * `USERNAME: pathparam` path parameter which contains local user name; specify user name (case insensitive) between two slashes in the path, e.g. for TestUser: `/users/testuser/groups`

  * `groupid: string` one or more group IDs to which this user must be added. Each ID can be either a group primary key or a textual group ID.

* Returns: `ErrorCodeInfo`

* Errors: 400

cURL example:

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/users//groups" -d groupid=

### Set local user membership to a list of provided groups

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser and ModifyUser permissions.

* Path: `/users/USERNAME/groups`

* Method: `POST`

* Parameters:

  * `USERNAME: pathparam` path parameter which contains local user name; specify user name (case insensitive) between two slashes in the path, e.g. for TestUser: `/users/testuser/groups`

  * `groupid: string` zero or more group IDs, which will be set as user groups. The current groups will be removed from the user. Each ID can be either a group primary key or a textual group ID. If this parameter is not provided, all groups will be cleared.

* Returns: `ErrorCodeInfo`

* Errors: 400

### Delete groups from user's membership

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser and ModifyUser permissions.

* Path: `/users/USERNAME/groups`

* Method: `DELETE`

* Parameters:

  * `USERNAME: pathparam` path parameter which contains local user name; specify user name (case insensitive) between two slashes in the path, e.g. for TestUser: `/users/testuser/groups`

  * `groupid: string` one or more group IDs to delete from the user's membership. Each ID can be either a group primary key or a textual group ID.

* Returns: `ErrorCodeInfo`

* Errors: 400

cURL example:

    curl -X DELETE -i -H "X-Api-Key: " -k "https://:7300/api/v1/users//groups" -d groupid=

## Authentication provider

### Get authentication provider

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAuthenticationProviders permission.

* Path: `/authproviders`

* Method: GET

* Parameters:

  * `accountid=` The ID of SAFEQ Cloud account domain

  * \[optional\] none

* Returns: `AuthenticationProvidersInfo`

* Errors: 400

* Can be called without X-Api-Key. In this case, it will only return providers without any client/web secrets

Bash script example:

    #!/bin/sh
    ACCOUNT_INFO=`curl -X GET -H "X-Api-Key:" -k https://:7300/api/v1/account`
    echo "$ACCOUNT_INFO"
    ACCOUNT_INFO_SED=$(echo "$ACCOUNT_INFO" | sed -E 's/.*"id":\s*(\S+)(,|}|\s).*/\1/g')
    echo "$ACCOUNT_INFO_SED"
    ACCOUNT_ID=$(echo "$ACCOUNT_INFO_SED" | cut -f1 -d ',')
    echo "$ACCOUNT_ID"
    LDAP_AUTH=`curl -X GET -i -H "" -k https://:7300/api/v1/authproviders?accountid="$ACCOUNT_ID"`
    echo "$LDAP_AUTH"

Replace all with real values.

### Add authentication provider

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAuthenticationProviders and ModifyAuthenticationProviders permissions.

* Path: `/authproviders`

* Method: PUT

* Parameters:

  * `-d ` parameters include:

  * \[name\] -- Name of authentication provider

  * \[providerType\] -- 0 (local)/1 (LDAP)/2 (Microsoft Entra ID)/3 (okta)

  * \[typeConfiguration\] -- authentication provider configuration details. For example, for local provider, it is `{}`

  * \[accountID\] -- The ID of SAFEQ Cloud account domain

  * \[priority\] -- default value is 0

  * \[active\] -- true (authentication provider is active) / false (authentication provider is inactive)

  * \[domainNames\] -- list of authorization provider domains

  * \[id\] -- defaults as 0

  * \[optional\] none

* Returns: `ResponseCodeInfo`

* Errors: 400

Bash script example to add an LDAP authentication provider:

    #!/bin/sh
    ACCOUNT_INFO=`curl -X GET -H "X-Api-Key:" -k https://:7300/api/v1/account`
    echo "$ACCOUNT_INFO"
    ACCOUNT_INFO_SED=$(echo "$ACCOUNT_INFO" | sed -E 's/.*"id":\s*(\S+)(,|}|\s).*/\1/g')
    echo "$ACCOUNT_INFO_SED"
    ACCOUNT_ID=$(echo "$ACCOUNT_INFO_SED" | cut -f1 -d ',')
    echo "$ACCOUNT_ID"
    LDAP_AUTH=`curl -X PUT -i -H "X-Api-Key:" -k https://:7300/api/v1/authproviders -d '{"name":"","providerType":1,"typeConfiguration":"{\"baseDN\":\"\",\"groupBaseDN\":\"\",\"address\":\"\",\"port\":389,\"ssl\":true,\"userName\":\"\",\"password\":\"\",\"active\":true,\"bindType\":0,\"searchMode\":0,\"userNameAttr\":\"\",\"fullNameAttr\":\"\",\"emailAttr\":\"\",\"cardId1Attr\":\"\",\"cardId2Attr\":\"\",\"shortIdAttr\":\"\",\"aliasAttr\":\"\",\"homeFolderAttr\":\"\",\"userAttrClass\":\"\",\"groupAttrClass\":\"\",\"nonEmptyAttrs\":[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]}","accountId":'"$ACCOUNT_ID"',"priority":0,"active":true,"domainNames":["acme.com"],"id":0}'`
    echo "$LDAP_AUTH"

Replace all with real values.

### Delete authentication provider

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAuthenticationProviders and DeleteAuthenticationProviders permissions.

* Path: `/authproviders/`

* Method: DELETE

* Parameters: none

  * \[optional\] none

* Returns: `ResponseCodeInfo`

* Errors: 400

bash script example:

    #!/bin/sh
    LDAP_AUTH=`curl -X DELETE -i -v -H "" -k https://:7300/api/v1/authproviders/`
    echo "$LDAP_AUTH"

Replace all with real values.

## Access controls

### Availability on secondary/gateway servers

All access controls endpoints work on primary servers only. If you call these endpoints on secondary/gateway server, you will receive status code 400 Bad Request.

### Get access control details

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccessControls permission.

* Path: `/accesscontrols`

* Method: GET

* Parameters:

  * `accountdomain=` DNS name of account domain

  * \[optional\] `permissionsdomain=` DNS name of the account's parent domain. By specifying this parameter, you will get access controls for the account domain, but defined at the parent domain level.

* Returns: `AccessControlsInfo`

* Errors: 400

bash script example:

    #!/bin/sh
    ACCESS_INFO=`curl -X GET -i -H "X-Api-Key:" -k https://:7300/api/v1/accesscontrols?accountdomain=`
    echo "$ACCESS_INFO"

Replace all with real values.

### Add access control

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccessControls and CreateAccessControls permissions.

* Path: `/accesscontrols`

* Method: PUT

* Parameters:

  * `accountdomain=` DNS name of account domain

  * `--data ` parameters include:

  * \[authProviderId\] -- ID of the authentication provider for which access control is being added.

  * \[roleName\] -- choose one based on scope -- Administrators/Users/Reporting/Support

  * \[userName\] -- use this parameter if assigning access control to the user directly (see note below)

  * \[groupName\] -- use this parameter if assigning access control to the group directly (see note below)

  * \[groupDn\] -- DN configuration of group/user

  * \[optional\] none

* Returns: `ResponseCodeInfo`

* Errors: 400

Note -- Depending on whether you are assigning access control to a user or a group, use "userName" or "groupName" parameter, but not both at the same time

bash script example to add access control for an LDAP group as Administrators in SAFEQ Cloud:

    #!/bin/sh
    ACCESS_INFO=`curl -X PUT -i -H "" -k https://:7300/api/v1/accesscontrols?accountdomain= --data '{"authProviderId":,"roleName":"Administrators","groupName":"","groupDn":""}'`
    echo "$ACCESS_INFO"

Replace all with real values.

### Delete access control by id

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewAccessControls and DeleteAccessControls permissions.

* Path: `/accesscontrols/*id*`

* Method: DELETE

* Parameters:

  * `accountdomain= ` DNS name of account domain

  * \[optional\] none

* Returns: `ResponseCodeInfo`

* Errors: 400

bash script example:

    #!/bin/sh
    ACCESS_INFO=`curl -X DELETE -i -H "" -k https://:7300/api/v1/accesscontrols/ACCESS_CONTROL_ID?accountdomain=`
    echo "$ACCESS_INFO"

Replace all with real values.  
Warning

Delete ACL can trigger resorting of ACL IDs. Before every DELETE operation call GET operation to check what is current ACL ID. Never call two DELETE operations because ID can change after the first DELETE. operation

## Locations

### Get list of locations

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewLocations permission.

Does not require Advanced API permissions.

* Path: `/locations`

* Method: `GET`

* Parameters:

  * `locationtype: int` location type. This parameter can be specified more than once. Recognized types: 1 = gateway IPv4 address, 2 = IPv4 subnet, 3 = IPv4 range, 4 = WiFi SSID.

  * `locationdata: string` location search data. This parameter can be specified more than once and must correspond to the location type. The subnet is specified in the format "192.168.1.100/24", IP range is specified in the format "192.168.1.100-192.168.1.200".

* Returns: `list`

* Errors: 400

    #!/bin/sh
    ACCESS_INFO=`curl -X GET -i -H "X-Api-Key:" -k "https://:7300/api/v1/locations?locationtype=1&amp;locationdata=192.168.1.100"`
    echo "$ACCESS_INFO"

Replace all with real values.

### Get location by id

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewLocations permission.

Does not require Advanced API permissions.

* Path: `/locations`

* Method: `GET`

* Parameters:

  * `locationId=` The location ID

* Returns: `LocationInfo`

* Errors: 404

    #!/bin/sh
    ACCESS_INFO=`curl -X GET -i -H "X-Api-Key:" -k "https://:7300/api/v1/locations/"`
    echo "$ACCESS_INFO"

Replace all with real values.

### Create location

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewLocations and CreateLocations permissions.

* Path: `/locations`

* Method: `POST`

* Parameters: `LocationInfo` as JSON payload, except `id` property -- skip it

* Returns: `ErrorCodeInfoId` , `id` property will contain a newly generated location identifier

* Errors: 400, 403

    curl -X POST -H "X-Api-Key: advanced_api_permissions_key" -k "https://serveraddress:7300/api/v1/locations" --data-binary @- &lt;&lt; EOF
    {
            "name": "Location name",
            "identifiers": [
                    {
                            "locationType": 1,
                            "stringData": [
                                    "192.168.1.100"
                            ]
                    }
            ]
    }
    EOF

### Update existing location by id

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewLocations and ModifyLocations permissions.

* Path: `/locations/*id*`

* Method: `PUT`

* Parameters: `LocationInfo` as JSON payload

* Returns: `LocationInfo`

* Errors: 400, 403, 404

    curl -X PUT -H "X-Api-Key: advanced_api_permissions_key" -k "https://serveraddress:7300/api/v1/locations/LOCATION_ID" --data-binary @- &lt;&lt; EOF
    {
            "name": "Location name",
            "identifiers": [
                    {
                            "locationType": 1,
                            "stringData": [
                                    "192.168.1.100"
                            ]
                    }
            ]
    }
    EOF

Replace `LOCATION_ID` with real value.

### Delete location by id

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewLocations and DeleteLocations permissions.

* Path: `/locations/*id*`

* Method: `DELETE`

* Parameters: None

* Returns: `ErrorCodeInfoId`

* Errors: 403, 404

    curl -X DELETE -H "X-Api-Key: advanced_api_permissions_key" -k "https://serveraddress:7300/api/v1/locations/LOCATION_ID"

Replace `LOCATION_ID` with real value.

## Card reader

### Release all jobs using the card reader

Permission info

Does not require Advanced API permissions.

Path: `/card`

* Method: `GET`, `POST`

* Parameters:

  * `cd: string` required user card reader ID

  * `Mac: string` required printer IP card reader address

* Returns: 200 Success

* Errors: 400

* Notes: For `POST` method, the parameters must be sent as query parameters, not body parameters.

cURL example:

    curl -X GET -i -v -H "X-Api-Key: " -k "https://:7300/api/v1/card/?cd=&amp;amp;Mac="

## Groups

### Get list of local groups

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser permission.

* Path: `/groups`

* Method: `GET`

* Parameters:

* Returns: `list`

cURL example:

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/groups"

### Create local user group

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewUser and CreateUser permissions.

* Path: `/groups`

* Method: `PUT`

* Parameters:

  * `groupname: string` required local group name

  * `groupdn` optional group ID. If omitted, a unique group ID will be generated.

* Returns: `ErrorCodeInfo` which contains a new group ID

* Errors: 400

cURL example:

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/groups" -d  groupname= -d groupdn=

### Delete local user group

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser and DeleteUser permissions.

* Path: `/groups/`

* Method: `DELETE`

* Parameters:

  * `GROUPID: pathparam` path parameter which indicates either group primary key (integer) or group ID (string)

* Returns: `ErrorCodeInfo`

cURL example:

    curl -X DELETE -i -v -H "X-Api-Key: " -k "https://:7300/api/v1/groups/"

### Get info about group

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser permission.

* Path: /groups/`GROUPID`

* Method: `GET`

* Parameters:

  * `GROUPID: pathparam` path parameter which indicates either group primary key (integer) or group ID (string)

* Returns: `GroupInfo`

* Errors: 404

cURL example:

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/groups/GROUPID"

### Get members of a group

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewUser permissions.

* Path: /groups/`GROUPID`/members

* Method: `GET`

* Parameters:

  * `GROUPID: pathparam` path parameter which indicates either group primary key (integer) or group ID (string)

* Returns: `List<UserInfo>`

* Errors: 404

cURL example:

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/groups/GROUPID/members"

## Terminal config

### Create terminal configuration

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewTerminalConfig and CreateTerminalConfig permissions.

* Path: `/terminalconfig`

* Method: `POST`

* Parameters:

  * `domain: string` required account domain where to add the configuration

  * `name: string` required configuration name

  * `vendor: string` required printer vendor (ex: km, hp, xerox ....)

  * `adminuser: string` optional admin username. If omitted, empty is the default

  * `adminpassword: string` optional admin password. If omitted, empty is the default

  * `applicationtype: int` optional application type (ex: 0:Other, 1:Open_API, 2: IWS, 3: Workpath). If omitted, OTHER is the default

  * `devices: int` optional list of mapped output port IDs. Can be repeated multiple times

* Returns: `ErrorCodeInfo` which contains the new terminal config ID

* Errors: 400

cURL example:

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/terminalconfig" -d  domain= -d name= -d vendor= -d adminuser= -d adminpassword= -d applicationtype= -d devices=

### Get terminal configuration

Permission info

Does not require Advanced API permissions.

Authorization with a device token or allowing untrusted endpoints is required .  
This feature is only available for the Ricoh Standard Embedded Terminal.

* Path: `/terminalconfig`

* Method: `GET`

* Parameters:

  * `serialnumber: string` required serial number (device serial) of the printer

* Returns: `TerminalConfig`

* Errors: 400, 403, 404

cURL example:

    curl -X GET -i -H "X-Api-Key: " "https://:7300/api/v1/terminalconfig?serialnumber="

    curl -X GET -i -H "X-Api-Key: " -H "Authorization: " "https://:7300/api/v1/terminalconfig?serialnumber="

## Token

Permission info

Does not require Advanced API permissions.  
This function is deprecated and will be removed in future versions. Use the **/oauth/v1/token** endpoint to refresh both user and device tokens. See the [Refresh device or user token](https://docs.ysoft.cloud/api/latest/safeq-cloud/refresh-device-or-user-token.md) chapter for more information.

### Refresh user token

* Path: `/token`

* Method: `GET`

* Parameters:

  * `refresh_token: string` a refresh token acquired in the login call

* Returns: `TokenInfo`

* Errors: 400, 403

A given refresh token can only be used once. The next call to a refresh function should be done with a new refresh token.

cURL example:

    curl -i -H "X-Api-Key: xxx" -k "https://serveraddress:7300/api/v1/token?refresh_token=yyy"

## Scan Connectors

Note

This feature is currently hidden by default and may not be available for your account.

### Get scan connector

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow permission.

* Path: `/scan/connectors/<scanConnectorId>`

* Method: `GET`

* Parameters:

  * `scanConnectorId: int` Id of the connector

* Returns: `ScanConnectorInfo`

* Errors: 403, 404

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/connectors/<scanConnectorId>"

### Get all scan connectors

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow permission.

* Path: `/scan/connectors`

* Method: `GET`

* Returns: `list<ScanConnectorInfo>`

* Errors: 403, 404

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/connectors"

### Update scan connector

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow and ModifyScanWorkflow permissions.

* Path: `/scan/connectors/<scanConnectorId>`

* Method: `PUT`

* Parameters:

  * `scanConnectorId: int` Id of the connector

  * `scanConnector: ScanConnectorInfo` - see [Data structures](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md).

* Returns: `ScanConnectorInfo`

* Errors: 403, 404

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/connectors/<scanConnectorId>" --data "{\"name\":\"Connector\", \"connectorType\":\"EMAIL\"}"

### Create scan connector

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow and CreateScanWorkflow permissions.

* Path: `/scan/connectors`

* Method: `POST`

* Parameters:

  * `scanConnector: ScanConnectorInfo` - see [Data structures](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md).

* Returns: `ScanConnectorInfo`

* Errors: 403, 404

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/connectors" --data "{\"name\":\"Connector\", \"connectorType\":\"EMAIL\"}"

### Delete scan connector

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow and DeleteScanWorkflow permissions.

* Path: `/scan/connectors/<scanConnectorId>`

* Method: `DELETE`

* Parameters:

  * `scanConnectorId: int` Id of the connector

* Returns: 204

* Errors: 403, 404

    curl -X DELETE -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/connectors/<scanConnectorId>"

## Scan Workflows

Note

This feature is currently hidden by default and may not be available for your account.

### Get scan workflow

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow permission.

* Path: `/scan/workflows/<scanWorkflowId>`

* Method: `GET`

* Parameters:

  * `scanWorkflowId: int` Id of the workflow

* Returns: `ScanWorkflowTemplateInfo`

* Errors: 403, 404

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/workflows/<scanWorkflowId>"

### Get all scan workflows

Permission info

If you provide a user token, make sure the user for whom the token was issued has ViewScanWorkflow permission.

* Path: `/scan/workflows`

* Method: `GET`

* Returns: `list<ScanWorkflowTemplateInfo>`

* Errors: 403, 404

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/workflows"

### Update scan workflow

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow and ModifyScanWorkflow permissions.

* Path: `/scan/workflows/<scanWorkflowId>`

* Method: `PUT`

* Parameters:

  * `scanWorkflowId: int` Id of the workflow

  * `scanWorkflow: ScanWorkflowTemplateInfo` - see [Data structures](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md).

* Returns: `ScanWorkflowTemplateInfo`

* Errors: 403, 404

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/workflows/<scanWorkflowId>" --data "{\"name\":\"Workflow\", \"connectorId\":<scanConnectorId>}"

### Create scan workflows

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow and CreateScanWorkflow permissions.

* Path: `/scan/workflows`

* Method: `POST`

* Parameters:

  * `scanWorkflow: ScanWorkflowTemplateInfo` - see [Data structures](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md).

* Returns: `ScanWorkflowTemplateInfo`

* Errors: 403, 404

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/workflows" --data "{\"name\":\"Workflow\", \"connectorId\":<scanConnectorId>}"

### Delete scan workflow

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflow and DeleteScanWorkflow permissions.

* Path: `/scan/workflows/<scanWorkflowId>`

* Method: `DELETE`

* Parameters:

  * `scanWorkflowId: int` Id of the workflow

* Returns: 204

* Errors: 403, 404

    curl -X DELETE -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/workflows/<scanWorkflowId>"

## Scan Workflow Access

Note

This feature is currently hidden by default and may not be available for your account.

### Get scan workflow access

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflowAccessRule permission.

* Path: `/scan/access/<accessId>`

* Method: `GET`

* Parameters:

  * `accessId: int` Id of the workflow access

* Returns: `ScanWorkflowAccessInfo`

* Errors: 403, 404

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/access/<accessId>"

### Get all scan workflow accesses

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflowAccessRule permission.

* Path: `/scan/access`

* Method: `GET`

* Returns: `list<ScanWorkflowAccessInfo>`

* Errors: 403, 404

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/access"

### Update scan workflow access

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflowAccessRule and ModifyScanWorkflowAccessRule permissions.

* Path: `/scan/access/<accessId>`

* Method: `PUT`

* Parameters:

  * `accessId: int` Id of the workflow access

  * `accessInfo: ScanWorkflowAccessInfo` - see [Data structures](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md).

* Returns: `ScanWorkflowAccessInfo`

* Errors: 403, 404

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/access/<accessId>" --data "{\"workflowId\":100, \"identityId\":2, \"identityType\":\"Group\"}"

### Create scan workflow access

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflowAccessRule and CreateScanWorkflowAccessRule permissions.

* Path: `/scan/access`

* Method: `POST`

* Parameters:

  * `accessInfo: ScanWorkflowAccessInfo` - see [Data structures](https://docs.ysoft.cloud/api/latest/safeq-cloud/data-structures.md).

* Returns: `ScanWorkflowAccessInfo`

* Errors: 403, 404

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/access" --data "{\"workflowId\":1, \"identityId\":2, \"identityType\":\"User\"}"

### Delete scan workflow access

Permission info

If you provide a user token, make sure the user for whom the token was issued has the ViewScanWorkflowAccessRule and DeleteScanWorkflowAccessRule permissions.

* Path: `/scan/access/<accessId>`

* Method: `DELETE`

* Parameters:

  * `accessId: int` Id of the workflow access

* Returns: 204

* Errors: 403, 404

    curl -X DELETE -i -H "X-Api-Key: " -k "https://:7300/api/v1/scan/access/<accessId>"

## Certificates

This API is not available on gateways.

### Import a CA certificate

A ModifyCertificatepermission is needed for this operation.

* Path: `/certificate/ca`

* Method: `POST`

* Body: "application/octet-stream" of PEM/DER file

* Returns: 200 and CertificateInfo structure which contains

  * `alias`

  * `serial`

  * `subject`

  * `issuer`

  * `notBefore`

  * `notAfter`

  * `body `(public part of the certificate)

* Errors: 400

    curl -X POST -k -i -H X-Api-Key:$API_KEY -H Content-Type:application/octet-stream --data-binary "@cacert.pem" https://:7300/api/v1/certificate/ca

### Import private certificate chain

A ModifyCertificatepermission is needed for this operation.

* Path: `/certificate/chain`

* Method: `POST`

* Body: "multipart/form-data" with two parts:

  * "`password`" part, which contains a keystore password (string)

  * "`data`" part, which contains binary stream of P12/PFX file

* Returns: 200 and list of `CertificateInfo `structure which contains

  * `alias`

  * `serial`

  * `subject`

  * `issuer`

  * `notBefore`

  * `notAfter`

  * `body `(public part of the certificate)

* Errors: 400

    curl -X POST -k -i -H X-Api-Key:$API_KEY -F data="@chain.p12" -F password=changeit https://:7300/api/v1/certificate/chain

### Get a CA certificate

A ViewCertificatepermission is needed for this operation.

* Path: `/certificate/ca`

* Method: `GET`

* Optional query parameters (you can combine them):

  * `subject `(could be a substring)

  * `serial `(bigint)

  * `alias `(string)

  * `issuer `(string)

  * `expiresin `(int - number of days)

* Returns: 200 and list of `CertificateInfo `structure which contains

  * `alias`

  * `serial`

  * `subject`

  * `issuer`

  * `notBefore`

  * `notAfter`

  * `body `(public part of the certificate)

* Errors: 400

    curl -k -i -H X-Api-Key:$API_KEY https://:7300/api/v1/certificate/ca?serial=828286999265050717

### Get private certificate chain

A ViewCertificatepermission is needed for this operation.

* Path: `/certificate/chain`

* Method: `GET`

* Optional query parameters (you can combine them):

  * `subject `(could be a substring)

  * `serial `(bigint)

  * `alias `(string)

  * `issuer `(string)

  * `expiresin `(int - number of days)

* Returns: 200 and list of `CertificateInfo `structure which contains

  * `alias`

  * `serial`

  * `subject`

  * `issuer`

  * `notBefore`

  * `notAfter`

  * `body `(public part of the certificate)

* Errors: 400

    curl -k -i -H X-Api-Key:$API_KEY https://:7300/api/v1/certificate/chain?subject=CA

### Delete a CA certificate

A DeleteCertificatepermission is needed for this operation.

* Path: `/certificate/ca/<alias>`

* Method: `DELETE`

* Mandatory path parameter:

  * `alias`

* Returns: 200

* Error codes: 1130, 1134

    curl -X DELETE -k -i -H X-Api-Key:$API_KEY https://:7300/api/v1/certificate/ca/imported-aeba53f2-78cf-4fad-b134-d61c5e940cdc

### Delete private certificate chain

A DeleteCertificatepermission is needed for this operation.

* Path: `/certificate/chain/<alias>`

* Method: `DELETE`

* Mandatory path parameter:

  * `alias`

* Returns: 200

* Error codes: 1131, 1135

    curl -X DELETE -k -i -H X-Api-Key:$API_KEY https://:7300/api/v1/certificate/chain/7c9c05e5-2622-4c9d-9f76-2c11a6d24846

### Get root authorities

This endpoint returns root authorities only for self-signed certificates that were created using the "Create..." (Private certificate chains) button. Custom (external) chains that were imported will be ignored. The signing certificates are also ignored.

* Path: `/certificate/root`

* Method: `GET`

* Returns: 200 and list of `CertificateInfo `structure which contains

  * `alias`

  * `serial`

  * `subject`

  * `issuer`

  * `notBefore`

  * `notAfter`

  * `body `(public part of the certificate encoded as base64 DER)

    curl -k -i -H X-Api-Key:$API_KEY https://:7300/api/v1/certificate/root

## Audit logs

### Get audit logs

A ViewLogpermission is needed for this operation.

* Path: `/logs/auditlogs`

* Method: `GET`

* Parameters:

  * `datefrom: datetime` ISO-8601 instant formatted start point for Audit logs range. Example: 2025-12-05T16:38:10.972Z

  * `dateto: datetime` ISO-8601 instant formatted endpoint for Audit logs range. Example: 2026-01-05T10:25:12.834Z

  * \[optional\] `maxRecords: int` The number of records to be retrieved. If not provided, 1000 is the default value. Value must be between 1 and 10000, inclusive.

  * \[optional\] `filter: string` Audit logs text filter. For more details see Audit logs documentation.

* Returns: `List<AuditLogInfo>`

* Error Codes: 403, 400

    curl -X GET -i -k -H "Content-Type: application/json" -H "X-Api-Key: API_KEY_VALUE" "https://:7300/api/v1/logs/auditlogs?datefrom=2025-06-25T06%3A15%3A00.000Z&dateto=2026-01-10T08%3A30%3A00.000Z&maxrecords=5000&filter=api"

## Endpoints

### Get endpoint by Id

A ViewEndpoint permission is needed for this operation.

* Path: `/endpoints/<endpointId>`

* Method: `GET`

* Method path parameter:

  * `endpointId`

* Returns: `EndpointInfo`

* Error: 403, 400

    curl -X GET -i -H "X-Api-Key: API_KEY_VALUE" -H "Content-Type: application/json" "https://serveraddress:7300/api/v1/endpoints/ENDPOINT_ID"

### Get all endpoints

A ViewEndpoint permission is needed for this operation.

* Path: `/endpoints`

* Method: `GET`

* Method query parameters:

  * `withVersion` - if set to `true`, returns only endpoints with associated version number, such as gateways and PC clients in local storage mode.

  * \[optional\] `maxrecords: int` Maximum number of records on the single response page. The default value is 50, maximum is 2000.

  * \[optional\] `pagetoken: string` If the number or records for your query exceeds `maxrecords` value, the endpoint responds with exactly `maxrecords`

    and non-empty `nextPageToken` field. Use value of `nextPageToken` as a `pagetoken` parameter to get the next page.

* Returns: `PagedResult` with the following fields:

  * `nextPageToken` - non-empty if there are more items available than returned

  * `recordsOnPage` - number of records returned for the page

  * `items` - list of `EndpointInfo` objects

* Error: 403, 400

    curl -X GET -i -H "X-Api-Key: API_KEY_VALUE" -H "Content-Type: application/json" "https://serveraddress:7300/api/v1/endpoints?withVersion=true"

## Balance

### Get balance configuration

A ViewUserBalance permission is needed for this operation.

* Path: `/balance/config`

* Method: `GET`

* Returns: `BalanceConfigInfo` (the per-account enable switch and the price list)

* Errors: 403, 405

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/config"

### Update balance configuration

A ModifyBalancePricing permission is needed for this operation.

* Path: `/balance/config`

* Method: `PUT`

* Body (JSON): `BalanceConfigData` --- all fields required, prices must be zero or greater

* Returns: the updated `BalanceConfigInfo`

* Errors: 400, 403, 405

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/config" --data "{\"enabled\":true, \"bwNormalPage\":1, \"bwLargePage\":2, \"colorNormalPage\":3, \"colorLargePage\":6}"

### Get user balance

A ViewUserBalance permission is needed for this operation.

* Path: `/balance`

* Method: `GET`

* Parameters:

  * `username: string` Name of the user

  * `providerid: int` Identifier of the authentication provider where the user belongs.

* Returns: `UserBalanceInfo` (users without a balance record report zero balances)

* Errors: 403, 404, 405

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance?username=<username>&providerid=<providerId>"

### Get user balance transactions

A ViewUserBalance permission is needed for this operation.

* Path: `/balance/transactions`

* Method: `GET`

* Parameters:

  * `username: string` Name of the user

  * `providerid: int` Identifier of the authentication provider where the user belongs.

  * \[optional\] `maxrecords: int` Maximum number of transactions per page, between 1 and 1000. Default 50.

  * \[optional\] `pagetoken: string` Token of the page to fetch, taken from `nextPageToken` of the previous page.

  * \[optional\] `datefrom: string` Only include transactions at or after this timestamp (ISO-8601 with offset, e.g. `2026-07-01T00:00:00Z`).

  * \[optional\] `dateto: string` Only include transactions at or before this timestamp (ISO-8601 with offset).

* Returns: `PagedResult<BalanceTransactionInfo>`, most recent transactions first

* Errors: 400, 403, 404, 405

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/transactions?username=<username>&providerid=<providerId>&maxrecords=50"

### Create balance transaction (add / remove / set)

A ModifyUserBalance permission is needed for this operation.

* Path: `/balance/transactions`

* Method: `POST`

* Body (JSON): `BalanceTransactionData` --- `add` adds the amount to the selected balance; `remove` subtracts it (the balance never goes below zero, an uncovered removal fails with 400); `set` sets the quota balance to the given target value unconditionally (wallet is not supported for `set`) and is independent of the policy-driven scheduled resets

* Returns: the created `BalanceTransactionInfo`, including the balances after the operation

* Errors: 400, 403, 404, 405

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/transactions" --data "{\"userName\":\"<username>\", \"providerId\":1, \"operation\":\"add\", \"balanceType\":\"quota\", \"amount\":10}"

### Check user balance for a document

* Path: `/balance/check`

* Method: `POST`

* Body (JSON): `BalanceCheckData`

* Returns: `BalanceCheckInfo`

* Errors: 403

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/check" --data "{\"uuid\":\"<documentUuid>\", \"userName\":\"<username>\", \"providerId\":1, \"totalPages\":10, \"colorPages\":2, \"paperSize\":\"A4\", \"copies\":1}"

### Get balance policies

A ViewUserBalance permission is needed for this operation.

* Path: `/balance/policies`

* Method: `GET`

* Returns: `list<BalancePolicyInfo>` ordered by priority with the default policy pinned last. When no default policy has been persisted yet, a virtual default (`id = 0`, type `free`) is included. Each policy carries its reset `schedule` when one exists.

* Errors: 403, 405

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies"

### Get balance policy

A ViewUserBalance permission is needed for this operation.

* Path: `/balance/policies/<policyId>`

* Method: `GET`

* Returns: `BalancePolicyInfo`

* Errors: 403, 404, 405

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies/<policyId>"

### Get default balance policy

A ViewUserBalance permission is needed for this operation.

* Path: `/balance/policies/default`

* Method: `GET`

* Returns: `BalancePolicyInfo` (the virtual default when not persisted yet)

* Errors: 403, 405

    curl -X GET -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies/default"

### Create balance policy

A ModifyUserBalance permission is needed for this operation.

* Path: `/balance/policies`

* Method: `POST`

* Body (JSON): `BalancePolicyData` --- the priority is assigned automatically (after all existing non-default policies). An enabled `schedule` block creates the policy's reset schedule as well.

* Returns: the created `BalancePolicyInfo`

* Errors: 400, 403, 405

    curl -X POST -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies" --data "{\"policyName\":\"Policy\", \"balanceType\":\"quota\", \"initialBalance\":100, \"groupIds\":[1,2]}"

### Update balance policy

A ModifyUserBalance permission is needed for this operation.

* Path: `/balance/policies/<policyId>`

* Method: `PUT`

* Body (JSON): `BalancePolicyData` --- priority is preserved; when the target is the default policy, `groupIds` must be empty (400 otherwise). The `schedule` block: absent = leave the reset schedule unchanged, `enabled = false` = remove it, `enabled = true` = create or replace it.

* Returns: the updated `BalancePolicyInfo`

* Errors: 400, 403, 404, 405

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies/<policyId>" --data "{\"policyName\":\"Policy\", \"balanceType\":\"quota\", \"initialBalance\":100, \"groupIds\":[1,2]}"

### Update default balance policy

A ModifyUserBalance permission is needed for this operation.

* Path: `/balance/policies/default`

* Method: `PUT`

* Body (JSON): `BalancePolicyData` --- `groupIds` must be empty (the default applies to all users). The first update persists the virtual default. The `schedule` block behaves as in "Update balance policy".

* Returns: the updated `BalancePolicyInfo`

* Errors: 400, 403, 405

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies/default" --data "{\"policyName\":\"Default\", \"balanceType\":\"free\", \"initialBalance\":0, \"groupIds\":[]}"

### Delete balance policy

A ModifyUserBalance permission is needed for this operation.

The default balance policy cannot be deleted.

* Path: `/balance/policies/<policyId>`

* Method: `DELETE`

* Returns: 204 No Content

* Errors: 400 (default policy), 403, 404, 405

    curl -X DELETE -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies/<policyId>"

### Reorder balance policies

A ModifyUserBalance permission is needed for this operation.

* Path: `/balance/policies/order`

* Method: `PUT`

* Body (JSON): `BalancePolicyOrderData` --- must contain exactly all non-default policy ids; priorities are reassigned 1..n in list order (lower number = higher precedence)

* Returns: `list<BalancePolicyInfo>` in the new order

* Errors: 400, 403, 405

    curl -X PUT -i -H "X-Api-Key: " -k "https://:7300/api/v1/balance/policies/order" --data "{\"orderedPolicyIds\":[3,1,2]}"

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Authorization code flow

**Relevant Products**

*Authorization code flow* is available in BREEZE MFD PRO MFD  
This feature is supported on primary servers only.

The authorization code flow is a method by which an OAuth client obtains access and refresh tokens. The access token allows access to resources based on the user's permissions, while the refresh token enables an application to maintain a valid session without requiring user action. This implementation utilizes the default API key.

The implementation adheres to the specifications outlined in [The OAuth 2.1 Authorization Framework](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-09). The well-known configuration is, by default, available on port 7400. The path is `/oauth/v1/.well-known/openid-configuration`.

Error responses from the OAuth 2.1 specification are expanded with the **x_error_code** field, which includes an implementation-specific error code:

    {
        "error": "error_code",
        "error_description": "textual error description"
        "x_error_code": "more detailed error_code, specific to this OAuth implementation"
     }

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Data structures

**Relevant Products**

*Data structures* is available in BREEZE MFD PRO MFD

## ServerVersionInfo

    version: string
    buildDate: string
    buildTimeStamp: long

### ErrorCodeInfo

    errorCode: integer

    current codes:
        0    OK
        1000 not implemented
        1001 output document error
        1002 delete document error
        1003 create user error
        1004 delete user error
        1005 enroll card error
        1006 account not found
        1007 object tree error
        1008 create account error
        1009 create output port error
        1010 create trigger error
        1011 delete trigger error
        1012 run automation error
        1013 update user error
        1014 register server error
        1015 create input port error
        1016 delete input port error
        1017 delete output port error
        1030 delete authentication provider error
        1031 save authentication provider error
        1032 no services for authentication provider error
        1040 save access control error
        1041 delete access control error
        1042 output not ready error
        1043 create group error
        1044 delete group error
        1050 license count exceeded
        1051 license expired
        1052 license group not found
        1060 import users error
        1070 create terminal configuration error
        1080 delete account error
        1090 update account error
        10000 unknown error

### ErrorCodeInfoId

    errorCode: integer
    id: integer

    current codes: same as for ErrorCodeInfo

### UserInfo

    id: int
    providerId: int
    accountId: int
    userName: string
    fullName: string
    email: string
    department: string
    shortId: string
    cards: list of strings
    createdDate: string                         // in ISO-8601 format
    token: TokenInfo                            // optional, may be null
    isExpired: boolean                          // optional, may be null, this field is filled only for users belonging to authentication providers of type Client.
    groupIds: list of int

### TokenInfo

    access_token: string
    refresh_token: string
    expires_in: int

### DocumentInfo

    uuid: string
    documentName: string
    documentType: int
    userName: string
    totalPages: int
    colorPages: int
    duplex: int
    copies: int
    grayscale: boolean
    paperSize: string
    dateTime: long
    storageOnline: boolean
    secure: boolean
    tags: list of TagInfo
    collate: boolean
    status: int (0 => READY,1 => PRINTED, 2 => DELETED, 3 => EXPIRED, 4 => FAILED, 5 => RECEIVED, 6 => AWAITING_CONVERSION, 7 => CONVERTING, 8 => CONVERSION_FAILED, 9 => STORED)
    outputPortId: int
    outputPortName: string
    jobType: string (PRINT, COPY, SCAN, FAX)

### Document Status Flowchart

![DocumentStatusFlowchart.svg](https://docs.ysoft.cloud/__attachments/a_9eb3c18212b444ba5411c13c463d469d0a2c931d77adb268c6ea1347a82d1326/DocumentStatusFlowchart.svg?cb=b0bd5ec6424b4fe5c75eadec22ac91c6)

### OutputPortInfo

    id: int
    name: string
    address: string
    portType: int
    vendor: string
    logoutTimeout: int
    autoRelease: boolean
    embedded: boolean
    monochrome: boolean
    trimCardId: boolean
    description: string
    embeddedConfigurationId: int
    printProtocol: int
    modelFamily: int
    outputType: int
    services: {
       string: [int, int, ...],
       ...
    }
    deviceSerial: string
    properties: {
       string: string,
       ...
    }
    containerName: string,
    accountId: int,
    parentAccountOrContainerId: int,
    decimalFormatForCardIds: boolean,
    isReverseFinisher: boolean,
    printerIppUrl: string,
    ipReaderAddress: string,
    softwareCopyCollation: boolean,
    sendUsername: boolean,
    registrationSource: string, // "manual", "autodiscovery" 
    terminalInfo: {
       deployStatus (optional, may be null): {
          stage: int (0 => NOT_INSTALLED, 1 => INSTALLED, 2 => INSTALLING, 3 => UNINSTALLING, 4 => CONFIGURING, 5 => CONFIGURED, 6 => FAILED, 7 => CLOUD_UNKNOWN, 8 => CLOUD_CONFIGURED),
          message: string,
          lastDate: string
       },
       terminalStatus (optional, may be null): {
          terminalVersion: string,
          installationSource: int (0 => UNKNOWN, 1 => MANUAL, 2 => KM_MARKETPLACE, 3 => RICOH_APPLICATION_SITE, 4 => HP_COMMAND_CENTER),
          cardReaderData: string,
          modelName: string,
          additionalModelInfo: string,
          firmwareVersion: string,
          status: int (0 => UNKNOWN, 1 => OK, 2 => WARNING, 3 => ERROR),
          statusMessage: string,
          errorData: string,
          modifiedDate: string
       }
    }
    active: boolean,
    groupNo: string (requires ViewLicense permission or will be "")

### InputPortInfo

    id: int
    name: string
    portType: int
    outputPort: string (optional, may be null)
    locationId: int (optional, may be null)
    containerName: string (optional, may be null)

### AccountInfo

    id: int
    name: string
    accountType: int (1=vendor, 2=customer, 3=container)
    domainNames: list of strings
    uuid: string
    timezone: string (optional, may be null)

### ContainerInfo

    id: int
    name: string
    domainNames: list of strings
    timezone: string (optional, may be null)

### LocationInfo

    id: int
    name: string
    sortOrder: int
    identifiers: list of LocationIdentifierSearch

### LocationIdentifierSearch

    locationType: LocationType (GATEWAY_IP, SUBNET, IP_RANGE, WIFI_SSID)
    searchValue: string

### GroupInfo

    id: int
    groupName: string
    groupDN: string

### TerminalConfig

    "services": {
      "scanToMe": {
        "serviceId": "SCANTOMAIL",
        "enabled": boolean,
        "instanceIndex": 1,
        "smtp": {
          "server": string,
          "port": int,
          "security": {
            "mode": string, ("none", "tls", "start_tls")
            "disableCertificateCheck": boolean
          },
          "user": string,
          "password": string,
          "senderEmail": string,
          "disableUserAuthentication": boolean
        }
      },
      "print": {
        "serviceId": "PRINT",
        "enabled": boolean,
        "instanceIndex": 1
      },
      "printShortcut": {
        "serviceId": "SHPMCPRINT",
        "enabled": boolean
      },
      "sho365Shortcut": {
        "serviceId": "SHO365",
        "enabled": boolean,
        "tenant": {
          "tenantId": string,
          "clientId": string
        }
      },
      "copyShortcut": {
        "serviceId": "STANDARDCOPY",
        "enabled": boolean
      },
      "standardScanShortcut": {
        "serviceId": "STANDARDSCAN",
        "enabled": boolean
      },
      "standardFaxShortcut": {
        "serviceId": "STANDARDFAX",
        "enabled": boolean
      }
    },
    "authentication-way": {
      "oneTimePasswordEnrollment": boolean,
      "cardOnlyAuthentication": boolean,
      "shortIdAuthentication": boolean,
      "developerLogEnabled": boolean
    }

### ScanConnectorInfo

    "id": int,
    "name": string,                                         // max length 100
    "description": string,                                  // optional, max length 300
    "connectorType": string,                                // EMAIL, ONEDRIVE_BUSINESS_OAUTH2, SHAREPOINT_ONLINE_OAUTH2, GOOGLE_DRIVE_OAUTH2 (only in preview), GENERIC_HTTPS (currently hidden by default), SCAN_TO_DOWNLOAD
    "smtpConnectorParameters": {                            // optional, used only if connectorType is EMAIL
       "messagingConfigId": int                             // optional, System default messaging config used when not provided
    },
    "sharePointConnectorParameters": {                      // optional, used only if connectorType is SHAREPOINT_ONLINE_OAUTH2  
      "siteName": string                                    // optional, will be empty if not specified
    },
    "genericHttpsConnectorParameters": {                    // optional, used only if connectorType is GENERIC_HTTPS
      "endpointUrl": string,                                // required, has to be valid HTTPS URL
        "properties": {                                     // optional, additional properties (key-value pairs) to be passed with the request (for example for custom authentication)
          "auth_username": string,                          // the key has to be an unique string
          "auth_password": string
        }
    },
    "scanToDownloadConnectorParameters": {                  // optional, used only if connectorType is SCAN_TO_DOWNLOAD
      "notificationEnabled": boolean,                       // optional, false by default
      "messagingConfigId": int,                             // required if notificationEnabled is true
      "templateConfigId": int                               // required if notificationEnabled is true
    },
    "retryAttemptsCount": int,                              // optional, default 0, range 0-99999
    "retryAttemptsTimeout": int,                            // optional, number of seconds, default 3, range 0-120
    "deliveryRestrictions": {                               // optional, may be null
      "enabled": boolean,                                   // optional, default false
      "maxScanJobSize": int                                 // required if enabled is 'true', otherwise not used, maximum scan job size in megabytes, range 1-999999
    }

### ScanWorkflowTemplateInfo

    "id": int,
    "name": string,                                         // max length 100
    "description": string,                                  // optional, max length 300
    "connectorId": int,
    "scanOptions": {                                        // optional, may be null
      "resolution": string,                                 // optional, LOW, NORMAL, FINE, HIGH, HIGHEST
      "colorMode": string,                                  // optional, AUTO, BLACK_AND_WHITE, FULL_COLOR, ONE_COLOR, TWO_COLOR, GRAY_SCALE
      "pageSides": string,                                  // optional, SIMPLEX, DUPLEX
      "mergingOriginals": string,                           // optional, DISABLED, ENABLED
      "resolutionEditableByUser": boolean,                  // optional, default false
      "colorModeEditableByUser": boolean,                   // optional, default false
      "pageSidesEditableByUser": boolean,                   // optional, default false
      "mergingOriginalsEditableByUser": boolean             // optional, default false
    },
    "ocrOptions": OcrProcessingStep,                        // optional, may be null
    "barcodeOptions": BarcodeOptions,                       // optional, may be null
    "documentSeparationOptions": DocumentSeparationOptions  // optional, may be null
    "highlightRedactionOptions": HighlightRedactionOptions  // optional, may be null
    "smtpConnector": {                                      // optional, used only if connectorType is EMAIL
      "mailTo": string,
      "mailSubject": string,
      "mailBody": string,
    },
    "sharePointConnector": {                                // optional, used only if connectorType is SHAREPOINT_ONLINE_OAUTH2
      "rootPath": string,
      "relativeTargetPath": string,
      "overwriteBehavior": string,                          // KEEP_BOTH, REPLACE_ORIGINAL, APPEND_TO_PDF, PREPEND_TO_PDF
      "columns": list<SharePointColumnsData>,
    },
    "oneDriveConnector": {                                  // optional, used only if connectorType is ONEDRIVE_BUSINESS_OAUTH2
      "relativeTargetPath": string,
      "overwriteBehavior": string,                          // KEEP_BOTH, REPLACE_ORIGINAL, APPEND_TO_PDF, PREPEND_TO_PDF
    },
    "googleDriveConnector": {                               // optional, used only if connectorType is GOOGLE_DRIVE_OAUTH2 
      "relativeTargetPath": string,
      "overwriteBehavior": string,                          // KEEP_BOTH, REPLACE_ORIGINAL, APPEND_TO_PDF, PREPEND_TO_PDF
    },
     "fileName": string,                                    // optional, may be null
    "fileType": string,                                     // PDF, TIFF, JPEG
    "sortOrder": string,                                    // optional, default is last (e.g. 3 if this is 3rd workflow created)
    "active": boolean,                                      // optional, default true
    "userInputs": list<UserInputInfo>,                     	// optional, may be null,
    "fileTypeEditableByUser": boolean                       // optional, default false, when OcrProcessingStep is enabled this is always false

### ScanWorkflowAccessInfo

    "id": int,
    "workflowId": int,		    // optional, id of ScanWorkflowTemplateInfo
    "workflowName": string,		// optional, name of ScanWorkflowTemplateInfo
    "identityId": int,		    // optional
    "identityName": string		// optional
    "identityType": String, 	// optional, User or Group
    "allowAccess": boolean		// optional, default true

### DocumentSeparationOptions

    enabled": boolean,                  // Note: In a PUT request, if this field is set to false, the entire existing DocumentSeparationOptions is removed
    "separationType": string,           // BARCODE_TYPE, SEPARATION_SHEET, PAGE_COUNT
    "separationBarcodeType": string,    // only used when separationType is BARCODE_TYPE, values: UPC_A, UPC_E, EAN_8, EAN_13, CODE_39, CODE_93, CODE_128, CODABAR, ITF, RSS_14, RSS_EXPANDED, ALL_1D, AZTEC, DATA_MATRIX, MAXICODE, PDF_417, QR_CODE
    "dropSeparator": boolean,           // only used when separationType is BARCODE_TYPE or SEPARATION_SHEET, optional, may be null, BARCODE_TYPE default value false, SEPARATION_SHEET default value true
    "pageSplitSize": string             // only used when separationType is PAGE_COUNT, variable or a positive whole number

### OcrProcessingStep

    "enabled": boolean,					// Note: In a PUT request, if this field is set to false, the entire existing OcrProcessingStep is removed
    "blankPages": boolean,
    "dualPages": boolean,
    "pageOrientation": boolean,
    "despeckle": boolean,
    "languages": list<string>,
    "outputFormatParameters": {
      "pdfaCompliance": string,			// PDF_A_1A, PDF_A_1B, PDF_A_2A, PDF_A_2U, PDF_A_3A, PDF_A_3U
      "modifyMetadata": boolean,
      "metaTitle": string,
      "metaAuthor": string,
      "metaSubject": string,
      "metaKeywords": string,
      "metaOverwriteUponChange": boolean,
      "mrcCompression": boolean,
      "encryptPdf": boolean,
      "encryptionStrength": string,		// RC40BIT, RC128BIT, AES128BIT
      "encryptionPasswordType": string,	// GeneratePassword, ManualPassword
      "encryptionPassword": string,		// only used when encryptionPasswordType is ManualPassword
      "sendEmail": boolean,
      "emailRecipients": string,
      "emailSubject": string,
      "emailBody": string
    }

### BarcodeOptions

    "enabled": boolean,			// Note: In a PUT request, if this field is set to false, the entire existing BarcodeOptions is removed                
    "barcodeType": string,		// UPC_A, UPC_E, EAN_8, EAN_13, CODE_39, CODE_93, CODE_128, CODABAR, ITF, RSS_14, RSS_EXPANDED, ALL_1D, AZTEC, DATA_MATRIX, MAXICODE, PDF_417, QR_CODE

### HighlightRedactionOptions

    "enabled": boolean,			// Note: In a PUT request, if this field is set to false, the entire existing HighlightRedactionOptions is removed
    "highlightColor": string,   // GREEN, RED
    "redactionType": string,    // WHOLE_DOCUMENT, RANGE
    "rangeFrom": string,        // optional, may be null. Only used in RANGE redaction type
    "rangeTo": string,          // optional, may be null. Only used in RANGE redaction type

### SharePointColumnsData

    string: string                       // first string is column name, second is column value

### UserInputInfo

    name: string,
    label: string,                        
    defaultValue: string,                 // optional, may be null
    required: boolean,                    // optional, may be null
    userInputType: string,                // LIST BROWSE TEXT NUMBER EMAIL
    values: List<ListUserInputValueInfo>  // optional, may be null. Only used for LIST type

### ListUserInputValueInfo

    value: string
    label: string

### AuditLogInfo

    category: string
    type: string,
    eventContext: {
        serverId: string
        traceId: string
        source: string
        requestDateTime: string,       // in ISO-8601 format
        request: {
          AuthenticatedRequest: {
            executingUser: {
              user: {                  // optional, may be null
                  name: string,
                  id: int,
                  accountId: int,
                  providerId: int
              }
            }
          }
        },
        sourceSocket: {                // optional, may be null
          address: string,
          port: int
        },
        destinationSocket: {          // optional, may be null
          address: string,
          port: int
        },
       requestingDomain: string,      // optional, may be null
       auditLogCustomOpName: string,  // optional, may be null
       accountAccessReason: {         // optional, may be null
         issue: string,
         reason: string
       },
       accountId: int
    },
    timestamp: string                  // in ISO-8601 format
    id: int                            // optional, may be null
    intent: object,                    // optional, may be null
    intentResult: object,              // optional, may be null
    result: object,                    // optional, may be null
    customOp: object,                  // optional, may be null
    updatedType: string                // optional, may be null
    objectType: string,                // optional, may be null
    entityType: string,                // optional, may be null
    oldEntity: object,                 // optional, may be null
    toAddEntity: object,               // optional, may be null
    previousEntity: object,            // optional, may be null
    toDeleteEntity: object,            // optional, may be null
    updatedChildren: object,           // optional, may be null
    access: object,                    // optional, may be null
    addedAccess: object,               // optional, may be null
    removedAccess: object,             // optional, may be null
    parent: object                     // optional, may be null
    error: object                      // optional, may be null

### EndpointInfo

    "endpointId": string,
    "description": string,
    "endpointType": string,    //Server, Printer, PC Client, Browser extension, Mobile device
    "authorized": boolean

### BalanceConfigInfo

    accountId: int                              // the account this configuration belongs to
    enabled: boolean                            // per-account balance/quota enable switch
    bwNormalPage: decimal
    bwLargePage: decimal
    colorNormalPage: decimal
    colorLargePage: decimal

### BalanceConfigData

    enabled: boolean                            // required
    bwNormalPage: decimal                       // required, zero or greater
    bwLargePage: decimal                        // required, zero or greater
    colorNormalPage: decimal                    // required, zero or greater
    colorLargePage: decimal                     // required, zero or greater

### BalanceCheckData

    uuid: string                                // UUID of the document to check
    userName: string
    providerId: int
    totalPages: int
    colorPages: int
    paperSize: string
    copies: int

### BalanceCheckInfo

    balanceEnabled: boolean                     // whether balance/quota is enabled for the account
    sufficientBalance: boolean                  // whether the current balance covers the calculated cost
    currentBalance: decimal
    calculatedCost: decimal                     // cost computed for the document from the price list

### UserBalanceInfo

    userName: string
    providerId: int
    quotaBalance: decimal
    walletBalance: decimal
    totalBalance: decimal
    lastUpdated: Option<string>                 // in ISO-8601 format

### BalanceTransactionInfo

    id: int
    userId: int                                 // the user the transaction belongs to
    userName: string
    providerId: int
    accountId: int
    quotaAmount: decimal                        // negative for deductions/withdrawals
    walletAmount: decimal
    transactionType: string                     // TOP_UP, DEDUCTION, ADJUSTMENT, RESERVATION, RESERVATION_RELEASE, INITIAL, WITHDRAW, RENEW
    quotaBalanceAfter: Option<decimal>
    walletBalanceAfter: Option<decimal>
    documentUuid: Option<string>
    description: string
    adminUserId: Option<int>
    timestamp: Option<string>                   // in ISO-8601 format

### BalanceTransactionData

    userName: string
    providerId: int
    operation: string                           // "add", "remove" or "set"
    balanceType: string                         // "quota" or "wallet"; "set" supports only "quota"
    amount: decimal                             // add/remove: positive amount; set: target value (zero or greater)
    description: string                         // optional, default ""

### PagedResult\<T\>

    items: list<T>
    recordsOnPage: int
    nextPageToken: Option<string>               // absent on the last page

### BalancePolicyInfo

    id: int                                     // 0 for the virtual (not yet persisted) default policy
    accountId: int                              // the account this policy belongs to
    policyName: string
    balanceType: string                         // free, quota, wallet, quota_wallet
    priority: int                               // 0 = default policy; lower number = higher precedence
    isDefault: boolean
    initialBalance: decimal
    groupIds: list<int>                         // always empty for the default policy
    schedule: Option<BalancePolicyScheduleInfo> // present when the policy has a reset schedule
    lastUpdated: Option<string>                 // in ISO-8601 format

### BalancePolicyScheduleInfo

    enabled: boolean                            // whether the schedule is active
    frequency: string                           // weekly, monthly, quarterly, yearly
    scheduledTime: string                       // first run, ISO-8601 offset date-time normalized to UTC
    targetAmount: decimal                       // amount the policy's users are reset to on each run

### BalancePolicyData

    policyName: string                          // required, max 256 characters
    balanceType: string                         // required: free, quota, wallet, quota_wallet
    initialBalance: decimal                     // optional, default 0, must be zero or greater
    groupIds: list<int>                         // optional, default empty; must belong to the account
    schedule: BalancePolicyScheduleData         // optional; absent = leave the reset schedule unchanged

### BalancePolicyScheduleData

    enabled: boolean                            // optional, default true; false removes the schedule
    frequency: string                           // weekly, monthly, quarterly, yearly; required when enabled
    scheduledTime: string                       // first run, ISO-8601 offset date-time; required when enabled
    targetAmount: decimal                       // optional, default 0, must be zero or greater

### BalancePolicyOrderData

    orderedPolicyIds: list<int>                 // exactly all non-default policy ids in the desired order

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# OAuth error codes

**Relevant Products**

*OAuth error codes* are available in BREEZE MFD PRO MFD

The following implementation-specific error codes are currently defined. They are part of the error_description.

* not_implemented -- request not implemented

* access_denied -- access denied

* missing_signature -- missing request signature header

* invalid_signature -- invalid request signature

* invalid_parameters -- invalid parameters

* invalid_client_secret -- wrong API key

* token_refresh_error -- error occurred while refreshing a token

* token_create_error -- error occurred while creating a token

* invalid_device_code -- invalid or expired device code

* invalid_client_id -- invalid client id

* authorization_pending -- authorization pending, keep polling

* invalid_response_type -- invalid response type parameter

* invalid_key_type -- invalid key type parameter

* invalid_endpoint -- client not found in the database

* endpoint_not_authorized_for_device_token_refresh -- endpoint is not authorized for the token refresh operation

* invalid_client_for_signature_verification -- cannot verify signature for client

* invalid_grant -- the given grant type is not supported

* duplicate_client_id -- the device is attempting to register using a client_id that is already associated with another device. Please contact the administrator.

* error_saving_endpoint -- there was en error when saving the endpoint

* token_create_error -- error occurred while issuing a token

* authorization_pending -- authorization pending

* expired_device_code -- the provided device code has expired

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Obtain device token

**Relevant Products**

*Obtain device token* is available in BREEZE MFD PRO MFD

Use this endpoint to acquire a device token. Endpoint is available at `/token` relative path.

Parameters:

* `client_id`: unique client ID

* `client_secret`: API key

* `grant_type`: device_code

* `device_code`: the device code acquired via registration call

Return value:

The `Error` object if error occurred, otherwise `Token` JSON object which has the following structure:

    {
        "token_type": "Bearer",
        "expires_in": NNN,
        "access_token": "xxx",
        "refresh_token": "yyy"
    }

* token_type -- Always "Bearer".

* expires_in -- Access token expiration time in seconds.

* access_token -- An access token that you must provide in the call to the public API login function.

* refresh_token -- The token used to refresh the device token.

If `authorization_pending` error is returned, the client should keep polling the endpoint until the token is acquired or some other error is returned.

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Refresh device or user token

**Relevant Products**

*Refresh device or user token* is available in BREEZE MFD PRO MFD

Use this endpoint to refresh device token or user token acquired from the public API /login call. Endpoint is available at `/token` relative path.

Parameters:

* `client_id`: unique client ID. Use "api" value for user token acquired from the public API

* `client_secret`: API key

* `grant_type`: refresh_token

* `refresh_token`: the refresh token

Return value:

The `Error` object if error occurred, otherwise `Token` JSON object with the following structure:

    {
        "token_type": "Bearer",
        "expires_in": NNN,
        "access_token": "xxx",
        "refresh_token": "yyy"
    }

* token_type -- Always "Bearer".

* expires_in -- Access token expiration time in seconds.

* access_token -- A device access token.

* refresh_token -- The new refresh token.

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Register device

**Relevant Products**

*Register device* is available in BREEZE MFD PRO MFD

Register device function is used to perform initial device registration which must be then approved by the administrator, or to perform device re-registration using the known public key.

It is available at `/register` endpoint.

Required parameters:

* `client_id`: unique device ID

* `client_secret`: SAFEQ Cloud API key

* `client_type`: one of: printer,chrome_extension,desktop_client,mobile_device,server

* `response_type`: must be device_code

Optional parameters:

* `client_description`: client description

* `state`: a nonce value

* `public_key`: base64-encoded public key

* `key_type`: public key type, one of: rsa,x509,ed25519

`public_key` and `key_type `parameters, combined with `HCP-Request-Signature` header provide a means how a known, authorized device may automatically re-register itself automatically and securely, even after extended periods of time.

This functionality is optional, but if desired, then both parameters must be filled in.  
Public keys must be wrapped into base64 encoding.  
Public keys must be encoded in accordance with X.509 encoding standard. The difference between `rsa` and `x509` is that the provided

`x509` structure contains also certificate fields in addition to the public key, so a certificate can be passed as a public key.  
ED25519 key can be provided in both X.509 encoding and in plain encoding (32-byte key).

If `HCP-Request-Signature` header is present in the request the device re-registration is assumed and registration approval is not required (provided that the signature is correct). If signature header is missing a new device registration is performed.

Return value: `Error` object if error occurred, `DeviceCode` object if registration succeeded.

`DeviceCode` is a JSON object with the following structure:

    {
        "device_code": "xxx",
        "state": "xxx",
        "expires_in": nnn
    }

Where device_code is a device code which must be used when calling the `/token` endpoint, state is the nonce passed as a parameter, expires_in indicates the device_code expiration time in seconds.  
After registration call is made the client should poll the `/token` endpoint to exchange the obtained device_code for the device token.

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Request example

**Relevant Products**

*Request example* is available in BREEZE MFD PRO MFD

The following examples are using `curl` command to send OAuth requests to SAFEQ Cloud server.  
Public and private keys shown here should not be used in production and are only provided as an example.

We will use a pair of random ED25519 keys:

Private key: `pP20r1Hmqf5NTO8Rd7Truipu5f8aR+Em47cTvWleTc8dRS2cJ20bXH2iJIjg4O28gSYj+qnuUWSey7WWlWTxPw==`

Public key: `HUUtnCdtG1x9oiSI4ODtvIEmI/qp7lFknsu1lpVk8T8=`

The following web site can be used to generate test keys or signatures: [https://ed25519.herokuapp.com](https://cyphr.me/ed25519_tool/ed.html)

## Register a device

All parameters must be url-encoded, in particular the public key.

    curl https://accountdomain:7400/oauth/v1/register -k -i -X POST -d "client_id=0966a26c-a5fc-4276-9c6b-587d02aceb91" -d "client_secret=mykey" -d "client_type=printer" -d "public_key=HUUtnCdtG1x9oiSI4ODtvIEmI%2Fqp7lFknsu1lpVk8T8%3D" -d "key_type=ed25519" -d "response_type=device_code"

Response:

`{"device_code":"wVgzOcLwemGJPfY_d01E3PA8H3k","expires_in":259200}`

## Create request signature

Generate a signature using any tool or online site above.

Query string: `client_id=0966a26c-a5fc-4276-9c6b-587d02aceb91&client_secret=mykey&grant_type=device_code&device_code=wVgzOcLwemGJPfY_d01E3PA8H3k`

Signature: `MKS1dCmgp4rLbZ2oaQeFb9pultWjI0zU7si5lb3oLCJWH8t8jgps4LLz/isPSa5OWfQAtFB3NAu04axirmF9CA==`

## Obtain device token

    curl https://accountdomain:7400/oauth/v1/token -k -i -X POST -H "hcp-request-signature:MKS1dCmgp4rLbZ2oaQeFb9pultWjI0zU7si5lb3oLCJWH8t8jgps4LLz/isPSa5OWfQAtFB3NAu04axirmF9CA==" -d "client_id=0966a26c-a5fc-4276-9c6b-587d02aceb91" -d "client_secret=mykey" -d "grant_type=device_code" -d "device_code=wVgzOcLwemGJPfY_d01E3PA8H3k"

Response:

`{"error":"authorization_pending","error_description":"Authorization pending"}`

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Trusted device registration

**Relevant Products**

*Trusted device registration* is available in BREEZE MFD PRO MFD

Trusted devices are SAFEQ Cloud clients which are required to be authorized by SAFEQ Cloud administrator before they can perform certain API calls. The API key setting `Allow untrusted endpoints` controls whether client using this API key is required to be in a trust relationship with SAFEQ Cloud server. If this option is disabled (which is the default) the client must obtain a device token before calling authentication functions of the public API.

This device token must be then provided to the `/login` API call as `Authorization: Bearer <token>` header.

Trusted connection ensures for example that password-less authentication (card ID or short ID) can only be used from the trusted devices.

Trusted devices functions are available at `/oauth/v1` base endpoint on HTTPS port **7400 (** gateway) or**443 (** cloud server). All requests must be sent as HTTP POST with parameters encoded as **application/x-www-form-urlencoded** . All responses are JSON objects. In case of an error the `Error` JSON object is returned which has the following structure:

    {
        "error": "error_code",
        "error_description": "textual error description"
    }

Some functions may use the **HCP-Request-Signature** header which holds a signature of the parameter string.

For POST requests, that is the signature of the request body.

Signature algorithm depends on the `key_type` parameter provided to the `/register` call. Signature must be wrapped into base64 encoding.

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# User and device tokens

**Relevant Products**

*User and device tokens* are available in BREEZE MFD PRO MFD

SAFEQ Cloud server allows a fine-grained control over the public API access on user level or device (client) level. For that purpose there is a concept of user token and device token:

* **User token**: this is a token acquired after calling a login function of the public API. It should be provided to all other functions

* **Device token**: this is a token acquired after calling the SAFEQ Cloud OAuth service and establishing a trust relation between the client and the server. Device token should be provided when calling a login function of the public API.

Access tokens have a short expiration time (typically one hour). They can be renewed using a refresh token (which is returned as a part of TokenInfo structure) to maintain a login state longer than 1 hour. Refresh tokens are usually valid for 3 months, after that the user must re-authenticate (or device re-registered).

Token validity times can be configured in the account settings in SAFEQ Cloud server administration UI.

API key has two parameters which control the security of the public API endpoints:

* `Allow unauthenticated requests`: allows to call API functions without the user token or to authenticate with insecure credentials (card ID, short ID, user name only, email address). If this option is disabled (default) the client is required to call the `/login` endpoint first and provide the returned access token to all other API requests as a `Authorization: Bearer <user_token>` HTTP header. Failure to provide a token will result in error 403 for all requests.

<!-- -->

* `Allow untrusted endpoints`: if enabled this option allows to authenticate from any client without obtaining a trusted device token first. If disabled (default) the client is required to be in a trusted relation with SAFEQ Cloud server and provide a device token when calling the `/login` endpoint, in a form of `Authorization: Bearer <device_token>` header.

---
version: "2026.09.17"
variant: "SAFEQ Cloud"
language: "en"
---
# Version History

The following contains a list of notable changes in YSoft SAFEQ Cloud API

Legend:

+ Added feature

x Improved/changed feature

- Bug fixed

## Build 2025.03.20

x /api/v1/inputports and /api/v1/outputports now by default does not return extended port info, new boolean flag enrichPorts was introduced to specify if additional information should be included (default: false)

### Build 2025.02.06

No changes from the previous release.

### Build 2025.01.23

No changes from the previous release.

### Build 2025.01.09

No changes from the previous release.

### Build 2024.11.28

No changes from the previous release.

### Build 2024.11.14

+ new API available to list of all users (only local and those actually using the solution) /api/v1/users/all

### Build 2024.10.31

No changes from the previous release.

### Build 2024.10.17

No changes from the previous release.

### Build 2024.10.03

No changes from the previous release.

### Build 3.49 \[2024-09-19\]

+ Account API was extended with new fields for page size, language, and color. The update option now contains the name and domain name. API responses were improved.

x Print queues created by API are now enabled by default.

### Build 3.48 \[2024-08-22\]

No changes from the previous release.

### Build 3.47 \[2024-07-25\]

- Uploading a print job to a non-existing input port via API no longer returns 200 instead of an error.

### Build 3.46 \[2024-06-27\]

- The API no longer allows deletion of the Local authentication provider.

### Build 3.45 \[2024-06-11\]

- If the request does not contain the "Content-Type: form-data" header, the response status is no longer 500.

### Build 3.44 \[2024-05-09\]

No changes from the previous release.

### Build 3.43 \[2024-04-04\]

x Administrators can now create multiple values per API Access Key, thus streamlining the administration.

x GetAccount API now includes Account UUID.

### Build 3.42 \[2024-03-07\]

No changes from the previous release.

### Build 3.41 \[2024-02-08\]

+ Added a get user by username endpoint.

+ Page orientation now respects the request specified in the API request.

### Build 3.40 \[2024-01-11\]

- The Document history endpoint now returns the jobtype property.

- The use of full API access keys is now discouraged in order to enhance security.

- Whenever the API returns a 403 error due to missing permissions, it also returns the list of the missing permissions.

### Build 3.39 \[2023-11-02\]

No changes from the previous release.

### Build 3.38 \[2023-10-05\]

x Added the ability to manage access rights.

x Improved security of document history API by adding role-based access.

x Increased security by only displaying API keys once when generated. The ability to view existing API keys is removed.

### Build 3.37 \[2023-09-07\]

x Updated backend API key security.

x Added AUD (audience) claim to API access tokens for improved security.

- Adding authentication providers using API (/authproviders) now works correctly.

### Build 3.36 \[2023-08-10\]

x Added public API for Scan Workflows. (The Scan Workflow feature is currently hidden by default and may not be available for your account.)

### Build 3.35 \[2023-07-13\]

No changes from the previous release.

### Build 3.34 \[2023-06-26\]

No changes from the previous release.

### Build 3.33 \[2023-05-18\]

x Added printer information to Documents History API.

- Fixed issue with Access Control List (ACL) inheritance properties when updating ACL via API.

### Build 3.32 \[2023-04-25\]

+ {ShortProductName} API endpoint date/time matches the actual job release date/time.

- Documents/history API endpoint is filtering for the "PRINTED" status.

### Build 3.31 \[2023-03-31\]

+ Customer can get information on users' group membership via Public API.

### Build 3.30 \[2023-02-24\]

- In document history, documents are recorded under the correct device when the jobs are sent with the "serialnumber" parameter.

### Build 3.29 \[2023-02-03\]

+ Added public API for pulling the embedded terminal configuration.

+ Added public API endpoint to record print/copy/scan jobs.

### Build 3.28 \[2022-12-15\]

x Device code workflow requests changed from GET to POST.

x Device code workflow: the public/private keys are optional now.

### Build 3.19 \[2022-02-03\]

+ Add admin functions to create/delete/update locations in the LocationsRequest endpoint

+ Extend InputPortsRequest endpoint and add an additional optional locationId parameter to the creation function

+ Add optional description field to the output port creation in OutputPortsRequest

+ Extend OutputPortInfo with the following fields: description, embedded config, protocol, model family, output type, serviceId, serial number

### Build 3.16 \[2021-10-13\]

+ Added Documents History API

---
language: "en"
---
# SAFEQ Cloud Knowledge Base

**Welcome to the SAFEQ Cloud Knowledge Base! 🎉**

Whether you're just getting started or looking to master advanced features, you're in the right place. Our knowledge base is organized to help you find exactly what you need, when you need it.

**⚙️ Setup \& Configuration** - Get your system customized and running exactly how you want it

**🛠️ How To Guides** - Step-by-step instructions for everything from basic printing to advanced workflows

**❓ FAQs** - Quick answers to the most common questions about SAFEQ Cloud

**📚 End User Guides** - Complete guides to help you make the most of your printing experience

Ready to become a SAFEQ Cloud expert?

Pick a section and let's get started! 🚀

---
language: "en"
---
# Accessing Copy Features for Konica Minolta

**Relevant Products**

BREEZE MFP PRO MFP

## Quick Copy (No Settings)

1. From **My Quick Actions** , tap **Quick Copy**

2. Place your document on the scanner

3. The copy will be made with default settings

### Copy with Custom Settings

1. From **My Quick Actions** , tap **Copy**

2. Place your document on the scanner

3. **Adjust basic settings**:

   * **Color Mode**: Choose Auto (detects color automatically), Color, or Black \& White

     * *Auto mode automatically detects original colors and accounts for copied pages accordingly*

   * **Sides**: Select single-sided or double-sided copying

   * **Number of Copies**: Enter desired quantity

4. **Access advanced settings** (optional):

   * Tap the **Advanced Settings** tab for more options:

     * **Paper Tray**: Choose which paper tray to use

     * **Paper Size**: Select specific paper size

     * **Density**: Adjust lightness/darkness

     * **Original → Output**: Set input/output format

     * **Combine**: Combine multiple pages

     * **Stapling**: Configure staple mode, position, and angle

     * **Zoom**: Resize documents (see Zoom section below)

     * **Hole Punch**: Set hole punch mode and position

   * *Note: Only settings supported by your specific device will be displayed*

5. Tap **Copy** to start copying

### ID Card Copy (If Available)

If your administrator has enabled this feature:

* Tap **ID Copy** from Quick Actions

* This special function copies both sides of an ID or IC card onto one sheet of paper

### Understanding Zoom Features

The **Zoom** function automatically resizes documents based on available paper sizes:

**How Zoom Works**:

* **Auto Paper Tray**: Zoom options match all available paper sizes in the device (A3, A4, B5, etc.)

* **Specific Paper Tray**: Zoom limited to that tray's paper size

* **Manual Tray**: Zoom behavior depends on your paper size selection

**Zoom Examples**:

* A4 original → A3 zoom = Document enlarged to A3 size

* A3 original → B6 zoom = Document scaled down to B6 size

* Auto settings = Document scaled to fit manually loaded paper

**Important Zoom Notes**:

* Zoom and Combine functions **cannot be used together**

* Auto-rotation feature must be enabled on your device

* Supported sizes: A0-A6, B0-B6, Letter, Legal, Executive, Ledger

---
language: "en"
---
# Adding a New Printer to Your System 🖨️➕

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

Got new, or additional printers that needs to join the solution? Let's get it connected so everyone can start using it right away!

## Why Add Printers to the System? 🤔

✅ **Central management** - Control all your printers from one place

✅ **User access** - Let your team find and use the new printer instantly

✅ **Print tracking** - Monitor usage and print activity

✅ **Location awareness** - Users automatically see relevant printers

## Quick Setup 🚀

Adding a new printer takes less than 2 minutes:

### Step 1: Navigate to Printers

1. Go to **Printers** in your admin panel

2. Click the **Add** button ➕

### Step 2: Enter Printer Details

Fill in these essential details:

📝 **Printer Name**

Give it a friendly name your users will recognize

💡 *Example: "Reception Color Printer" or "3rd Floor HP"*

🌐 **IP Address**

Enter the printer's network address

💡 *Usually found on the printer's display menu or network settings*

🏭 **Vendor**

Choose your printer brand from the dropdown

### Step 3: Save and You're Done!

Click **Save** ✅ and your new printer is ready to go!

## What Happens Next? 🎉

Once saved, your printer will:

* 📍 Appear in the system for admin management

* 👥 Become available to users (based on location settings, and the PC Client synchronisation)

* 📊 Start tracking print jobs and activity

* ⚙️ Be ready for advanced configuration if needed

## Quick Tips 💡

🔍 **Can't find the IP address?** Check the printer's network settings menu or print a network configuration page

📍 **Want location-specific access?** Don't forget to set the printer's location in the print queue settings

Check out this demo to guide you through this process.

---
language: "en"
---
# Adding new users to SAFEQ Cloud Breeze

**Relevant Products**

BREEZE PRINT BREEZE MFP

## The Magic of Auto-Setup ✨

Good news! Setting up Breeze accounts for users is easier than you think.

When a user installs the PC Client for the first time, we'll automatically create the user account in SAFEQ Cloud Breeze. No forms to fill out, no waiting for approval - just install, login, and you're ready to go!

## How It Works 🔄

Here's the simple process for users to follow:

### Step 1: Get Your Download Link 📥

* Your administrator will send you a special download link

* This link is personalized for your organization

* Click it to download the PC Client installer

### Step 2: Install the PC Client 💻

> ⚠️ **Important:** You'll need local administrator rights on your computer to install the PC Client. If you don't have admin rights, contact your IT team for help with the installation.

* Run the installer you just downloaded

* Follow the setup wizard (it's pretty straightforward!)

* The PC Client will install on your computer

### Step 3: Log In and Get Created! 🎉

* Once installed the PC Client runs automatically

* **Here's where the magic happens:** Breeze automatically detects this is your first login and creates your user account behind the scenes

* You're now all set up and ready to print!

## What Gets Created? 👤

When you log in for the first time, Breeze automatically sets up:

* ✅ Your user profile

* ✅ Connection to your organization's SAFEQ Cloud Breeze environment

## Need Help? 🆘

**Can't Install?**

* Check if you have local admin rights on your computer

* Contact your IT team if you need help with permissions

**Login Issues?**

* Make sure you're using the correct credentials

* Verify you downloaded from the link provided by your administrator

**Account Not Created?**

* Try logging out and back in

* Contact your administrator if the issue persists

## For Administrators 👨‍💼👩‍💼

Want to get your users set up? Simply:

1. Copy the download link from your admin panel.

   You'll find it at the top of the admin portal

   ![image-20250828-100502.png](https://docs.ysoft.cloud/__attachments/a_30af7603d67aa5b89160e3fb4ec605bcca94ec28d579a337037e5f73128c5976/image-20250828-100502.png?cb=2607e41e52eeb3bd6775067ef768145a)
2. Share it with your users

3. Ensure they have the local admin rights to install

4. Sit back and watch as accounts get created automatically when they log in!

---
language: "en"
---
# At the MFP - Scan to Email

## Quick Scan to Email 📧⚡

### Your One-Touch Digital Magic!

Got a document that needs to become an email attachment faster than you can say "paperless office"? The Quick Scan to Email button is your new best friend! It's like having a personal assistant who specializes in turning paper into perfectly formatted digital files and sending them wherever they need to go.

*** ** * ** ***

### How It Works (The Magic Explained) ✨

The Quick Scan to Email feature is designed for maximum convenience:

* **One-touch operation** - no complicated menus to navigate

* **Instant scanning** - place your document and go!

* **Direct email delivery** - straight to your inbox (or wherever you want it)

* **Pre-configured settings** - your admin has already set up the perfect scan settings

Think of it as the "easy button" for document digitization! 🔴

*** ** * ** ***

### Using Quick Scan to Email 🚀

#### Step 1: Get Ready

1. **Log into the MFD** using your card, PIN, or credentials

2. **Look for the Quick Scan to Email button** on your My Quick Actions screen

   * *It should be right there waiting for you - no hunting required!*

#### Step 2: Load Your Document

3. **Place your document** in the document feeder or on the scanner glass

   * *Face down on the glass, face up in the feeder (just like always)*

#### Step 3: The Magic Moment

4. **Tap the Quick Scan to Email button**

   * *That's it! The workflow starts immediately - no additional settings needed*

*** ** * ** ***

### During the Scanning Process 📄

#### What You'll See:

* **"Scanning workflow in progress"** screen appears

* **Real-time status** as your document gets processed

* **Options to continue** if you have multiple pages

#### For Multiple Pages:

* **From the glass**: You'll get a "continue or finish" prompt after each page

* **When done**: Tap "Finish" to complete the scan

#### If Paper Size Isn't Recognized:

* The system will ask you to **select the paper size manually**

* **Tap "OK"** to continue, or **"Cancel scanning"** if something went wrong

*** ** * ** ***

### Pro Tips for Scanning Success 💡

#### Before You Scan:

* **Check document orientation** - face down on glass, face up in feeder

* **Remove staples and clips** - your scanner will thank you

* **Straighten curled papers** - flat documents scan better

#### During Scanning:

* **Don't move the document** once scanning starts

* **Wait for the "continue or finish" prompt** before adding more pages

* **Use the document feeder for multi-page documents** - it's faster!

*** ** * ** ***

### When Things Don't Go According to Plan 🤔

#### "I Don't See the Quick Scan Button!"

* **Check your permissions** - you might not have scan rights assigned

* **Look for other scan options** - it might be called something slightly different

* **Contact your admin** - they can check your workflow assignments

#### "The Scanner Jammed!"

* **Don't panic** - you'll see a "Scanning error" screen

* **Remove the jammed paper** carefully

* **Choose your next move**:

  * **"Continue scanning"** to pick up where you left off

  * **"Cancel scanning"** to start over

#### "My Email Never Arrived!"

* **Check your spam folder** - sometimes it ends up there

* **Verify the email address** was correct

* **Wait a few minutes** - large files can take time to process

* **Check with your admin** if emails consistently don't arrive

*** ** * ** ***

### The Bottom Line 🎯

Quick Scan to Email is designed to be exactly what it sounds like - quick! Your administrator has pre-configured all the technical settings, so all you need to worry about is placing your document and telling it where to go.

It's the digital equivalent of having a super-efficient postal service that never loses mail, works 24/7, and delivers instantly.

Just tap, scan, and watch your paper documents transform into perfectly formatted digital files that land exactly where they need to be! 📧✨

---
language: "en"
---
# At the MFP - Scan to OneDrive

## Scan to OneDrive ☁️📄

### Your Personal Cloud Filing Cabinet!

Ready to send your paper documents straight to your OneDrive without touching your computer? The Scan to OneDrive feature is like having a direct pipeline from the scanner to your personal cloud storage! It's perfect for when you want to organize documents in specific folders or just need them safely stored in your Microsoft cloud account.

Unlike instant workflows, this one gives you control - pick your destination folder, choose your scan quality, and decide how you want those pages formatted. It's digital filing made simple!

*** ** * ** ***

### How It Works (The Magic Explained) ✨

The Scan to OneDrive feature puts you in the driver's seat:

* **Browse your OneDrive folders** and choose exactly where documents go

* **Customize scan settings** like color and duplex options

* **Direct cloud storage** - no computer required as a middleman

* **Organized filing** - put documents exactly where they belong

Think of it as your personal librarian who not only scans your documents but also files them in exactly the right spot! 📚

*** ** * ** ***

### Using Scan to OneDrive 🚀

#### Step 1: Get Started

1. **Log into the MFD** using your card, PIN, or credentials

2. **Look for the Scan to OneDrive button** on your My Quick Actions screen

#### Step 2: Load Your Document

3. **Place your document** in the document feeder or on the scanner glass

   * *Face down on the glass, face up in the feeder (the classic scanner dance)*

#### Step 3: Choose Your Destination

4. **Tap the Scan to OneDrive button**

5. **Browse your OneDrive folders** to pick the perfect spot

   * Navigate through your folder structure

   * Choose exactly where this document should live

   * *It's like window shopping, but for file organization!*

#### Step 4: Customize Your Scan Settings

6. **Configure your scan preferences**:

   * **Color Options**:

     * **Color**: For documents with important color information

     * **Black \& White**: Perfect for text documents (and smaller file sizes)

     * **Auto**: Let the scanner decide what looks best

   * **Duplex Options**:

     * **Simplex**: Single-sided scanning (one side only)

     * **Duplex**: Double-sided scanning (both sides of the paper)

#### Step 5: Scan Away!

7. **Tap "Scan"** and watch your document journey to the cloud! ☁️

*** ** * ** ***

### During the Scanning Process 📄

#### What You'll See:

* **"Scanning workflow in progress"** screen appears

* **Real-time status** as your document gets processed and uploaded

#### For Multiple Pages:

* **From the glass**: You'll get a "continue or finish" prompt after each page

* **When done**: Tap "Finish" to complete the scan and send to OneDrive

#### File Organization Magic:

* Your document appears in the **exact folder you selected**

* **Automatic file naming** (usually includes date/time)

* **Ready to access** from any device with your OneDrive account

*** ** * ** ***

### Pro Tips for OneDrive Scanning Success 💡

#### Folder Strategy:

* **Pre-organize your OneDrive** - create folders before you need them

* **Use descriptive folder names** - "2024 Receipts" beats "Stuff"

* **Think about access** - will you need this on your phone later?

#### Scan Settings Wisdom:

* **Color for important docs**: Contracts, forms with colored sections

* **Black \& white for text**: Reports, letters, invoices (smaller files too!)

* **Duplex for double-sided originals**: Don't lose the back side information

* **Simplex for single sheets**: Faster scanning when you only need one side

#### Before You Scan:

* **Check document orientation** - face down on glass, face up in feeder

* **Remove staples and clips** - your scanner (and OneDrive) will thank you

* **Straighten pages** - wonky scans look unprofessional in your cloud storage

*** ** * ** ***

### Customization Options Explained 🎨

#### Color Settings:

* **Color**: Full color scanning - great for brochures, photos, color-coded documents

* **Black \& White**: High contrast, smaller files - perfect for text-heavy documents

* **Auto**: Smart detection - the scanner analyzes and picks the best option

#### Duplex (Two-Sided) Options:

* **Simplex**: Scans one side only - ideal for single-sided documents

* **Duplex**: Scans both sides - essential for double-sided contracts, reports, etc.

* *Pro tip: Always check if your original is double-sided before choosing!*

*** ** * ** ***

### When Things Don't Go According to Plan 🤔

#### "I Can't See My OneDrive Folders!"

* **Check your OneDrive connection** - you might need to authorize the connector

* **Contact your admin** if OneDrive integration seems broken

#### "The Scanner Jammed!"

* **Stay calm** - you'll see a "Scanning error" screen

* **Remove the jammed paper** carefully (don't force it!)

* **Choose your next move**:

  * **"Continue scanning"** to pick up where you left off

  * **"Cancel scanning"** to start over

#### "I Picked the Wrong Folder!"

* **Don't worry** - you can always move the file later in OneDrive

* **Use OneDrive's web interface** or mobile app to reorganize

* **Next time**: Double-check your folder selection before scanning

#### "My Scan Quality Looks Terrible!"

* **Check your color setting** - black \& white might not be right for your document

* **Try cleaning the scanner glass** - smudges affect quality

* **Adjust duplex settings** - maybe you need both sides scanned

* **Contact support** if quality is consistently poor

#### "Files Aren't Appearing in OneDrive!"

* **Wait a few minutes** - uploads can take time, especially for large files

* **Check your OneDrive storage space** - full accounts can't accept new files

* **Verify your internet connection** - slow connections delay uploads

* **Look in the right folder** - double-check where you sent it

*** ** * ** ***

### The Bottom Line 🎯

Scan to OneDrive gives you the perfect balance of convenience and control. You get the magic of cloud storage with the flexibility to organize documents exactly how you want them. No more scanning to your computer first, then uploading to the cloud - it's a direct express route from paper to your personal digital filing cabinet!

Whether you're archiving important contracts in your "Legal Documents" folder, storing receipts in your "Expenses" collection, or just getting random paperwork safely backed up in the cloud, this feature makes it effortless.

Plus, once it's in OneDrive, you can access it from anywhere - your computer, phone, tablet, or any web browser. It's like having a scanner that follows you everywhere! ☁️📱💻

*** ** * ** ***

*Pro tip: Set up a good folder structure in OneDrive before you start scanning. Future you will be amazed at how organized and professional your digital life becomes! 🗂️✨*

---
language: "en"
---
# At the MFP - Authentication & Secure Release

**Relevant Products**

BREEZE MFP PRO MFP

## Getting Started

### Logging In

Your login method depends on your organization's setup. You may use:

* **Card**: Place your card on the card reader

* **PIN**: Enter your PIN number

* **Username/Password**: Enter your credentials

Follow the instructions shown on the login screen.

### Logging Out

* Tap the **logout button** in the top-right corner of the screen, OR

* If using card authentication, simply place your card on the reader again

*** ** * ** ***

## 📄 Printing Documents

### Quick Print All Jobs

1. After logging in, you'll see the **My Quick Actions** screen

2. Tap **Print All** to release all your pending print jobs at once

   * *Note: This button appears grayed out if you have no jobs waiting*

### Print Specific Jobs

1. From the **My Quick Actions** screen, tap **My Print Jobs**

2. Browse the list and **select the specific job(s)** you want to print

3. **Optional** : Customize your print settings by tapping the **gear icon** next to your selected job

   * Adjust **color settings** (color vs. black \& white)

   * Change **sides** (single-sided vs. double-sided)

   * Modify **number of copies**

   * *Note: Settings can only be modified for jobs sent through SAFEQ Cloud methods*

4. Tap **Print** to start printing

### Print Status \& Troubleshooting

* **Progress tracking**: After tapping Print, you'll see a status screen showing progress

* **Completion confirmation**: When finished, you'll see "Job sent for print"

* **New jobs** : If you sent additional jobs during your session, tap **Reload Jobs** to refresh the list

* **Unavailable jobs**: Jobs marked as "Unavailable" cannot be printed due to either:

  * Device limitations (printer can't handle the job type)

  * Insufficient user permissions

* **Error handling**: If jobs fail to print, you'll receive an error message with details

---
language: "en"
---
# Configuration of Entra ID for authentication

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

Let your team use their familiar Microsoft work accounts to access SAFEQ Cloud Breeze! No more remembering extra passwords - just use what they already know.

## Super Simple Setup 🚀

Getting this working takes just 2 minutes:

### Step 1: Add Microsoft as a Login Option

1. Go to **Users** → **Authentication Providers**

2. Click the **Add** button

3. Ensure **Microsoft Entra ID** is selected

### Step 2: Enter Your Company Domain

1. In the domain field, enter your company's domain 💡 **Example:** If your work email is `john@yourcompany.com`, just enter `yourcompany.com`

2. Click **Save** ✅

## That's It! Your Users Can Now Login 🎉

Your team will see a shiny new **"Log in Via Microsoft Entra ID"** button on the SAFEQ Cloud portal.  
![image-20250721-171959.png](https://docs.ysoft.cloud/__attachments/a_a7fa48287f01876ef891191a2287fc3498b83c1bd8d93bdaff35384d9150561f/image-20250721-171959.png?cb=3a69c771ff877686dc63318eda953f43)

## See this in action with the demonstration below.

**🔧 Want More Control?** For advanced setups, you can use a service account instead for additional configuration options. Keep reading the guides in this section!

---
language: "en"
---
# Creating a Customer Tenant via the Wizard

**Relevant Products**

BREEZE PRINT CLOUD ENABLED PRINT

Getting your customers up and running with SAFEQ Cloud is easier than ever!

Simply share the SAFEQ Cloud Wizard link with them, and they'll be guided through a smooth setup process that takes care of the following:

✨ Creating their tenancy

✨ Installing the PC Client

✨ Discovering printers on their network

✨ Setting up their administrator password

The link you share also decides **which product** the customer gets --- a **30-day Breeze trial** or a **Cloud Enabled Print** tenancy --- so they land in exactly the right setup.

Ready to walk through it together? Let's dive in!

**As a partner,** you can create a specific link for your customer so they can set up their own tenancy and get up and running.

Where you'll find the link depends on which products you offer:

* **Breeze only** --- you'll see a single **Invite customers to a 30-day Breeze trial** tile. Click **GET LINK** to generate the trial link.

* **Cloud Enabled Print only** --- you'll see a single **Invite customers to Cloud Enabled Print** tile. Click **GET LINK** to generate the link.

* **Both products** --- you'll see a combined **Invite customers** tile with two separate options: a **30-day Breeze trial** link and a **Cloud Enabled Print** link. Pick the one that matches what you're setting up for this customer, and click its **GET LINK**.

Each link already knows which product it's for, so your customer is guided into the right flow no matter where they start.  
![Snímek obrazovky 2026-07-03 v 10.56.09.png](https://docs.ysoft.cloud/__attachments/a_c8e53e3612879a8ea76a03d4a668ab2693b5215cfcf3b03953ec6a71022a8af4/Sni%CC%81mek%20obrazovky%202026-07-03%20v%C2%A010.56.09.png?cb=2fa47962e324d1a0a4b00a85420bdec5)

**As a customer,** you've been given your special link - think of it as your golden ticket to printing paradise! 🎫

You can follow the video below to see just how ridiculously quick and easy this whole process is, or if you're more of a "show me the details" person, scroll down for our step-by-step guide that breaks everything down!  
[https://player.vimeo.com/video/1115626206?badge=0\&amp;autopause=0\&amp;player_id=0\&amp;app_id=58479](https://player.vimeo.com/video/1115626206?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479)

You've clicked the link and you're presented with the following page:  
![image-20250826-091646.png](https://docs.ysoft.cloud/__attachments/a_c8fd4c02f3626b90d9f6558dd1deeeb992ac1fe4cbe8eb51f4260f07bd585177/image-20250826-091646.png?cb=c490abe0593410378102b1fdae5ec98f)

Click the GET STARTED button to start the wizard and create your new tenancy.

## Step 1: Getting the Basics

First up, your customer will need to share just a couple of key details to get things rolling:

🏢 **Account name** - This becomes their unique tenancy and gets built right into their custom URL

📧 **Email address** - For all the important notifications and updates  
![image-20250826-091847.png](https://docs.ysoft.cloud/__attachments/a_71e1955fac4e4c35bbe87e34a54f207e40023b0504e02f0e859ef539669287ef/image-20250826-091847.png?cb=9f85a79451d604b0ef955beed9fa4b01)

Before they can move forward, they'll also need to give a quick thumbs up to the terms of service and processing of personal data.

Once that's sorted, they're ready for the next step!

## Step 2: Installing the PC Client

Now for the fun part! Your customer gets a personalized download link that's already configured specifically for their brand new tenancy - no manual setup required!

💻 **Works on both Windows and Mac** - whatever they're running, we've got them covered

🔗 **One-click download** - the link is pre-configured to their tenancy, so it's plug-and-play  
![image-20250826-092006.png](https://docs.ysoft.cloud/__attachments/a_0c4b6439780d7a158e940a5f7bc457185a4533ddf25492dbbcb81aa00c2fd52c/image-20250826-092006.png?cb=7469e693724024b8b2f31406a7bf274a)

Once they've installed the PC Client, it automatically logs in and greets them with a welcome splash screen.  
![image-20250812-102238.png](https://docs.ysoft.cloud/__attachments/a_88f70368c353d531788f1d11c3f4bbce3b0ea85159addb4e9a76fe6971513ebf/image-20250812-102238.png?cb=0ca52ac7df571bd62b4b03fb604f3765)

Simply close that window, and they're back at the wizard! The clever bit? The wizard has automatically detected that the PC Client installed successfully, so now they can hit that Continue button and move on to the next step.  
![image-20250826-092106.png](https://docs.ysoft.cloud/__attachments/a_8b48a51be66a06e863f4d4c20c7fbf490384d415a0526fa40deb1ea2fec7fe12/image-20250826-092106.png?cb=1d57517fc1e7f1a1c398d74a92eae13c)

The PC client is all that is needed to be able to print, no drivers, no servers, just a simple app that synchronises to the cloud.

## Step 3: Almost There!

The wizard now discovers printers on the network, and your customer can select which ones they want to add right now. Don't worry if they don't catch them all - more printers can always be added manually later.  
![image-20250826-092141.png](https://docs.ysoft.cloud/__attachments/a_65c01a86974c523db5e8b0cf46c396a1d483deaf35d16b1a799beac3b3517b86/image-20250826-092141.png?cb=bd021f89967e3bc6f58391739be81250)

🖨️ **Select discovered printers** - pick the ones that are ready to go

➕ **Add more later** - no pressure to get everything perfect right away  
![image-20250826-092254.png](https://docs.ysoft.cloud/__attachments/a_9c8b22734088e920d162c7e54ecca178f1342ea3c4d389c11cb5eb006f8de61d/image-20250826-092254.png?cb=fd67123eb514a544d985acb61a19bd8d)

Once they've made their selections and clicked "Add Selected Printers," they can start inviting users to download the PC Client for their organization by clicking "Invite other users to print". A link is generated to share with users to download the PC Client.

The final step is to create an admin account. Click "Create Admin Account" button to be taken to the following page:  
![image-20250826-092352.png](https://docs.ysoft.cloud/__attachments/a_56a7f5c31f77c5c426daa16b7a546bced17e43d0c721714b5bded6caa4944a42/image-20250826-092352.png?cb=217ccf1e7a0f27858faa35bbc5d44f41)

The final touch? Creating an admin password. The system automatically uses the logged-on user's PC username as the admin username, so there's one less thing to worry about!

## Configuring sign-up defaults (partner)

On the partner's **General settings**, the sign-up settings tab lets you set defaults for new tenancies. Its name reflects the products you offer:

* Both products → **Customer sign-up settings**

* Cloud Enabled Print only → **Cloud Enabled Print sign-up**

* Breeze only → **Breeze trial settings**

The **Enable public sign-up link** option applies to **Breeze only** . When you offer both products it's labelled **Enable public sign-up link (Breeze only)** --- anyone using the public self-service link always creates a **30-day Breeze trial**, never a Cloud Enabled Print tenancy. Cloud Enabled Print tenancies are always created from an invite link you generate.

If you have any issues using the SAFEQ Cloud Wizard, please contact the partner who sent you the link to create your tenancy.

---
language: "en"
---
# End User Guides 📚

Whether you're printing your first document or trying to master advanced features, these guides are here to help you get the most out of your printing experience.

From printing, scanning and more, we've made everything as simple as possible so you can focus on what matters most - your work!

Let's get you printing like a pro in no time. 🚀

---
language: "en"
---
# FAQ's ❓

**Got questions? We've got answers! 🤔**

Our FAQ section covers the most common questions users ask about SAFEQ Cloud.

Whether you're wondering how something works, troubleshooting a quick issue, or just curious about a feature, you'll likely find what you're looking for right here.

---
language: "en"
---
# How are transactions associated with User Groups in Reports?

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

## **Summary**

Understanding how user group associations work ensures accurate reporting and access control. It also helps administrators align transactions with the defined user-groups in SAFEQ Cloud.

*** ** * ** ***

### **How It Works**

When a transaction occurs the system checks the user's identity provider - local or external - to retrieve their **current group memberships**.

Each transaction is then recorded against **all groups** the user belongs to at that exact moment.

For example:
> If a user belongs to both the *Finance* and *Operations* groups, the print transaction will be reflected in reports for **both groups**.

*** ** * ** ***

### **Key Takeaway**

Each transaction is linked to **all** of the user's active groups at the time of the action --- ensuring full visibility across all groups the member belongs to.

---
language: "en"
---
# How does the “INV” option work in Reports?

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

## **Summary**

The **"INV" option** helps users analyze what's *not selected* in their filters --- providing quick contrast and alternative views without rebuilding queries or filters.

*** ** * ** ***

### **How the "INV" Option Works**

The **INV (Inverse)** feature flips your current filter selection to show the unselected dataset.

Let's take a look at an example using the "Prints and copies timeline" report:
> If you select **2 out of 5 printers** on the timeline view, clicking **"INV"** switches the view to show data from the **3 unselected printers**.  
> ![image-20251016-121012.png](https://docs.ysoft.cloud/__attachments/a_9ac97146f8851d9027c6eae6c6c125771b5a0fe8747b9ce7184720ddcc9c1e59/image-20251016-121012.png?cb=236473d2b2126c7d4c6dbaa7e2a00c67)
> Here we have two printers selected.  
> ![image-20251016-121218.png](https://docs.ysoft.cloud/__attachments/a_ba32e6e3876130aeb691a60216768b6f92903f667b2df0f56076060f74cd83a2/image-20251016-121218.png?cb=bb27269ea2b573284cc0c47d099541ed)
> Selecting "INV" toggles the unselected three printers

This makes it easy to toggle perspectives --- whether you want to focus on specific printers, departments, user groups, or see what's excluded.

*** ** * ** ***

### **Key Takeaway**

Use **"INV"** to quickly switch between filtered and unfiltered reporting dimensions --- a faster way to analyze data without reselecting filters.

---
language: "en"
---
# How To: Authorize Scan Workflows for OneDrive for Business, SharePoint and Google Drive

**Relevant Products**

BREEZE MFP PRO MFP

## How to Connect destinations with SAFEQ Cloud

### What's This All About?

Want to scan documents straight to your OneDrive, SharePoint or Google Drive? Perfect! Setting this up with SAFEQ Cloud is a straightforward two-step process that'll have you scanning documents in no time.

### Before We Start

Make sure you have:

* A SAFEQ Cloud account

* The accounts for the destination of the scans

* An admin who's ready to help with Step 1

### The Setup Happens in Two Steps

#### Step 1: Admin Setup

*(This only happens once for the whole organization!)*

**For Admins:** Here's what you need to do:

🏢 **Access the Admin Panel**

Head to your SAFEQ Cloud admin panel and navigate to **Scanning** **/** **Workflows**. Look for the workflow you created earlier.

🔗 **Authorize the Connection**

Click the authorization link - this will take you to login page.

🔐 **Sign In**

Use your admin credentials. Make sure you have the right permissions (Global Admin or Application Admin works great in Microsoft).

✅ **Grant Permissions**

Review what SAFEQ Cloud wants to access and hit **Accept**. You're giving SAFEQ Cloud permission to work with your organization's storage space.

🎉 **All Done!**

You'll see a success message and get redirected back to SAFEQ Cloud. These destinations are now available for all your users!

Watch this simple flow below:  

#### Step 2: Individual User Setup

*(Each person needs to do this once for their personal account)*

**For Users:** Time to connect your personal storage:

🚪 **Log Into Your User Portal**

Sign in with your credentials to access your personal SAFEQ Cloud space.

🧭 **Find Your Profile Settings**

Navigate to **Personal** → **My Profile** → **Authorizations**

🔗 **Connect OneDrive**

Click the respective links, which will take you to Microsoft. Log in with your personal Microsoft 365 account.

🤝 **Complete the Link**

Grant the permissions, and your SAFEQ Cloud profile will connect with your accounts. You're all set!  

### What Happens Next?

Once both steps are complete, you can:

* Scan documents directly to your OneDrive, SharePoint or Google Drive

* Enjoy all your favorite SAFEQ Cloud features with Microsoft 365 or Google Workspace.

### Troubleshooting

**Admin Issues (Step 1):**

* **Access Denied?** Double-check you're using admin credentials

* **Timed Out?** Simply start over - it happens!

**User Issues (Step 2):**

* **Can't Find Authorizations?** Make sure you logged in with Entra ID or Google Workspace, and your admin has given you access to the respective scan workflows.

* **Link Won't Work?** Check that you have a valid license

### Security Notes

* Your admin grants SAFEQ Cloud permission to work with your organization's storage destinations

* Each user controls their own personal connection

* Everything follows Microsoft's / Google's security standards

**Remember:** Admins complete Step 1 once for everyone, then each user does Step 2 to connect their personal storage.

---
language: "en"
---
# How To: Create a Scan Connector

**Relevant Products**

BREEZE MFP PRO MFP

**Ready to Set Up Scanning? Let's Get Started! 🚀**

Time to bring your SAFEQ Cloud scanning to life! Think of scan connectors as the bridges that connect your users to their favorite destinations - whether that's their OneDrive, SharePoint email, or anywhere else they need their documents to land.

**Why Scan Connectors Matter** Before your users can enjoy the smooth scanning experience at their MFP (Multi-Function Printer), you'll need to set up these essential connectors first. Without them, there are no scan workflows for users to choose from!

**What You'll Learn** We're going to walk through creating two popular connectors that your users will love:

* **Microsoft OneDrive for Business**

* **Scan to Email (SMTP)**

Follow along with our step-by-step demonstration below, and you'll have your users scanning like pros in no time!

Let's dive in! 👇

---
language: "en"
---
# How To: Create Access control for scanning

**Relevant Products**

BREEZE MFP PRO MFP

**Time to Connect Users to Their Perfect Workflows! 🔗**

You've successfully created your scan connectors and built some workflows - there's one crucial step left before your users can start enjoying that seamless scanning experience.

It's time to assign access!

**Why Access Control Matters** Not every workflow is right for every user. Maybe your accounting team needs access to that specialized invoice scanning workflow, while the IT team just needs basic email scanning. Or perhaps you want to roll out a SharePoint workflow to power users first before sharing it company-wide.

**See It in Action - Two Real-World Scenarios! 🎯**

We've designed our demonstration to show you two common access patterns that you'll likely use in your own environment:

**📧 Email Workflow: Company-Wide Access** First, we'll show you how to give **all users** access to your email scanning workflow. This makes perfect sense - after all, everyone needs to scan and email documents from time to time!

**📁 OneDrive Workflow: Team-Specific Access** Then we'll get more targeted by assigning your OneDrive for Business workflow specifically to the **Sales team**. This is a great example of strategic rollout - maybe the Sales team handles lots of client documents that need organized storage, while other departments aren't quite ready for this advanced workflow yet.

These two scenarios will give you hands-on experience with both broad access (everyone) and targeted access (specific groups), so you'll be ready to handle any access scenario that comes your way.

Let's dive in and see how easy it is to connect the right people to the right workflows! 🚀  

**One Final Step for OneDrive, SharePoint and Google users! 🔗**

Before your Sales team can start enjoying their new OneDrive for Business, SharePoint and Google workflows, there's one crucial step they need to complete.

IT admins need to authorise the app first, and then each user will need to click the authorization link in the SAFEQ Cloud portal to connect their accounts. This is giving SAFEQ Cloud permission to deliver their scanned documents safely to their destination - without this authorization, the workflow won't appear as an option at the MFP.

Make sure to let your teams know that this quick authorization step is essential. It's a simple one-time setup that unlocks all that scanning goodness we just configured.

**You're All Set! 🎊**

Congratulations! You've just completed the full scanning setup journey - from creating connectors and workflows to assigning the perfect access for your users. Your team is now ready to enjoy a smooth, efficient scanning experience that's tailored exactly to their needs.

**Want to Become a Scanning Superstar?** What we've covered today is just the beginning of what SAFEQ Cloud scanning can do. There's a whole world of advanced features, customization options, available within SAFEQ Cloud.

**Dive Deeper with Our Complete Documentation** Head over to our main scanning documentation to explore:

* Advanced workflow customization options

* Scan to Google Drive, SharePoint and https endpoints.

* Additional OCR features such as redaction

Whether you're looking to fine-tune your current setup or explore cutting-edge scanning capabilities, our comprehensive documentation has everything you need to become a true scanning expert.

---
language: "en"
---
# How To: Create Scan Workflows

**Relevant Products**

BREEZE MFP PRO MFP

**Time to Build Your Scan Workflows! ✨**

Now that you've got your scan connectors set up, it's time to create the actual scan workflows that your users will see at their MFPs. Think of workflows as the user-friendly menu options that transform your behind-the-scenes connectors into real, clickable choices.

**What Makes Workflows Special?** While connectors are the foundation, workflows are where the magic happens for your end users. This is where you get to customize the scanning experience - deciding everything from whether documents scan simplex or duplex, to making them searchable, to choosing exactly where they land.

**Two Powerful Demos Coming Your Way!**

We've prepared two demonstrations that cover the most popular scanning scenarios.

**Ready to create workflows that'll make your users smile? Let's jump in! 🎯**

**🔧 Demo #1: Email Workflow with Smart Customization** We'll create a straightforward email workflow using standard settings, we'll show you exactly where to tweak key options like:

* **Simplex vs. Duplex scanning** (because sometimes you need both sides, sometimes you don't!)

**📁 Demo #2: OneDrive for Business - The Power User's Dream** This one's packed with advanced features your users will absolutely love:

* **Folder browsing** - Let users navigate and choose exactly where their documents go

* **OCR** - Transform scanned images into searchable, selectable text

* **Choosing a Document Format** - Making documents that work as hard as your users do

**Almost There! Time to Share the Scan Workflows! 🎉**

Congratulations! You've just built some amazing scan workflows that are ready to make your users' lives easier. But here's the thing - Your users can't see or use them yet!

**The Final Part -** Now you need decide who gets access to what. You get to choose exactly which users or groups can see and use each of your scan workflows.

**What's Next?** In our next guide, we'll walk you through the simple process of assigning your new scan workflows to the right people. Whether you're working with individual users or entire groups, we'll show you how to get everyone connected to exactly what they need.

**Ready to complete your scanning setup? Let's make sure everyone gets their perfect scanning experience! ➡️**

---
language: "en"
---
# How To: Enable Guest Printing

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

## What's Guest Print All About?

Guest Print is perfect for those times when visitors, contractors, or temporary users need to print without having a full user account. It's a simple way to give people printing access without all the setup hassle.

## Getting Started

Setting up Guest Print is refreshingly straightforward - just a couple of clicks and you're done!

## Step 1: Navigate to Self Registration

First, head over to your admin portal:

🧭 **Find the Right Spot**

Go to **Users** → **Self Registration**

## Step 2: Enable Guest Print

Here's where the magic happens:

🔄 **Turn on the Toggle**

Look for the Guest Print option and flip that toggle to enable it. Simple as that!

## Step 3: Bonus Feature - Email to Print

**Relevant Products**

BREEZE MFP PRO MFP

Once you've enabled Guest Print, you'll notice something new appears:

📧 **Email to Print Self Registration**

This handy option lets users register themselves for email-to-print functionality. If this sounds useful for your organization, go ahead and enable this too!

## What Happens Next?

With Guest Print enabled, visitors can now:

* Access printing without needing a full user account

* Print their documents quickly and easily

* Self-register for email-to-print (if you enabled that option)

Your guests get the printing access they need, and you maintain control over your print environment. Everyone wins!

---
language: "en"
---
# How To: Enable Windows Protected Print Mode (WPP)

## What is Windows Protected Print Mode? 🛡️

Windows Protected Print Mode is Microsoft's enhanced security feature that provides extra protection for your print jobs. It uses Windows' modern print stack with Internet Printing Protocol (IPP) and Microsoft's own IPP Class Print Driver, giving you enterprise-grade print security.

Think of it as putting your print jobs in a secure armored vehicle instead of a regular delivery truck! 🚚➡️🚛

## Why Should You Enable It? 🎯

**Enhanced Security Benefits:**

* 🔒 Leverages Windows' most secure printing technology

* 🛡️ Uses Microsoft's trusted IPP Class Print Driver

* 📋 Standardized printing protocol (IPP) for better security

* 🏢 Perfect for organizations with strict security requirements

## How to Enable WPP Mode ⚙️

### Step 1: Follow Microsoft's Guide 📚

The official setup process is handled through Microsoft's documentation. You'll typically enable this via Group Policy in your Windows environment.

**📖 For detailed technical steps:** [Windows Protected Print Mode Documentation](https://docs.ysoft.cloud/docs/windows-protected-print-mode)

### Step 2: Important Things to Know ⚠️

* **Existing print queues will be deleted** when you enable WPP mode

* This is **Windows-only**

* SAFEQ Cloud Client will automatically recreate all queues after enabling

### Step 3: SAFEQ Cloud Client Handles the Rest 🤖

Good news! Once WPP mode is enabled, you don't need to do anything special:

* SAFEQ Cloud Client automatically detects the change

* Print queues get recreated during the next synchronization

* Sync happens when the service starts, every hour, or manually via the tray menu

## Rolling Out to Your Organization 🏢

**Start Small and Test:**

1. **Pilot Group** - Enable WPP mode for a few test users first

2. **Check Compatibility** - Make sure your printers work with Microsoft's PDF output

3. **Gradual Rollout** - Expand to larger groups once you're confident

**Printer Compatibility Notes:**

* ✅ **Mopria certified printers** work great out of the box

* ⚠️ **Older printers** might need document conversion

* 📄 All printers must support PDF from Microsoft IPP Class driver

## What Print Features Are Supported? 🖨️

Here's what works with WPP mode compared to other printing methods:  

|   Finishing Option   | WPP | Universal Print Driver | IPP with vendor driver |
|----------------------|-----|------------------------|------------------------|
| **Color modes**      | ✅   | ✅                      | ✅                      |
| **Duplex modes**     | ✅   | ✅                      | ✅                      |
| **Number of copies** | ✅   | ✅                      | ✅                      |
| **Page sizes**       | ✅   | ✅                      | ?                      |
| **Page range**       | ✅   | ✅                      | ✅                      |
| **Input tray**       | ✅   | ✅                      | ?                      |
| **Output bin**       | ✅   | ✅                      | ?                      |
| **Stapling**         | ✅   | ✅                      | ?                      |
| **Punching**         | ✅   | ✅                      | ?                      |
| **Watermark**        | ❌   | ✅                      | ?                      |
| **Booklet**          | ❌   | ✅                      | ?                      |
| **Media type**       | ❌   | ✅                      | ?                      |

## Pro Tips for Success 💡

**Before You Enable:**

* Test with a small group first

* Verify your printers support Microsoft's PDF output

* Have a rollback plan if needed

**After Enabling:**

* Monitor the first few users for any issues

* Check that all expected finishing options work as needed

* Users might need to refresh their print queues

## Troubleshooting 🛠️

**Print queues disappeared?**

* This is normal! They'll be recreated automatically

**Printer not working?**

* Check if it supports PDF from Microsoft IPP Class driver

* Consider document conversion for older printers

**Missing finishing options?**

* Review the compatibility table above

* Some advanced features aren't available in WPP mode

## Need More Technical Details? 📖

For the full technical documentation, including detailed setup instructions and advanced configuration options, check out: [**Windows Protected Print Mode Technical Documentation**](https://docs.ysoft.cloud/docs/windows-protected-print-mode)

Note: ? The availability of these finishing options depends on the capabilities of each vendor driver. They are not recorded by our server, may not be editable on the terminal, and will only function with the vendor's printers.

*** ** * ** ***

**Ready to boost your print security?** Start with a test group and gradually roll out to your entire organization! 🚀

---
language: "en"
---
# How-To Guides 🛠️

**Ready to dive in? 🛠️**

Our How To guides walk you through everything step-by-step, from basic tasks like printing and scanning to more advanced features like setting up workflows and managing your preferences.

Each guide is designed to be clear, simple, and get you exactly where you want to go without any fuss.

Let's turn you into a SAFEQ Cloud expert! ⭐

---
language: "en"
---
# How to: Register a Card

**Relevant Products**

BREEZE MFP PRO MFP

Ready to turn your employee ID or access card into a magical printing key? Card registration is your ticket to walk-up-and-print convenience! Simply tap your card on any SAFEQ Cloud enabled MFD, follow the quick setup prompts, and voilà - your card is now your personal printing remote control. No more remembering usernames or passwords at the printer!

You can see the process in the video below!  
<https://vimeo.com/1113921557?share=copy>

---
language: "en"
---
# Installing Embedded Terminals

Welcome to the world of Embedded Terminals - the smart upgrade that transforms your regular MFPs into powerful cloud-connected devices!

These nifty terminals let users authenticate, release print jobs, and access SAFEQ Cloud features directly from the printer's touchscreen.

Ready to make your printers smarter? Choose the brand of your printer, and follow the video guide in each article!

---
language: "en"
---
# Mobile Printing with SAFEQ Cloud

**Relevant Products**

BREEZE MFP PRO MFP

## Your Pocket-Sized Print Shop is Here!

Who says you need to be chained to your desk to print? With the SAFEQ Cloud mobile app, your phone is now a portable print command center. It's like having a tiny office assistant living in your pocket---except this one never judges your questionable meme choices or asks for coffee breaks.

*** ** * ** ***

## Getting Started: Download \& Login 🚀

### Step 1: Get the App

**iOS Users** : Head to the App Store and search for "SAFEQ Cloud" or "YSoft SAFEQ"

**Android Users**: Same deal, but in the Google Play Store

*Pro tip: It's free, which is always the right price!*

### Step 2: Login Like a Pro

1. **First time?** You'll see a login screen (shocking, we know)

2. **Enter your User Domain** - either type it manually or be fancy and scan the QR code from your organization's SAFEQ web interface

3. **Tap "Sign In"** and enter your usual credentials

4. **Or go alternative** - if your company uses an identity provider (Microsoft, Google, etc.), tap the button on the log in page that pops up.

## The Fun Part: Actually Printing Stuff! 🎉

### Method 1: The "Share" Spectacular (Our Personal Favorite)

This works from literally ANY app that can share files. We're talking photos, PDFs, that important document you definitely didn't forget about until 5 minutes ago...

1. **Open whatever app** has your document (Photos, Files, Email, Safari, that random productivity app you downloaded but never use)

2. **Tap the Share button** (you know, that little box with an arrow jumping out of it)

3. **Find "SAFEQ Cloud"** in the share menu and tap it

4. **Customize your settings**:

   * **Print queue**: Pick your printer

   * **Copies**: How many do you actually need? (Be honest)

   * **Color**: Color or black \& white

   * **Paper size**: A4, Letter, or "I have no idea what size this should be"

   * **Orientation**: Portrait, landscape, or "let the printer figure it out"

   * **Sides**: Single or double-sided

5. **Tap "Send"** and watch the magic happen ✨

### Method 2: The "Direct Upload" Approach

For when you want to go straight to the source:

1. **Open the SAFEQ Cloud app**

2. **Tap the "+" button** at the bottom (it's begging to be pressed)

3. **Pick your files** from the system file picker

4. **Got password-protected files?** No problem---the app will ask for passwords and let you skip the ones you can't unlock

5. **Customize your print settings** (same options as above)

6. **Hit "Send"** and feel accomplished

## Supported File Formats (AKA "Will It Print?") 📄

### The VIP List (Direct Support):

* **PDF** - The golden child of document formats

* **Images**: JPEG, PNG, BMP, TIFF, WebP, SVG, rawImage

* Basically, if it's a picture or a PDF, you're golden!

### The "It's Complicated" Category:

* **Everything else**: Don't worry! Use the system print dialog in any app, then share the PDF output to SAFEQ Cloud

* **Special trick for iOS 16+**: Open the system print dialog, tap the share icon, then send to SAFEQ Cloud

* **For iOS 15 and below**: Open system print, pinch to zoom on the preview (yes, really), tap share from the PDF preview

### Pro Web Printing Tip 🌐:

Printing a webpage from Safari? Go to the share menu, tap "Options," and make sure "PDF" is selected. Then SAFEQ Cloud will magically appear in your share options!

## Cool Features You Didn't Know You Needed 🦄

### QR Code Printing (Because We Live in the Future)

1. Select multiple files in the app

2. Tap "Print with QR"

3. Walk to any SAFEQ printer

4. Scan the QR code if your IT administrators have produced them - if not ask them!

5. Watch your jobs print in the exact order you selected

6. Feel like a technology wizard 🧙‍♂️

### Job Management Made Easy

* **See all your jobs** in the app after logging in

* **Delete jobs** by swiping left (just like dismissing your responsibilities)

* **Check status** before walking to the printer like a champ

*** ** * ** ***

## Things to Remember (The Fine Print, But Fun) 📋

### The Reality Check:

* **PDF is king** - other formats get converted to A4 PDF pages (you can adjust the size later)

* **Page ranges reset** - the app defaults to printing all pages after upload

* **Scanning isn't supported** - this app is all about printing, baby!

* **Bulk operations are limited** - you can delete multiple jobs, but other bulk actions aren't supported

### The Good News:

* **Works with any SAFEQ printer** in your organization

* **No more "oops, wrong printer" moments** - pick up your jobs anywhere

* **Secure printing** - your jobs wait safely until you release them

* **Mobile freedom** - print from the coffee shop, your couch, or that weird spot in the office where you get the best WiFi

## Troubleshooting (Or: "Why Is My Phone Betraying Me?") 🤔

### "I Can't Find the App!"

* **Double-check**: Search for "SAFEQ Cloud" or "YSoft SAFEQ"

* **Ask IT**: Maybe your organization has a specific app they want you to use

### "The Share Option Isn't There!"

* **For web pages**: Make sure PDF option is selected in Safari's share menu

* **For other apps**: The app needs to support sharing---not all apps play nice

### "My Job Isn't Showing Up!"

* **Wait a moment**: Large files take time to upload

* **Check your connection**: Mobile data can be spotty

* **Try refreshing**: Close and reopen the job list

### "I Can't Login!"

* **Check your credentials**: Same username/password as always

* **IT time**: When in doubt, ask your IT team---they love helping with login issues (really!)

*** ** * ** ***

## The Bottom Line 🎯

Mobile printing with SAFEQ Cloud is like having a personal printer that follows you everywhere---except it's better because it doesn't take up space, need ink cartridges, or make weird noises at 3 AM.

Download the app, share your documents, walk to any printer, and boom---paper magic! It's so simple, you'll wonder why you ever bothered walking back to your desk just to print something.

Now go forth and print from anywhere! Your documents are waiting, and your pocket-sized print shop is ready to deliver. 📱✨

---
language: "en"
---
# One Time Passwords for Card Registration

**Relevant Products**

BREEZE MFP PRO MFP

## What's a One-Time Password?

A One-Time Password (OTP) is a temporary code. It's particularly useful for card registration.

## Before You Start

To generate an OTP, you'll need:

✅ **Card authentication setup** - A printer with card authentication must exist within your account (set up by administrator)

## Getting to Your OTP

Here's how to find and generate your one-time password:

🚪 **Head to My Documents**

Log into your SAFEQ Cloud Web UI and navigate to the **My Documents** section

🔍 **Look for the Authentication Tabs**

You'll see two tabs - one for PIN and one for OTP. Click on the **Login with card** tab to access your OTP options.  

The demo above shows you the following:

👀 **View Your Current OTP**

You'll see your current one-time password displayed

🔄 **Generating a New One**

Need a fresh OTP? Simply click the generate button to create a new one-time password

---
language: "en"
---
# Password Reset 🔑🤦‍♀️

## Because "Password1234" Isn't Working Anymore

Has someone forgot their password again? Don't worry, we've all been there.

Password reset is easy via the SAFEQ Cloud Portal.

**Quick reality check:** This password reset wizardry only works for local SAFEQ Cloud accounts - the ones we actually control.

If you're using Entra ID, Google, or any other authentication provider, you'll need to go reset your password wherever your IT originally set it up.

*** ** * ** ***

## The Recovery Process 🎭

### **Option A - The Express Lane - but you need to know what you're doing:**

1. **Go directly to the SAFEQ Cloud Portal URL, but add /forgottenpassword to the end.**

   * *It should look like https://\[yourdomain\].\[xx\].ysoft.cloud/forgottenpassword*

     * *where xx is the data center but you knew that already right?*

### **Option B - The Scenic Route:**

1. **Navigate to the login page** and follow the rest of the guide below.

### Step 2: Username

* **Type in your username, and hit Next**

* **Click the "Password Reset" button**

### Step 3: The Username Déjà Vu Experience

* **Type your username AGAIN** on the next screen*.*

* **Click "Submit"**

### Step 4: The Waiting Game

* **Check your email**.

* **Click the magical link** in the email

### Step 5: The Fresh Start

* **Create a new password**

  * *Make it secure.*

  * *Use a mix of uppercase, lowercase, numbers, and symbols, our standard is minimum 12 length*

* **Type it twice**

* **Submit**

*** ** * ** ***

## Hints \& Tips💡

### Password Creation Tips:

* **Make it unique** - don't recycle that password from 2018

* **Make it complex** - but not so complex you need a PhD to remember it

* **Make it memorable** - "MyC@t15Fl00fy!" is better than "X7#mK9$pLw2@"

### The Part Where We Sound Responsible:

**PLEASE, for the love of all things digital, save your password in a password manager!**

You know what's better than going through this whole reset process every few months? Having a password manager that remembers everything for you. It's like having a digital assistant who actually does their job and doesn't judge you for forgetting things.

Popular options include:

* **LastPass**

* **1Password**

* **Bitwarden**

* **Your browser's built-in manager**

*** ** * ** ***

## Troubleshooting

### "I Never Got The Email!"

* **Check spam/junk** - password reset emails love hiding there

* **Wait 10 minutes** - it might take a bit of time to get to you

* **Contact IT**

### "The Link Doesn't Work!"

* **Check if it expired** - these links have short lifespans

* **Try a different browser** - there could be cacheing issues. x\`

* **Start over** - because apparently that's what we do now

### "My New Password Isn't Working!"

* **Check caps lock**

* **Make sure you're using the RIGHT new password** - not the old one

* **Clear your browser cache**

*** ** * ** ***

## The Bottom Line 🎯

Password reset: it's not rocket science, but somehow we all need instructions anyway. The process is designed to be foolproof.

Just remember: username, reset button, username again (because reasons), check email, click link, new password, (and maybe password manager).

*** ** * ** ***

*P.S. - If you're reading this guide for the third time this year, we're not judging you. Much. Okay, we're judging a little, but mostly we're impressed by your consistency. 😏*

---
language: "en"
---
# Printing from PC or Mac with SAFEQ Cloud 🖨️

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

## The Good News: Nothing's Changed! 🎉

Congratulations! You've successfully overthought this. With SAFEQ Cloud and the PC Client installed, printing works exactly like it always has. We haven't reinvented the wheel---we've just made it more secure and manageable.

## How to Print (Spoiler Alert: You Already Know This)

### Step 1: Do What You've Always Done

1. Open your document (Word, Excel, PDF, that meme you want to print for your colleague)

2. Click **File** → **Print** (or press Ctrl+P if you're feeling fancy)

3. Select your printer from the list, this could be "Secure Print" if you have that capability, or printing directly to the printers you know and love

4. Click **Print**

### Step 2: There Is No Step 2

That's it. Seriously. Your document has been sent, is in the process of being printed directly or now safely queued and waiting for you at the printer.

## Troubleshooting (Or: "Why Isn't This Working?") 🤔

### My Printer Isn't Listed

* **Check**: Is the SAFEQ Cloud PC Client installed and running?

* **Try**: Restarting your computer (the IT classic that works 87% of the time)

### My Job Isn't at the Printer

* **Did you actually click Print?** (We've all been there)

* **Wait**: Sometimes jobs take a moment to appear, especially large files

### The Printer Says "Unavailable"

* **Translation**: Either the printer can't handle your job, or you don't have permission to print it

* **Solution**: Try a different printer or check with your administrator about permissions

## The Bottom Line 🎯

SAFEQ Cloud doesn't change how you print.

So go ahead, print that document. File → Print. Just like always. The future is now, and it looks remarkably similar to the past.

*** ** * ** ***

*Still confused? Don't worry---your muscle memory will kick in the moment you press Ctrl/Cmd+P. Trust yourself. You've got this! 💪*

---
language: "en"
---
# Printing & Scanning Guides 🖨️📄

Ready to become a printing and scanning wizard?

This section is your treasure trove of everything you need to know!

---
language: "en"
---
# Ricoh Embedded Terminal

Follow the video below to install the Ricoh Embedded Terminal  
[https://player.vimeo.com/video/1115144841?badge=0\&amp;autopause=0\&amp;player_id=0\&amp;app_id=58479](https://player.vimeo.com/video/1115144841?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479)

---
language: "en"
---
# Setting Up Entra ID Service Account Authentication 🔐✨

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

## Your Gateway to Automatic PC Client Login!

Ready to connect your SAFEQ Cloud to Microsoft Entra ID using Service Account authentication? This setup enables the PC Client to automatically authenticate users on Entra ID-joined computers, making the printing experience seamless and magical.

Think of this as creating a special backstage pass that lets SAFEQ Cloud peek into your Entra ID directory and recognize users automatically. It's like having a bouncer who already knows all the VIPs!

*** ** * ** ***

## What This Accomplishes (The Big Picture) 🎯

Once you complete this setup:

* **PC Client automatically recognizes** users on Entra ID-joined computers

* **Seamless authentication** happens behind the scenes

* **Users get recognized** without manual intervention

* **IT admins can display user departments** in accounting reports

* **Card IDs and PINs** stored in Entra ID become usable at MFDs

*Note: This is specifically for the Service Account authentication method, which enables the PC Client's automatic login feature for domain-joined computers.*

*** ** * ** ***

## Before You Begin (Prep Time!) 📋

You'll need:

* **Azure Portal access** with app registration permissions

* **SAFEQ Cloud Web UI admin access**

* **A service account** in your Entra ID (username and password)

* **Your SAFEQ Cloud domain** (like [print.acme.com](http://print.acme.com/))

* **Coffee** (optional but recommended ☕)

* **Patience** (Azure has many clicks, but we'll get through it together!)

*** ** * ** ***

## Part 1: Creating Your Azure App Registration 🚀

### Steps 1-4: The Foundation

1. **Log into Azure Portal** and click **"Manage Microsoft Entra ID"**

   * *Fun fact: It's still basically Azure AD, they just gave it a fancier name*

2. **Click "App registrations"**

3. **Click "+ New registration"** (that friendly little plus sign!)

4. **Fill in the basics**:

   * **Name**: Something descriptive like "SAFEQ Cloud Service Account"

   * **Supported account types**: Pick what matches your organization setup

   * **Redirect URI**: Leave this empty for now (we're keeping it simple!)

5. **Click "Register"** and feel the satisfaction of creation! 🎉

### Steps 5-7: Permission Configuration (The Important Stuff)

6. **Click "API permissions"**

7. **Find "Microsoft Graph"** and delete the default "User.Read" permission

   * *Don't worry, we're going to add better permissions in a moment*

### Steps 8-11: Adding the Right Permissions

8. **Click "Add a permission"**

9. **Select "Microsoft Graph"** from the commonly used APIs

10. **Click "Delegated permissions"**

11. **Search for and add these essential permissions**:

    * **Group.Read.All**: Lets the app read group info and memberships

    * **User.Read.All**: Allows reading user profiles and properties

*Pro tip: These are the minimum required permissions for this setup!*

### Step 12: Grant Admin Consent (The Power Move)

12. **Click "Grant admin consent for \[your organization\]"**

13. **Click "Yes"** to approve

    * *This is where you use your admin superpowers to approve everything at once*

### Steps 13-14: Enable Public Client Flows

13. **Click "Authentication"**

14. **Set "Allow public client flows" to "Yes"**

    * *This magical setting enables the service account to fetch user info from Entra ID*

Follow the steps in the demo below if you need additional assistance.  

**Congratulations!** Your Azure App Registration is complete! 🏆

*** ** * ** ***

## Part 2: Configuring SAFEQ Cloud (The Grand Finale) ⚡

### Step 15: Create the Authentication Provider

15. **Log into SAFEQ Cloud Web UI**

16. **Go to Users → Authentication providers tab**

17. **Click "Add"** (another magical moment!)

18. **Fill in the general settings**:

    * **Type**: Select "Microsoft Entra ID"

    * **Name**: Will auto-fill, but make it friendly if you want

    * **Domains** : Enter your Entra ID domain (like "[http://acme.com](http://acme.com/) " from [john.doe@acme.com](mailto:john.doe@acme.com))

    * **Priority**: Set the authentication order (higher numbers go first)

    * **Active**: Make sure this is enabled

### Configure Service Account Authentication:

19. **In the "Service Account Authentication" section**:

    * **Active**: Turn this ON (this is the whole point!)

    * **Application ID**: Enter the ID from your Azure App Registration

    * **User name**: Your service account username

    * **Password**: Your service account password

    * **Cache expiration**: Set to at least 120 seconds (2 minutes recommended)

    * **Service**: Select your authentication service (or create one if needed)

20. **Click "Save"** and bask in the glory of completion! ✨

*** ** * ** ***

## What Happens Next? 🔮

Your setup is complete! Here's what you can expect:

* **PC Client will automatically recognize** users on Entra ID-joined computers

* **User information syncs** from your directory

* **Department data appears** in accounting reports (if configured)

* **Card IDs and PINs** from Entra ID become usable at MFDs

* **All users get assigned** to the "Authenticated Users" group automatically

*** ** * ** ***

## Troubleshooting (When Azure Gets Moody) 🤔

### "I Can't Find My App Registration!"

* **Check the name** - Azure is case-sensitive sometimes

* **Try refreshing** the App registrations page

* **Look in Enterprise Applications** too - it might show up there

### "Permission Errors During Setup!"

* **Verify admin rights** - you need proper permissions in Azure

* **Check the service account** - make sure it's active and the password is correct

* **Double-check the Application ID** - one wrong character breaks everything

### "Users Aren't Getting Recognized!"

* **Confirm computers are Entra ID-joined** - this only works for domain-joined machines

* **Check the domain matching** - the domain in SAFEQ must match your Entra ID domain

* **Verify the authentication provider is active** - sometimes the toggle gets missed

### "Cache Issues or Slow Response!"

* **Increase cache expiration time** - try 300 seconds (5 minutes)

* **Check network connectivity** - SAFEQ needs to reach Microsoft's servers

* **Monitor the authentication service** - make sure it's running properly

*** ** * ** ***

## The Victory Celebration 🎊

You've successfully bridged the gap between Microsoft Entra ID and SAFEQ Cloud! Your Service Account authentication is now ready to make users' lives easier by providing automatic authentication on their domain-joined computers.

The PC Client can now tap into your Entra ID directory, recognize users automatically, and provide that seamless experience everyone loves. You've essentially created a VIP lane for your users' authentication journey.

Take a moment to appreciate what you've accomplished - you've connected two enterprise systems and made them work together harmoniously. That's some serious IT wizardry right there! 🧙‍♂️

*** ** * ** ***

*Remember: If something seems broken, 90% of the time it's a typo in the Application ID or domain name. Check those first, and you'll save yourself hours of troubleshooting! 🔍*

---
language: "en"
---
# Setting Up Location Aware Printing

**Relevant Products**

BREEZE PRINT BREEZE MFP PRO PRINT PRO MFP

Never hunt for the right printer again! Location Aware Printing automatically shows you only the printers available in your current location.

## Step 1: Create Your Locations 🏢

First, let's tell the system where your offices are located:

1. Go to **Settings** → **Locations**

2. Click **Add New Location**

3. Give your location a friendly name (like "New York Office" or "London HQ")

4. Choose how to identify this location using one of these options:

* **Gateway IPv4**

  * Use your office's main internet gateway address

* **Subnet IPv4**

  * Define your office network range

* **IPv4 Range**

  * Set a specific range using "from" and "to" addresses

* **WiFi Network Name (SSID)**

  * Use your office WiFi name (super easy!)

## Step 2: Link Printers to Locations 🖨️📍

Now let's connect your printers to the right locations:

1. Go to **Printers** → **Print Queues**

2. Select the printer you want to set up

3. Under **Default Location**, choose the location you just created

4. Save your changes ✅

You can view these steps in the interactive demo below  

## That's It! 🎉

Your users will now automatically see only the printers available in their current location. No more confusion, no more printing to the wrong office!

*** ** * ** ***

*Need help? Contact your IT team or check our troubleshooting guide.*

---
language: "en"
---
# Setup & Configuration ⚙️

**Time to get everything just right! ⚙️**

Our Setup and Configuration guides help you customize SAFEQ Cloud to work perfectly for your needs.

Whether you're connecting new devices, configuring print settings, or setting up authentication profiles, these guides will walk you through each configuration step clearly and simply.

Get your system running exactly how you want it! 🎯

---
language: "en"
---
# Sharp Embedded Terminal

Follow the video below to install the Sharp Embedded Terminal  
<https://player.vimeo.com/video/1115846775>

---
language: "en"
---
# Syncing User Information from Entra ID 🔄✨

**Relevant Products**

BREEZE MFP PRO MFP

## Cards, PINs, and Departments Made Simple!

Want to pull user information like departments, card IDs, or PINs directly from your Microsoft Entra ID into SAFEQ Cloud? This guide will walk you through the process without the technical jargon overload.

This setup is perfect for getting department information into your reports, enabling card authentication at MFDs, or using PINs stored in your directory.

*** ** * ** ***

## What This Achieves (The Big Picture) 🎯

Once set up, SAFEQ Cloud will automatically pull:

* **Department information** for accurate reporting

* **Card IDs** stored in Entra ID for MFD authentication

* **PINs** for alternative login methods

* **Any custom attributes** you've set up in your directory

Users don't see card IDs or PINs in the web interface, but they work perfectly for authentication. It's like having a secret handshake that just works! 🤝

*** ** * ** ***

## Prerequisites (What You Need First) 📋

Before we start this synchronization journey:

* **Service Account Authentication** must be set up in SAFEQ Cloud

  * *If you haven't done this yet, check out our Entra ID Service Account guide first*

* **User information** properly filled in Entra ID (departments, card IDs, etc.)

* **Admin access** to both Entra ID and SAFEQ Cloud

*** ** * ** ***

## Phase 1: Prepare Your Entra ID Data 🏗️

### Step 1: Make Sure Your User Data is Ready

First, let's verify that the information actually exists in Entra ID:

1. **Check your users have the data you want to sync**

   * Departments filled in? ✅

   * Card IDs stored somewhere? ✅

   * PINs in custom attributes? ✅

### Step 2: Test Your Data with Graph Explorer

*This sounds scary but it's actually pretty easy - you're basically asking Entra ID "Hey, show me what you know about users!"*

1. **Go to Graph Explorer** : <https://developer.microsoft.com/en-us/graph/graph-explorer>

2. **Sign in as a user** who has the department information filled in

3. **Run this query** to see what's available:

       https://graph.microsoft.com/v1.0/me?$select=displayName,givenName,department,userPrincipalName

4. **Check the results** - you should see the department and other info displayed

*If you don't see the data you expect, you'll need to fill it in Entra ID before continuing!*

*** ** * ** ***

## Phase 2: Understanding Attribute Types 🏷️

*This is just knowing where your data lives in Entra ID!*

### Standard Attributes (The Easy Ones):

* **department**: Just use "department"

* **userPrincipalName**: The user's email-style login

* **displayName**: Their full name

### Extension Attributes (The Slightly Trickier Ones):

If you're using custom fields that came from on-premises AD:

* **Format**: extensionAttribute1, extensionAttribute2, etc. (up to extensionAttribute15)

* **Example**: If card IDs are in extensionAttribute5, you just use "extensionAttribute5"

### Directory Extensions (The Complex Ones):

If you created custom attributes in Entra ID:

* **Format**: extension_\[AppID\]_\[AttributeName\]

* **Example**: extension_12345678_cardID

* *You'll need to find the exact name using Graph Explorer*

*Pro tip: Start with standard or extension attributes if possible - they're much simpler to work with!*

*** ** * ** ***

## Phase 3: Configure SAFEQ Cloud 🔧

### Step 1: Open Your Authentication Provider

1. **Go to SAFEQ Cloud Web UI**

2. **Navigate to Users → Authentication providers**

3. **Find your Microsoft Entra ID provider** (the one with Service Account Authentication enabled)

4. **Click to edit it**

### Step 2: Configure Custom Attributes

1. **Find the "Service Account Authentication" section**

2. **Click "Show"** next to "Custom attributes"

3. **Map your attributes** based on what you want to sync:

#### For Department Information:

* **Department field**: Enter "department"

* *This is the most common scenario - departments for reporting*

#### For Card IDs:

* **Card ID field**: Enter the attribute name where your card IDs are stored

  * Standard: "extensionAttribute1" (or whichever number you use)

  * Directory Extension: "extension_12345678_cardID" (use your actual format)

#### For PINs/Short IDs:

* **Short ID field**: Enter the attribute name where PINs are stored

  * Usually something like "extensionAttribute2"

### Step 3: Save Your Configuration

4. **Click "Save"** 🎉

*** ** * ** ***

## Phase 4: Trigger the Sync 🚀

*Now comes the fun part - making it all work!*

### The Sync Process:

The sync happens automatically when users authenticate, but you can speed things up:

1. **Users need to log in** through this authentication provider

   * Web UI login works

   * PC Client login works

   * Any authentication through your Entra ID provider triggers the sync

2. **Wait for the magic** to happen (usually pretty quick!)

3. **Verify it worked**:

   * Go to **SAFEQ Cloud → Users**

   * **Select your Microsoft Entra ID provider**

   * **Search for a test user**

   * **Check their details** - you should see department, card info, etc.

*** ** * ** ***

## Verification and Testing 🧪

### Check That Everything Worked:

1. **User Profile Check**:

   * Find a user in SAFEQ Cloud Users section

   * Verify department appears in their profile

   * *Note: Card IDs and PINs won't show in the web UI, but they'll work for authentication*

2. **Report Testing**:

   * Generate a report

   * Check if department information appears in job records

   * *This is where the department sync really shines!*

3. **Authentication Testing**:

   * Try card authentication at an MFD (if you synced card IDs)

   * Test PIN login (if you synced PINs)

   * *Users should be able to authenticate even though they can't see these values in the web UI*

*** ** * ** ***

## Common Scenarios \& Examples 📝

### Scenario 1: Department Reporting

**Goal** : Show departments in accounting reports **Attribute to sync** : department **Configuration** : Put "department" in the Department field **Result**: All print jobs show user departments in reports

### Scenario 2: Card Authentication

**Goal** : Use existing card IDs from on-prem AD **Attribute to sync** : extensionAttribute3 (where card IDs are stored) **Configuration** : Put "extensionAttribute3" in the Card ID field

**Result**: Users can authenticate at MFDs using their existing cards

### Scenario 3: PIN Authentication

**Goal** : Enable PIN login at MFDs **Attribute to sync** : extensionAttribute7 (where PINs are stored) **Configuration** : Put "extensionAttribute7" in the Short ID field **Result**: Users can enter PINs at MFDs to authenticate

*** ** * ** ***

## Troubleshooting 🤔

### "I Don't See Any Department Information!"

* **Check Entra ID data**: Use Graph Explorer to verify the department field is populated

* **Verify authentication**: Has the user logged in through the provider since configuration?

* **Check attribute mapping**: Make sure you used "department" (not "Department" or "DEPARTMENT")

* **Wait and retry**: Sometimes it takes a login cycle to refresh

### "Card Authentication Isn't Working!"

* **Verify the attribute exists**: Use Graph Explorer to check the card ID field

* **Check the attribute name**: extensionAttribute1 vs extension_app123_cardID format

* **Test with a known user**: Pick someone whose card ID you can verify

* **Remember**: Card IDs won't show in web UI, but should work at MFDs

### "Graph Explorer Shows No Data!"

* **Check user permissions**: The test user needs to have the data filled in

* **Verify the query**: Copy/paste the exact query from this guide

* **Try a different user**: Maybe the first one doesn't have department filled in

* **Check authentication**: Make sure you're logged into Graph Explorer properly

### "Sync Worked Once But Stopped!"

* **Check service account**: Make sure it's still active and password hasn't expired

* **Verify app permissions**: Graph API permissions might have changed

* **Test authentication provider**: Try logging in through it to trigger a refresh

* **Review error logs**: SAFEQ Cloud logs might show sync issues

*** ** * ** ***

## Summary

Congratulations! You've successfully connected SAFEQ Cloud to your Entra ID directory for automatic user information synchronization. Your reports will now show proper department information, users can authenticate with their existing cards and PINs, and everything happens automatically behind the scenes.

This setup makes life easier for everyone:

* **Users** get seamless authentication with their existing credentials

* **Administrators** get accurate reporting with department information

* **IT teams** don't have to manually manage card IDs and PINs

* **Managers** get proper cost center attribution in print reports

You've essentially created a bridge that keeps user information synchronized automatically. Every time someone logs in, their information gets refreshed from Entra ID. It's like having a personal assistant who never forgets to update the user database!

*** ** * ** ***

*Pro tip: Once this is working, document which attributes you're using where. Future you (and your replacement) will thank you for the clear documentation! 📝*

---
language: "en"
---
# Troubleshooting

Have some problems? There will be a solution here in the coming weeks. Keep checking back!

---
language: "en"
---
# User Portal for Breeze Print 🖨️✨

Welcome to the Breeze Print User Portal - your personal printer control center!

This nifty portal lets you handpick exactly which printers show up on your computer. Whether you're a creature of habit who always uses the same three printers, or you just don't want to see that temperamental printer from the basement that's always jamming, this is your ticket to printing paradise!

*** ** * ** ***

## What Does This Do? (The Magic Explained) 🪄

The Breeze Print User Portal gives you the power to:

* **Choose which printers** appear on your computer

* **Hide printers you never use** (goodbye, random printers from other buildings!)

* **Keep your favorites easily accessible**

* **Take control** when location-aware printing isn't set up in your organization.

It's like having a remote control for your printer list - finally, technology that puts you in charge! 🎮

*** ** * ** ***

## How to Customize Your Printer Paradise 🌟

### Step 1: Get to the Portal

1. **Log into the Breeze Print User Portal** using your usual credentials

   * *Your IT team should have given you the portal URL - if not, ask them nicely (maybe with coffee bribes ☕)*

### Step 2: Navigate to Printer Central

2. **Click on "Printers"** in the portal tabs

   * *This is where all the printer magic lives!*

### Step 3: The Great Printer Selection

Here's where it gets fun - you'll see **ALL available printers** checked by default. Think of it as the "everything bagel" of printer lists!

3. **Review your printer options** - you'll see every printer your organization has available

4. **Uncheck the printers you DON'T want** to see on your computer

   * *Be ruthless!*

   * *The color printer that's always out of toner? Your choice!*

   * *The printer three buildings away that you'll never use? Bye bye!*

### Step 4: Save Your Masterpiece

5. **Hit "Save"** and admire your carefully curated printer selection

   * *You've just become the curator of your own personal printer museum! 🎨*

### Step 5: The Waiting Game (But Not Really)

6. **Wait up to an hour** for the PC Client to work its synchronization magic

   * *Perfect time for a coffee break, a short walk, or contemplating your excellent printer choices*

   * *The PC Client will automatically update your computer with your new preferences*

*** ** * ** ***

## What Happens After You Save? ⏰

### The Synchronization Process:

* **Within an hour**: Your PC Client will automatically update

* **No restart required**: The changes happen seamlessly in the background

* **Immediate effect**: New printer list appears in your print dialogs

* **Set and forget**: No need to do anything else - it just works!

### Signs Your Changes Took Effect:

* **Shorter printer lists** when you go to print something

* **Only your chosen printers** appear in print dialogs

* **Faster printer selection** (fewer choices = quicker decisions)

* **A sense of satisfaction** from your perfectly curated printer collection

*** ** * ** ***

## Troubleshooting (When Printers Play Hide and Seek) 🤔

### "My Changes Haven't Appeared Yet!"

* **Check the time**: It can take up to an hour for synchronization

* **Restart your applications**: Sometimes print dialogs need a refresh

* **Try printing something**: This often triggers the printer list update

* **Be patient**: Good things come to those who wait (especially printer updates)

### "I Accidentally Unchecked My Favorite Printer!"

* **No panic needed**: Just go back to the portal

* **Check the printer again**: Select it in your list

* **Hit Save**: Your favorite will return within the hour

* **Crisis averted**: Like it never happened!

### "I Don't See Any Printers in the Portal!"

* **Check your login**: Make sure you're logged in properly

* **Verify permissions**: You might need access rights to see printers

* **Contact IT**: They can check if your account is set up correctly

* **Try refreshing**: Sometimes the portal needs a gentle nudge

### "All My Printers Disappeared!"

* **Don't panic**: This is usually temporary

* **Check if you accidentally unchecked everything**: Easy mistake to make!

* **Wait for synchronization**: Your PC Client might still be updating

* **Reset to defaults**: Go back to the portal and re-select your printers

## The Bottom Line 🎯

The Breeze Print User Portal puts you in the driver's seat of your printing experience. No more scrolling through endless lists of printers you'll never use, no more accidentally printing to the office across town, and no more printer decision fatigue!

It's like having a personal assistant who pre-filters everything to show you only what you actually want to see. Whether you're a minimalist who wants just one reliable printer or a power user who needs access to specialized devices, you can customize your setup to match your workflow perfectly.

Take control of your printer destiny - log in, make your selections, and enjoy the satisfaction of a perfectly tailored printing experience. Your future self will thank you every time you click "Print" and see exactly the options you want! 🖨️✨

*** ** * ** ***

*Pro tip: This is also a great way to avoid accidentally printing sensitive documents to the printer in the lobby. We've all been there!*😅

---
language: "en"
---
# Web Upload Documents for Printing 📤

**Relevant Products**

BREEZE MFP PRO MFP

## What is Web Upload? 🌐

Web Upload is your convenient way to print documents from anywhere! Whether you're working from home, using a device without the PC Client, or need to print something from your phone, Web Upload lets you upload documents directly through your web browser and print them later at any SAFEQ Cloud printer.

## How to Upload Your Documents 📁

### Step 1: Access the Upload Feature

1. **Log into SAFEQ Cloud** through your web browser

2. Navigate to **Personal** \> **My Documents**

3. Look for the **Web Upload** widget on the page

### Step 2: Upload Your File 📤

1. **Click the upload button** or drag and drop your file

2. **Select your document** from your device (computer, phone, tablet)

3. **Wait for the upload** - you'll see a progress bar

### Step 3: Configure Print Settings ⚙️

After uploading, a window will appear with print options:

* **Color or Black \& White** - Choose your preferred printing style

* **Pages** - Print all pages or select specific ones

* **Page Orientation** - Portrait or landscape

* **Output Page Size** - A4, Letter, or other available sizes

### Step 4: Save and Print Later 💾

* **Click Save** to store your document with your chosen settings

* Your document will appear in **My Documents**

* **Print it later** at any SAFEQ Cloud printer by logging in at the device

## What Files Can I Upload? 📄

Web Upload works with most common file types:

* ✅ **PDF files** (work perfectly!)

* ✅ **Microsoft Office files** (Word, Excel, PowerPoint)

* ✅ **Images** (JPEG, PNG, etc.)

* ✅ **Text files**

## File Size and Limits 📏

**File Size:**

* Maximum file size varies by organization (typically 20-100MB)

* If your file is too large, try compressing it or splitting it into smaller parts

**Microsoft Excel Files:**

* Print preview limited to 10,000 pages maximum

* Large spreadsheets might take a few minutes to process

**Processing Time:**

* Most files convert quickly

* Microsoft Office files can take up to 5 minutes to process

## Tips for Best Results 💡

**For Perfect Printing:**

* ✅ Use standard fonts when possible (Arial, Times New Roman, etc.)

* ✅ Save documents as PDF before uploading for guaranteed formatting

* ✅ Check your document preview before printing

**Upload Anywhere:**

* 💻 Perfect for laptops without the PC Client

* 🏠 Ideal for working from home

**Stay Organized:**

* Give your documents clear names

* Delete old documents you no longer need

## Troubleshooting Common Issues 🛠️

**Upload Failed?**

* Check your file size (might be too large)

* Try a different file format

* Ensure you have a stable internet connection

**Document Looks Different When Printed?**

* This can happen with non-standard fonts

* Try converting to PDF first, or use common fonts

**Taking Too Long to Process?**

* Large Microsoft Office files can take up to 5 minutes

* Be patient, especially with complex Excel files

**Can't Find the Upload Button?**

* Make sure your administrator has enabled Web Upload

* Check that you're in Personal \> My Documents

## The Perfect Workflow 🔄

1. **Upload from anywhere** - Home, coffee shop, or office

2. **Set your preferences** - Color, pages, size - all customized

3. **Head to any printer** - Log in and find your document ready to go

4. **Print immediately** - No waiting, no setup required!

## Why Users Love Web Upload ❤️

* **Print from any device** - Phone, tablet, laptop, anything with a browser

* **No software required** - Works in any web browser

* **Flexible timing** - Upload now, print later

* **Perfect for remote work** - Upload from home, print at the office

* **Great for guests** - Visitors can upload and print without installing anything

*** ** * ** ***

**Ready to start uploading?** Head to Personal \> My Documents and look for that Web Upload widget - your documents are just a few clicks away from any printer! 🖨️✨

---
language: "en"
---
# What is SAFEQ Cloud Breeze

**Relevant Products**

BREEZE PRINT BREEZE MFP

SAFEQ Cloud Breeze is designed for low-touch deployments in cloud-ready environments, where you want simplicity.

Breeze simplifies IT by removing the burden of print server management, you benefit from cloud-based print management, compliance features, reporting, scan-to-email and repository workflows, guest printing, and location-aware printing. All of this is packaged in a way that's simple to adopt and easy to run.

---
language: "en"
---
# What is SAFEQ Cloud doing when "Searching for Printers"?

**Relevant Products**

BREEZE PRINT BREEZE MFP

## How Breeze Discovers Your Printers 🔍🖨️

## The Magic Behind "Searching for Printers"!

Ever wondered what happens during that "SEARCHING FOR PRINTERS" phase when you first install the Breeze PC Client? It's like watching a digital detective at work! While you sit there wondering if it's actually doing anything, the onboarding wizard is busy running around your network, knocking on doors, and making friends with every printer it can find.

This behind-the-scenes magic happens in three clever steps that turn your PC into a printer-whispering wizard! 🧙‍♂️  
![image-20250926-094348.png](https://docs.ysoft.cloud/__attachments/a_4325a9721ca3f8c0248151177acbb8fd47b3927666742772c0e1b170de2e1e78/image-20250926-094348.png?cb=193b2077a36641431b94a00b33398028)
The onboarding wizard searching for printers

*** ** * ** ***

## The Three-Step Printer Discovery

### Step 1: Finding Printers on the Network 🕵️‍♀️

![image-20250926-094348.png](https://docs.ysoft.cloud/__attachments/a_4325a9721ca3f8c0248151177acbb8fd47b3927666742772c0e1b170de2e1e78/image-20250926-094348.png?cb=193b2077a36641431b94a00b33398028)
The onboarding wizard searching for printers

**What's happening:** The wizard becomes a network explorer, searching for any device that looks, acts, or smells like a printer!

**The Technical Magic:**

* **Breeze uses mDNS (Bonjour)** to find devices 📡

  * *Think of it as your PC shouting "Any printers out there?" and waiting for responses*

* **You may be wondering why mDNS 🤔? It's everywhere** - it's built into Windows and macOS, required by AirPrint, and supported by most printer manufacturers

  * *It's like the universal language of "Hey, I'm a printer!"*

* **The search process** looks for devices advertising printer services on your network

**What We're Looking For:**

* ✅ **Powered on printers** (sleeping printers don't respond to party invitations, you can re-run the search if they were sleeping, just click "Start again")

* ✅ **Same subnet connectivity** (network neighbors only)

* ✅ **Self-advertising devices** (printers that aren't shy about announcing themselves)

### Step 2: Identifying Each Printer 🆔

**What's happening:** Now that we've found the printers, it's time for proper introductions - we need to know who's who!

**The Serial Number Hunt:**

* **SNMP v2 queries** are sent to each discovered device 📊

  * *It's asking each printer "What's your serial number?" in computer language*

* **Serial numbers get stored** from the printer's MIB (Management Information Base)

  * *Think of this as each printer's ID card*

**Why Serial Numbers Matter:**

* 🎯 **Embedded App installations** need this for device-specific setup

* 🔄 **Consistent identification** ensures we always recognize the same printer and we can streamline the license ordering process if you choose to make a purchase later

**No Drama if it Fails:**

* If SNMP is disabled or blocked, no worries! 🤷‍♀️

* The printer still works perfectly for printing

* We just don't get the serial number (which is fine for basic printing)

### Step 3: Understanding Device Capabilities 🧠

**What's happening:** Time to figure out what each printer is capable of - it's like getting to know their special talents!

**The Information Gathering:**

* **IPP queries (Get-Printer-Attributes)** collect the printer's resume 📋

* **Device capabilities** are discovered (mono vs color) and configured in the printer settings

* **Device logos** are grabbed to make the wizard look pretty 🎨

* **Supported document formats** are identified for reliable printing

**Format Selection Intelligence:** The PC Client is smart about choosing the best communication method, heres the order of priority:

1. **PostScript** 🥇 - The gold standard! Fastest and most robust when available

2. **PDF** 🥈 - The reliable friend everyone can work with

3. **PCL6** 🥉 - The enterprise favorite for business printers

4. **Raster formats (URF, PWG)** 📄 - The universal backup that works with everything

**Smart Fallback Logic:**

* **If IPP query fails:** Default to PDF (the safe choice) 🛡️

* **If formats are discovered but we cannot find an ideal format:** Fall back to PWG raster (maximum compatibility) 🔄

*** ** * ** ***

## Requirements \& Network Realities 🌐

### What You Need for Discovery Magic:

* **Bonjour enabled** on printers (uses UDP port 5353) 🔓

* **Same subnet** - printers and PC need to be network neighbors 🏠

* **Open firewall** for mDNS traffic on port 5353 🚪

### Network Constraints (The Real World):

* **Subnet limitations** - discovery usually works within the same network segment only 🏘️

* **Router settings** - while routers CAN allow mDNS across subnets, many admins disable this because mDNS is quite chatty 💬

* **VPN considerations** - some VPN clients block local multicast traffic 🚫

*** ** * ** ***

## Troubleshooting: When Discovery Gets Shy 🤔

### "No Printers Found" Scenarios:

**Different Subnets Issue:**

* **Problem**: PC and printer are on different network segments 🌉

* **Solution**: Check with your IT team about network topology or try connecting to the same subnet

**Bonjour/mDNS Disabled:**

* **Problem**: mDNS isn't active on the printer 📴

* **Solution**: Enable Bonjour/mDNS in the printer's network settings (usually in the admin panel)

**Firewall Blocking Discovery:**

* **Problem**: Port 5353 (UDP) is blocked 🔒

* **Solution**: Work with IT to allow mDNS traffic through the firewall

**WSD/DPWS Disabled:**

* **Problem**: Some manufacturers require these services for discovery 🔧

* **Solution**: Check printer settings and enable WSD (Web Services for Devices) if available

**VPN Client Interference:**

* **Problem**: VPN blocks local multicast traffic 🛡️

* **Solution**: Temporarily disconnect from VPN during discovery, then reconnect after setup

### "Found But Can't Identify" Issues:

**SNMP Problems:**

* **Symptom**: Printer found but no serial number captured 📝

* **Impact**: No problem for basic printing, may be required if you're installing the printer App (AKA: Embedded Terminal)

* **Solution**: Enable SNMP V2 on the printer if you need serial number identification or add it manually to the printer settings

**IPP Query Failures:**

* **Symptom**: Printer found but capabilities unknown❓

* **Result**: PC Client defaults to PDF format (which usually works great!)

* **Solution**: Check if IPP is enabled on the printer, but PDF fallback typically resolves any issues. You can also manually change the print format (Printer Settings \> Advanced Settings \> Printer Language)

*** ** * ** ***

## The Bottom Line 🎯

The Breeze printer discovery process is like having a really smart networking assistant who knows how to make friends with printers! It uses industry-standard protocols (mDNS, SNMP, IPP) to find devices, learn about them, and figure out the best way to communicate.

Most of the time, this all happens seamlessly in the background while you grab coffee ☕. The wizard finds your printers, learns their capabilities, and sets everything up for reliable printing. When it works (which is most of the time), it feels like magic. When it doesn't, it's usually a network configuration issue that your IT team can help resolve.

The beauty of this system is its intelligent fallback mechanisms - even if some steps fail, the PC Client adapts and finds a way to make printing work. It's designed to be resilient and get you printing even in less-than-perfect network environments.

So next time you see "SEARCHING FOR PRINTERS," you'll know there's a sophisticated discovery dance happening behind the scenes! 🕺💃

*** ** * ** ***

*Pro tip: If discovery seems slow or incomplete, check with your network admin about mDNS/Bonjour settings and firewall rules. A little network TLC can make discovery work like a charm! ✨*

*** ** * ** ***

[Next Page](https://docs.ysoft.cloud/llms-full.txt/1)
