OpenAPI: https://integrations.yoursafe.com/openapi/remote-user-management.json

# Remote User Management

## General Description

The VerotelRUM accepts the Postback (a HTTP call to the server of the merchant) from Verotel. The Postback provides the merchant with postback information regarding the transaction processed and the user to be added, modified or deleted. Verotel FlexPay does not return any VerotelRUM Postbacks.

## Supported transaction types

| Postback call | Usage |
| --- | --- |
| `add` | Command when a new one-time or initial-recurring transaction occurs. The buyer must be given access to the website with given usercode and passcode. |
| `rebill` | Command that notifies the merchant about an automated rebill transaction took place for given buyer. |
| `cancel` | Command when a buyer cancelled next planned rebill transaction. The subscription will expire automatically on the next charge date. On this next charge date the merchant will receive a VerotelRUM command 'expire' (see below). |
| `delete` | Command when a merchant needs to remove access to a website for given buyer. |
| `modify` | Command when a merchant needs to change the passcode of given buyer. |

## Add transaction

Add transaction (called by Verotel server) http://www.yourwebsite.com/cgi-bin/rumadd.pl?trn=add&trn_id=39748304&usercode=bob&passcode=testpwd&custom1=cust1&cus tom2=cust2&custom3=cust3 parameter_name type optional remarks trn const "add" mandatory trn_id number mandatory ID of transaction in Verotel system amount number mandatory amount of transaction usercode a-zA-Z0-9 mandatory 1 to 12 alphanumeric characters (editing allows 5-12 in Verotel Control Center) passcode a-zA-Z0-9 mandatory 1 to 14 alphanumeric characters (editing allows 5-12 in Verotel Control Center) custom1 string optional up to 100 characters custom2 string optional up to 100 characters custom3 string optional up to 100 characters

`GET`

Your endpoint receives this call.

### Query parameters

- `trn` (string, required)
- `trn_id` (number, required)
  ID of transaction in Verotel system
- `amount` (number, required)
  amount of transaction
- `usercode` (string, required)
  1 to 12 alphanumeric characters (editing allows 5-12 in Verotel Control Center)
- `passcode` (string, required)
  1 to 14 alphanumeric characters (editing allows 5-12 in Verotel Control Center)
- `custom1` (string)
  up to 100 characters
- `custom2` (string)
  up to 100 characters
- `custom3` (string)
  up to 100 characters

### Response

#### 200

Expected Response Codes Verotel expects that the VerotelRUM script installed on the merchants website responds with a predefined response code. It is important for the merchant to implement this correctly. Whenever Verotel receives a response other than "APPROVED" it will retry the postback call two more times in 20 minutes time period. If all attempts fail, the Postback call will be marked as failed and corresponding debit transaction automatically refunded. Excessive number of failures may cause the Verotel compliance department to suspend the Verotel account. Content of response Meaning APPROVED on success DECLINED when transaction cannot be successfully completed on merchants side ERROR on technical failure on merchants side

```http
GET https://example.com/postback
    ?trn=value
    &trn_id=1
    &amount=9.99
    &usercode=value
    &passcode=value
    &custom1=xxyyzz
    &custom2=custom-2
    &custom3=custom-3
```

```node
const url = new URL("https://example.com/postback");
url.searchParams.set("trn", "value");
url.searchParams.set("trn_id", "1");
url.searchParams.set("amount", "9.99");
url.searchParams.set("usercode", "value");
url.searchParams.set("passcode", "value");
url.searchParams.set("custom1", "xxyyzz");
url.searchParams.set("custom2", "custom-2");
url.searchParams.set("custom3", "custom-3");
const response = await fetch(url);
```

```python
from urllib.parse import urlencode
from urllib.request import urlopen

params = {
    "trn": "value",
    "trn_id": "1",
    "amount": "9.99",
    "usercode": "value",
    "passcode": "value",
    "custom1": "xxyyzz",
    "custom2": "custom-2",
    "custom3": "custom-3",
}
url = "https://example.com/postback?" + urlencode(params)
response = urlopen(url)
```

```php
// GET https://example.com/postback
$params = [
    "trn" => "value",
    "trn_id" => "1",
    "amount" => "9.99",
    "usercode" => "value",
    "passcode" => "value",
    "custom1" => "xxyyzz",
    "custom2" => "custom-2",
    "custom3" => "custom-3",
];
```

```java
// GET https://example.com/postback
Map<String, String> params = Map.ofEntries(
    Map.entry("trn", "value"),
    Map.entry("trn_id", "1"),
    Map.entry("amount", "9.99"),
    Map.entry("usercode", "value"),
    Map.entry("passcode", "value"),
    Map.entry("custom1", "xxyyzz"),
    Map.entry("custom2", "custom-2"),
    Map.entry("custom3", "custom-3")
);
```

## Rebill transaction

Rebill transaction (called by Verotel server) http:// www.yourwebsite.com/cgi-bin/rumadd.pl?trn=rebill&trn_id=39748304&usercode=bob&custom1=cust1&custom2=cust2&custo m3=cust3 parameter_name type Optional remarks trn const "rebill" Mandatory trn_id number Mandatory ID of transaction in Verotel system amount number Mandatory amount of transaction usercode a-zA-Z0-9 Mandatory 1 to 12 alphanumeric characters (editing allows 5-12 in Verotel Control Center) custom1 string optional up to 100 characters custom2 string optional up to 100 characters custom3 string optional up to 100 characters

`GET`

Your endpoint receives this call.

### Query parameters

- `trn` (string, required)
- `trn_id` (number, required)
  ID of transaction in Verotel system
- `amount` (number, required)
  amount of transaction
- `usercode` (string, required)
  1 to 12 alphanumeric characters (editing allows 5-12 in Verotel Control Center)
- `custom1` (string)
  up to 100 characters
- `custom2` (string)
  up to 100 characters
- `custom3` (string)
  up to 100 characters

### Response

#### 200

Expected Response Codes Verotel expects that the VerotelRUM script installed on the merchants website responds with a predefined response code. It is important for the merchant to implement this correctly. Whenever Verotel receives a response other than "APPROVED" it will retry the postback call two more times in 20 minutes time period. If all attempts fail, the Postback call will be marked as failed and corresponding debit transaction automatically refunded. Excessive number of failures may cause the Verotel compliance department to suspend the Verotel account. Content of response Meaning APPROVED on success DECLINED when transaction cannot be successfully completed on merchants side ERROR on technical failure on merchants side

```http
GET https://example.com/postback
    ?trn=value
    &trn_id=1
    &amount=9.99
    &usercode=value
    &custom1=xxyyzz
    &custom2=custom-2
    &custom3=custom-3
```

```node
const url = new URL("https://example.com/postback");
url.searchParams.set("trn", "value");
url.searchParams.set("trn_id", "1");
url.searchParams.set("amount", "9.99");
url.searchParams.set("usercode", "value");
url.searchParams.set("custom1", "xxyyzz");
url.searchParams.set("custom2", "custom-2");
url.searchParams.set("custom3", "custom-3");
const response = await fetch(url);
```

```python
from urllib.parse import urlencode
from urllib.request import urlopen

params = {
    "trn": "value",
    "trn_id": "1",
    "amount": "9.99",
    "usercode": "value",
    "custom1": "xxyyzz",
    "custom2": "custom-2",
    "custom3": "custom-3",
}
url = "https://example.com/postback?" + urlencode(params)
response = urlopen(url)
```

```php
// GET https://example.com/postback
$params = [
    "trn" => "value",
    "trn_id" => "1",
    "amount" => "9.99",
    "usercode" => "value",
    "custom1" => "xxyyzz",
    "custom2" => "custom-2",
    "custom3" => "custom-3",
];
```

```java
// GET https://example.com/postback
Map<String, String> params = Map.ofEntries(
    Map.entry("trn", "value"),
    Map.entry("trn_id", "1"),
    Map.entry("amount", "9.99"),
    Map.entry("usercode", "value"),
    Map.entry("custom1", "xxyyzz"),
    Map.entry("custom2", "custom-2"),
    Map.entry("custom3", "custom-3")
);
```

## Cancel transaction

Cancel transaction (called by Verotel server) http:// www.yourwebsite.com/cgi-bin/rumadd.pl?trn=cancel&usercode=bob&custom1=cust1&custom2=cust2&custom3=cust3 parameter_name type optional remarks trn const "cancel" mandatory usercode a-zA-Z0-9 mandatory 1 to 12 alnum characters (editing allows 5-12 in Verotel Control Center) custom1 string optional up to 100 characters custom2 string optional up to 100 characters custom3 string optional up to 100 characters

`GET`

Your endpoint receives this call.

### Query parameters

- `trn` (string, required)
- `usercode` (string, required)
  1 to 12 alnum characters (editing allows 5-12 in Verotel Control Center)
- `custom1` (string)
  up to 100 characters
- `custom2` (string)
  up to 100 characters
- `custom3` (string)
  up to 100 characters

### Response

#### 200

Expected Response Codes Verotel expects that the VerotelRUM script installed on the merchants website responds with a predefined response code. It is important for the merchant to implement this correctly. Whenever Verotel receives a response other than "APPROVED" it will retry the postback call two more times in 20 minutes time period. If all attempts fail, the Postback call will be marked as failed and corresponding debit transaction automatically refunded. Excessive number of failures may cause the Verotel compliance department to suspend the Verotel account. Content of response Meaning APPROVED on success DECLINED when transaction cannot be successfully completed on merchants side ERROR on technical failure on merchants side

```http
GET https://example.com/postback
    ?trn=value
    &usercode=value
    &custom1=xxyyzz
    &custom2=custom-2
    &custom3=custom-3
```

```node
const url = new URL("https://example.com/postback");
url.searchParams.set("trn", "value");
url.searchParams.set("usercode", "value");
url.searchParams.set("custom1", "xxyyzz");
url.searchParams.set("custom2", "custom-2");
url.searchParams.set("custom3", "custom-3");
const response = await fetch(url);
```

```python
from urllib.parse import urlencode
from urllib.request import urlopen

params = {
    "trn": "value",
    "usercode": "value",
    "custom1": "xxyyzz",
    "custom2": "custom-2",
    "custom3": "custom-3",
}
url = "https://example.com/postback?" + urlencode(params)
response = urlopen(url)
```

```php
// GET https://example.com/postback
$params = [
    "trn" => "value",
    "usercode" => "value",
    "custom1" => "xxyyzz",
    "custom2" => "custom-2",
    "custom3" => "custom-3",
];
```

```java
// GET https://example.com/postback
Map<String, String> params = Map.ofEntries(
    Map.entry("trn", "value"),
    Map.entry("usercode", "value"),
    Map.entry("custom1", "xxyyzz"),
    Map.entry("custom2", "custom-2"),
    Map.entry("custom3", "custom-3")
);
```

## Modify transaction

Modify transaction (called by Verotel server) http:// www.yourwebsite.com/cgi-bin/rumadd.pl?trn=modify&usercode=bob&passcode=testpwd&custom1=cust1&custom2=cust2&cu stom3=cust3 parameter_name Type optional remarks trn const "modify" mandatory usercode a-zA-Z0-9 mandatory 1 to 12 alphanumeric characters passcode a-zA-Z0-9 mandatory 1 to 14 alphanumeric characters custom1 String optional up to 100 characters custom2 String optional up to 100 characters custom3 string optional up to 100 characters

`GET`

Your endpoint receives this call.

### Query parameters

- `trn` (string, required)
- `usercode` (string, required)
  1 to 12 alphanumeric characters
- `passcode` (string, required)
  1 to 14 alphanumeric characters
- `custom1` (string)
  up to 100 characters
- `custom2` (string)
  up to 100 characters
- `custom3` (string)
  up to 100 characters

### Response

#### 200

Expected Response Codes Verotel expects that the VerotelRUM script installed on the merchants website responds with a predefined response code. It is important for the merchant to implement this correctly. Whenever Verotel receives a response other than "APPROVED" it will retry the postback call two more times in 20 minutes time period. If all attempts fail, the Postback call will be marked as failed and corresponding debit transaction automatically refunded. Excessive number of failures may cause the Verotel compliance department to suspend the Verotel account. Content of response Meaning APPROVED on success DECLINED when transaction cannot be successfully completed on merchants side ERROR on technical failure on merchants side

```http
GET https://example.com/postback
    ?trn=value
    &usercode=value
    &passcode=value
    &custom1=xxyyzz
    &custom2=custom-2
    &custom3=custom-3
```

```node
const url = new URL("https://example.com/postback");
url.searchParams.set("trn", "value");
url.searchParams.set("usercode", "value");
url.searchParams.set("passcode", "value");
url.searchParams.set("custom1", "xxyyzz");
url.searchParams.set("custom2", "custom-2");
url.searchParams.set("custom3", "custom-3");
const response = await fetch(url);
```

```python
from urllib.parse import urlencode
from urllib.request import urlopen

params = {
    "trn": "value",
    "usercode": "value",
    "passcode": "value",
    "custom1": "xxyyzz",
    "custom2": "custom-2",
    "custom3": "custom-3",
}
url = "https://example.com/postback?" + urlencode(params)
response = urlopen(url)
```

```php
// GET https://example.com/postback
$params = [
    "trn" => "value",
    "usercode" => "value",
    "passcode" => "value",
    "custom1" => "xxyyzz",
    "custom2" => "custom-2",
    "custom3" => "custom-3",
];
```

```java
// GET https://example.com/postback
Map<String, String> params = Map.ofEntries(
    Map.entry("trn", "value"),
    Map.entry("usercode", "value"),
    Map.entry("passcode", "value"),
    Map.entry("custom1", "xxyyzz"),
    Map.entry("custom2", "custom-2"),
    Map.entry("custom3", "custom-3")
);
```

## Delete transaction

Delete transaction (called by Verotel server) http:// www.yourwebsite.com/cgi-bin/rumadd.pl?trn=delete&usercode=bob&custom1=cust1&custom2=cust2&custom3=cust3 parameter_name type optional remarks trn const "delete" mandatory usercode a-zA-Z0-9 mandatory 1 to 12 alphanumeric characters (editing allows Verotel Control Center) custom1 string optional up to 100 characters custom2 string optional up to 100 characters custom3 string optional up to 100 characters

`GET`

Your endpoint receives this call.

### Query parameters

- `trn` (string, required)
- `usercode` (string, required)
  1 to 12 alphanumeric characters (editing allows Verotel Control Center)
- `custom1` (string)
  up to 100 characters
- `custom2` (string)
  up to 100 characters
- `custom3` (string)
  up to 100 characters

### Response

#### 200

Expected Response Codes Verotel expects that the VerotelRUM script installed on the merchants website responds with a predefined response code. It is important for the merchant to implement this correctly. Whenever Verotel receives a response other than "APPROVED" it will retry the postback call two more times in 20 minutes time period. If all attempts fail, the Postback call will be marked as failed and corresponding debit transaction automatically refunded. Excessive number of failures may cause the Verotel compliance department to suspend the Verotel account. Content of response Meaning APPROVED on success DECLINED when transaction cannot be successfully completed on merchants side ERROR on technical failure on merchants side

```http
GET https://example.com/postback
    ?trn=value
    &usercode=value
    &custom1=xxyyzz
    &custom2=custom-2
    &custom3=custom-3
```

```node
const url = new URL("https://example.com/postback");
url.searchParams.set("trn", "value");
url.searchParams.set("usercode", "value");
url.searchParams.set("custom1", "xxyyzz");
url.searchParams.set("custom2", "custom-2");
url.searchParams.set("custom3", "custom-3");
const response = await fetch(url);
```

```python
from urllib.parse import urlencode
from urllib.request import urlopen

params = {
    "trn": "value",
    "usercode": "value",
    "custom1": "xxyyzz",
    "custom2": "custom-2",
    "custom3": "custom-3",
}
url = "https://example.com/postback?" + urlencode(params)
response = urlopen(url)
```

```php
// GET https://example.com/postback
$params = [
    "trn" => "value",
    "usercode" => "value",
    "custom1" => "xxyyzz",
    "custom2" => "custom-2",
    "custom3" => "custom-3",
];
```

```java
// GET https://example.com/postback
Map<String, String> params = Map.ofEntries(
    Map.entry("trn", "value"),
    Map.entry("usercode", "value"),
    Map.entry("custom1", "xxyyzz"),
    Map.entry("custom2", "custom-2"),
    Map.entry("custom3", "custom-3")
);
```
