OpenVPN Access Server Web API v0.1
This API is everything a web API needs to implement the functionality of downloading profiles/clients etc and implement the admin interface.
In this document we use the following convention for naming:
- field names - snake case 
- URLs - dashes 
- everything else - camel case 
The API allows proxying requests to different servers of an Access Server cluster. This is only needed for the ADMIN interface.
Please that this API is still in development and stability is not guaranteed. API endpoints and parameters can change without notice.
Also note that while great care has been taken that this API documentation matches the implementation, some differences to the implemented API can exist as well.
Viewing this API documentation in swagger via https://access-server.examples.com/api/docs can be enabled by using setting the configuration variable openapi.web_access to 1 e.g. by using
or setting the variable via the admin UI configuration editor.
For more information about the API of OpenVPN Access Server see also https://openvpn.net/static-links/documentation-access-server-web-api
Base URLs:
- /api 
- https://access-server.example.com/api/ 
sacli --key "openapi.web_access" --value 1 ConfigPut
Authentication
- API Key (AuthToken) - Parameter Name: X-OpenVPN-As-AuthToken, in: header. This is an opaque token that allows using the authenticated method. The token will expire after a certain amount of time unless it is renewed through the renewal API. While we might use a JWT for this, the API consumer should not assume anything about the format or content of this string. JWT with default encryption/authentication appears not to be FIPS compatible. 
 
- API Key (ProfileDownloadToken) - Parameter Name: token, in: query. This is a string-token that can be used to download OpenVPN Connection Profile or installer file. Typically, e.g. for installer download and OpenVPN connection profile download, this token is generated as a token, that can be used only once. 
 
- HTTP Authentication, scheme: basic a basic auth with user and password. This methods uses a fairly non-standard challenge/resposne method if required that is documented under https://github.com/OpenVPN/openvpn3/blob/master/doc/webauth.md#challengeresponse-authentication 
Default
servers__saml_acs
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__saml_metadata
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__saml_redirect
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__openvpn-api_profile
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetInstallerViaToken
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetProfileViaToken
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetAutologin
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetUserlogin
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetGeneric
Responses
| Status | Meaning | Description | Schema | 
|---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
notificationCreate
Body parameter
{
  "notification_type": "CLUSTER_RESTART_PENDING"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » notification_type | body | string | true | the type of notification | 
Enumerated Values
| Parameter | Value | 
|---|---|
| » notification_type | CLUSTER_RESTART_PENDING | 
| » notification_type | NODE_RESTARTED | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | None | |
| 400 | notification creation failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/saml/acs',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/saml/metadata',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/saml/redirect',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/openvpn-api/profile',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/GetInstallerViaToken',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/GetProfileViaToken',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/GetAutologin',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/GetUserlogin',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/GetGeneric',
{
  method: 'SERVERS',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const inputBody = '{
  "notification_type": "CLUSTER_RESTART_PENDING"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/notification/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
auth
APIs directly related to authenticating to the API
authByUserAndPw
Body parameter
{
  "username": "string",
  "password": "string",
  "totp": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » username | body | string | true | The user name for login. Note that if this is case-sensitive or not depends on the OpenVPN Access Server configuration. | 
| » password | body | string | true | The password for login in clear text | 
| » totp | body | string | false | Optional TOTP token for the user when wishing to do all MFA credentials in one go | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | successful auth | ||
| 401 | missing MFA or ask to login via SAML workflow | Inline | |
| 403 | wrong user and/or password or user access denied | ||
| 409 | MFA enrollment is required. The intermediate auth token will be returned. This auth token should be used for enrolllment. | 
Response Schema
Status Code 401
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » MFAChallenge | false | none | none | |
| »» echo | boolean | true | none | If true, the entered code should be displayed in cleartext. Otherwise masked like a password. | 
| »» challenge | string | true | none | The text presented to the user when asking for the challenge. | 
| »» challenge_context | string | true | none | Often authentication backends require the challenge to be answered in the same session as the initial user/password. This allows tying the MFA answer to the initial authentication attempt. | 
This operation does not require authentication
authMFASession
Body parameter
{
  "response": "pa$$word",
  "challenge_context": "FJAIIXMAIOFLGAK23",
  "username": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | true | none | |
| » response | body | string(password) | false | the user’s response to the MFA challenge | 
| » challenge_context | body | string | false | The challenge context that was in the MFAChallenge. | 
| » username | body | string | true | The user name for login | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | successful auth | ||
| 403 | wrong authentication info | 
This operation does not require authentication
authBySAMLAssertion
Body parameter
{
  "assertion": "string",
  "relay_state": "vpnauth~nod1~Dfk3287761d"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | true | none | |
| » assertion | body | string(xml) | true | SAML Assertion in xml format , encoded as base64-string | 
| » relay_state | body | string | false | Optional relay state identifying the type of SAML request. If not passed or empty, defaults to cws | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | successful auth | ||
| 400 | Wrong RelayState parameter or Invalid SAML assertion | ||
| 401 | Invalid authentication assertion request. Returned when status of authentication was not handled or unknown. | ||
| 403 | User access denied or Account configuration problem or no valid SAML configuration or This profile requires web based SAML Authentication. | 
This operation does not require authentication
authRenewToken
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | successful auth | ||
| 401 | the old token has expired and can no longer be renewed | ||
| 403 | Token renewal is no longer allowed. | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
changePasswordLocalUser
Body parameter
{
  "username": "string",
  "new_password": "pa$$word"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Password has changed successfully | Inline | |
| 401 | Login failed | Inline | |
| 403 | Forbidden. Auth token was not recent enough or security criteria of new password not met. | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » detail | string | false | none | none | 
Status Code 401
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » detail | string | false | none | none | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
enrollUserMFA
Body parameter
{
  "token": "string",
  "username": "niccolo@paganini.it"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successfully enrolled. | Inline | |
| 400 | Provided MFA token does not match secret or other error | ||
| 403 | only admin users are allowed to use this API | 
Response Schema
Enumerated Values
| Property | Value | 
|---|---|
| user_type | admin | 
| user_type | user | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "username": "string",
  "password": "string",
  "totp": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json'
};
fetch('/api/auth/login/userpassword',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "user_properties": {
    "requires_mfa_enrollment": true,
    "user_type": "admin",
    "mfa_secret": "string",
    "allowed_profiles": [
      "autologin"
    ],
    "enforce_strong_passwords": true,
    "allow_password_change": true
  },
  "username": "string",
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
const inputBody = '{
  "response": "pa$$word",
  "challenge_context": "FJAIIXMAIOFLGAK23",
  "username": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json'
};
fetch('/api/auth/login/mfaauth',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "user_properties": {
    "requires_mfa_enrollment": true,
    "user_type": "admin",
    "mfa_secret": "string",
    "allowed_profiles": [
      "autologin"
    ],
    "enforce_strong_passwords": true,
    "allow_password_change": true
  },
  "username": "string",
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
const inputBody = '{
  "assertion": "string",
  "relay_state": "vpnauth~nod1~Dfk3287761d"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json'
};
fetch('/api/auth/login/saml-assertion',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "user_properties": {
    "requires_mfa_enrollment": true,
    "user_type": "admin",
    "mfa_secret": "string",
    "allowed_profiles": [
      "autologin"
    ],
    "enforce_strong_passwords": true,
    "allow_password_change": true
  },
  "username": "string",
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/auth/token/renew',
{
  method: 'POST',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
const inputBody = '{
  "username": "string",
  "new_password": "pa$$word"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/auth/password/change',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "detail": "string"
}
const inputBody = '{
  "token": "string",
  "username": "niccolo@paganini.it"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/auth/mfa/enroll',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "user_properties": {
    "requires_mfa_enrollment": true,
    "user_type": "admin",
    "mfa_secret": "string",
    "allowed_profiles": [
      "autologin"
    ],
    "enforce_strong_passwords": true,
    "allow_password_change": true
  },
  "username": "string",
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
client-import-api
The endpoints which are used on OpenVPN Access Server to import profiles into OpenVPN clients
get__GetInstallerViaToken
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Responds with installer file | string | |
| 400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline | |
| 404 | “An error occurred while trying to download OpenVPN Connect from the server. The required client installer file was not found on the server” or another constant error in the case of unhandled error “Failed to download installer” | None | 
get__GetProfileViaToken
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Responds with connection profile file | string | |
| 400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline | 
get__GetAutologin
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Responds with connection profile file | string | |
| 400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline | 
get__GetUserlogin
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Responds with connection profile file | string | |
| 400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline | 
get__GetGeneric
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Responds with connection profile file | string | |
| 400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline | 
const headers = {
  'Accept':'application/octet-stream'
};
fetch('/api/GetInstallerViaToken?token=string&installer_type=win_v3',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'Accept':'application/x-openvpn-profile'
};
fetch('/api/GetProfileViaToken?token=string',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
const headers = {
  'Accept':'application/x-openvpn-profile'
};
fetch('/api/GetAutologin',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
const headers = {
  'Accept':'application/x-openvpn-profile'
};
fetch('/api/GetUserlogin',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
const headers = {
  'Accept':'application/x-openvpn-profile'
};
fetch('/api/GetGeneric',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
profiletoken
APIs that manage the profile token that can be used to generate one time import URLs and are also used as part of the web-based profile import flow
bulktokenurldelete
Body parameter
[ "string" ]
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | array[string] | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 204 | token were successfully deleted | None | |
| 403 | only admin users are allowed to use this API | ||
| 404 | token to be deleted was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '[
  "string"
]';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/token-url/delete',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
profile
APIs that are related to the management of client profiles
head__openvpn-api_profile
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 302 | Redirect to http://server_addres/ page with saml headers in response according to OpenVPN Api spec. | None | 
Response Headers
| Status | Header | Type | Format | Description | 
|---|---|---|---|---|
| 302 | Ovpn-WebAuth | string | Token identifying if Web Auth is used, based on which connect app decides, if to open browser-based import flow | 
This operation does not require authentication
get__openvpn-api_profile
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 302 | Redirect to http://server_addres/login?relay_state=profile | None | 
This operation does not require authentication
getprofilesuser
Body parameter
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "serial",
  "filters": {
    "user": {
      "operation": "substring",
      "value": "vio"
    },
    "serial_number": {
      "value": 400,
      "operation": "less_than"
    },
    "tls_crypt_v2": {
      "value": true
    },
    "last_used": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "not_before": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "not_after": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "comment": {
      "operation": "substring",
      "value": "vio"
    },
    "signing_ca_cn": {
      "operation": "substring",
      "value": "vio"
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  }
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | 
Response Schema
Status Code 200
A list of all or subset of profiles
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array | 
| » profiles | [allOf] | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | none | |
| »»» serial | certificateSerial(int64) | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. | 
| »»» common_name | true | none | The common name of the certificate. | |
| »»» algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
| »»» not_before | string(date-time) | true | none | Earliest time the certificate is valid | 
| »»» not_after | string(date-time) | true | none | Latest time the certificate is valid | 
| »»» self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. | 
| »»» signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. | 
| »»» signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | A profile for a user. | 
| »»» device_id | string,null | false | none | Device ID, only used for server-locked v1 profiles | 
| »»» comment | string,null | false | none | A user-defined comment | 
| »»» profile_type | false | none | none | |
| »»» tls_crypt_v2 | boolean | false | none | This profile uses tls-crypt-v2 | 
| »»» last_used | string,null(date) | false | none | Last date this profile was used (only date is known, there is no more granular resolution) | 
| »»» username | string | false | none | User’s name | 
Enumerated Values
| Property | Value | 
|---|---|
| profile_type | autologin | 
| profile_type | userlogin | 
| profile_type | generic | 
| profile_type | epki-generic | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
generateUserProfile
Body parameter
{
  "user": "niccolo@paganini.it",
  "profile_type": "autologin",
  "tls_crypt_v2": true,
  "comment": "connected from my iPhone",
  "ignore_missing_user": null
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » user | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| » profile_type | body | true | none | |
| » tls_crypt_v2 | body | boolean | false | The client is capable of TLS-Crypt v2 | 
| » comment | body | string | false | A user-defined comment | 
| » ignore_missing_user | body | any | false | if this is flag, which requires admin rights, is set, a profile will be created even if the specified user does not exist. | 
Enumerated Values
| Parameter | Value | 
|---|---|
| » profile_type | autologin | 
| » profile_type | userlogin | 
| » profile_type | generic | 
| » profile_type | epki-generic | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 201 | Profile was successfully generated | string | |
| 403 | profile creation was not permitted | 
Response Headers
| Status | Header | Type | Format | Description | 
|---|---|---|---|---|
| 201 | Content-Disposition | string | none | |
| 201 | VPN-Session-User | string | none | |
| 201 | VPN-Session-Token | string | none | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
generateTokenUrl
Body parameter
{
  "lifetime": 0,
  "usages": 0,
  "profile_type": "autologin",
  "username": "niccolo@paganini.it"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » lifetime | body | integer | false | Optional lifetime in seconds that the token should be valid for. Longer lifetimes than default require admin privileges. | 
| » usages | body | integer | false | Optional number of usages that this token can be used to generate a profile. Defaults to a single use if not provided. Specifying more than more usage requires admin privileges. | 
| » profile_type | body | true | none | |
| » username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | 
Enumerated Values
| Parameter | Value | 
|---|---|
| » profile_type | autologin | 
| » profile_type | userlogin | 
| » profile_type | generic | 
| » profile_type | epki-generic | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Token URL has been successfully generated | string | |
| 400 | Token url was not generated | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
enumerateTokenIds
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | list of all still valid profile token urls | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » profileTokens | false | none | [this represent a (typically one-time) token that can be used to retrieve a profile from Access Server] | |
| »» token | string | false | none | the unique string that identifies the token | 
| »» username | string | false | none | the username this token will generate the profile for | 
| »» expires | string(date-time) | false | none | the token is only valid until this time | 
| »» profile_type | false | none | none | |
| »» usages | integer | false | none | how often this token can be used to retrieve a profile | 
Enumerated Values
| Property | Value | 
|---|---|
| profile_type | autologin | 
| profile_type | userlogin | 
| profile_type | generic | 
| profile_type | epki-generic | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deleteProfileSerial
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| serial | path | true | none | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | profile successfully deleted | Inline | |
| 400 | could not delete the profile | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » message | string | false | none | describes status of deletion | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deleteProfileUser
Body parameter
{
  "users": [
    "niccolo@paganini.it"
  ],
  "filter": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » users | body | [username] | false | users name list to delete connection profiles from. | 
| » filter | body | string | false | will delete all profiles that have the argument as a substring | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | profile successfully deleted | Inline | |
| 400 | User profiles were not deleted | ||
| 404 | User profiles were not found | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » message | string | false | none | describes status of deletion | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deleteProfile
Body parameter
[ "1708464983752887'" ]
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successfully executed. Status for each profile is in the response. | Inline | |
| 400 | could not delete the profile | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » message | any | false | none | describes status of deletion | 
| » response | object | true | none | hash map that maps the requested delete request to a result | 
| »» additionalProperties | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| additionalProperties | {“204”:null,“description”:“profile successfully deleted”} | 
| additionalProperties | {“404”:null,“description”:“profile to be deleted was not found”} | 
| additionalProperties | {“403”:null,“description”:“profile to be deleted is not owned by the user or another error”} | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
fetch('/api/openvpn-api/profile',
{
  method: 'HEAD'
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
fetch('/api/openvpn-api/profile',
{
  method: 'GET'
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const inputBody = '{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "serial",
  "filters": {
    "user": {
      "operation": "substring",
      "value": "vio"
    },
    "serial_number": {
      "value": 400,
      "operation": "less_than"
    },
    "tls_crypt_v2": {
      "value": true
    },
    "last_used": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "not_before": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "not_after": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "comment": {
      "operation": "substring",
      "value": "vio"
    },
    "signing_ca_cn": {
      "operation": "substring",
      "value": "vio"
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  }
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/profiles/list',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "total": 0,
  "profiles": [
    {
      "serial": "1708464983752887'",
      "common_name": "OpenVPN VPN server CA",
      "algorithm": "rsa2048",
      "not_before": "2020-03-27",
      "not_after": "2030-03-26",
      "self_signed": true,
      "signing_ca": "123",
      "signing_ca_cn": "RootCA",
      "device_id": "string",
      "comment": "My toaster running Doom",
      "profile_type": "autologin",
      "tls_crypt_v2": true,
      "last_used": "2019-08-24",
      "username": "string"
    }
  ]
}
const inputBody = '{
  "user": "niccolo@paganini.it",
  "profile_type": "autologin",
  "tls_crypt_v2": true,
  "comment": "connected from my iPhone",
  "ignore_missing_user": null
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/x-openvpn-profile',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/profiles/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const inputBody = '{
  "lifetime": 0,
  "usages": 0,
  "profile_type": "autologin",
  "username": "niccolo@paganini.it"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/token-url',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/token-url/list',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "profileTokens": [
    {
      "token": "a4aL62OFooAjPu4wu6MQCvcmY070hu8B",
      "username": "arne@openvpn.net",
      "expires": "2019-08-24T14:15:22Z",
      "profile_type": "autologin",
      "usages": 1
    }
  ]
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/profiles/delete/{serial}',
{
  method: 'POST',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "string"
}
const inputBody = '{
  "users": [
    "niccolo@paganini.it"
  ],
  "filter": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/profiles/delete-user',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "string"
}
const inputBody = '[
  "1708464983752887'"
]';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/profiles/delete',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": null,
  "response": {
    "21": 204,
    "7127317": 404
  }
}
vpnca
endpoints that manage the CA(s) that is used to sign the VPN server certificate and the client certificates
getVPNCas
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | [allOf] | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | none | |
| »» serial | certificateSerial(int64) | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. | 
| »» common_name | true | none | The common name of the certificate. | |
| »» algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
| »» not_before | string(date-time) | true | none | Earliest time the certificate is valid | 
| »» not_after | string(date-time) | true | none | Latest time the certificate is valid | 
| »» self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. | 
| »» signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. | 
| »» signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | object | false | none | none | 
| »» cert_type | true | none | The type of certificate. | |
| »» client_profiles | integer | true | none | the number of VPN client profiles are issued by this CA. | 
Enumerated Values
| Property | Value | 
|---|---|
| cert_type | ca | 
| cert_type | old_ca | 
| cert_type | cross_ca | 
| cert_type | client | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
addCaGeneration
Body parameter
{
  "algorithm": "secp384r1",
  "common_name": "my shiny new CA"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » algorithm | body | false | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
| » common_name | body | false | The common name of the certificate. | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 201 | New CA has been successfully created | None | |
| 400 | the selected algorithm is not allowed or the common is too long or contains invalid characters or already exists | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
delete_ca_vpn{serial}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | CA has been successfully deleted | None | |
| 400 | the CA has still client certificates or is the only CA | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | The CA to be deleted is not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| serial | path | true | none | |
| delete_clients | query | boolean | false | will force the deletion of the CA (and all client certificates) | 
standard response when there insufficient rights to use an API.
CaSupportedAlgorithms
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | [This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072).] | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/ca/vpn/list',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
[
  {
    "serial": "1708464983752887'",
    "common_name": "OpenVPN VPN server CA",
    "algorithm": "rsa2048",
    "not_before": "2020-03-27",
    "not_after": "2030-03-26",
    "self_signed": true,
    "signing_ca": "123",
    "signing_ca_cn": "RootCA",
    "cert_type": "ca",
    "client_profiles": 0
  }
]
const inputBody = '{
  "algorithm": "secp384r1",
  "common_name": "my shiny new CA"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/ca/vpn/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "config values had errors",
  "detail": {
    "host.name": "Contains invalid character %",
    "server.port": "Must be an integer between 1 and 65335"
  }
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/ca/vpn/{serial}',
{
  method: 'DELETE',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/ca/allowed-algorithms/list',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
[ "rsa2048", "rsa3072", "rsa4096", "ed448", "brainpoolP384r1", "brainpoolP512r1", "secp2256k1", "Ed25519" ]
info
endpoints that allow to query various aspects of the running server and its status
certificateInfo
Body parameter
{
  "certificate": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » certificate | body | false | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | information about the X509 certificate | ||
| 400 | the provided certificate could not be parsed or other problems. | ||
| 403 | only admin users are allowed to use this API | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
checkPrivateKey
Body parameter
{
  "certificate": "string",
  "private_key": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | any | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Can parse both private key and certificate. The content will signal if the private key belongs to the certificate. | Inline | |
| 400 | there was some error parsing the certificate or key | ||
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » status | boolean | false | none | true if the private key matches the certificate | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__certificate_check-against-ca-roots
Body parameter
{
  "certificate": "string",
  "chain": "string",
  "ca_roots": [
    "string"
  ]
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | The certificate has been verified against the provided CA certificate as trusted certificate. The response contains the trust chain that was found. | Inline | |
| 400 | The certificate failed verification. Details are provided in the errorReason. | ||
| 403 | only admin users are allowed to use this API | 
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » certificate | body | true | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
| » chain | body | false | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
| » ca_roots | body | false | a list of CA certificates that should be used as trusted certificate authorities. If left empty AS will use the system certificates root CAs. This are very similar but not always identical to a browser trust store. | 
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » chain | [allOf] | false | none | [Provides more information about a certificate] | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | none | |
| »»» serial | certificateSerial(int64) | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. | 
| »»» common_name | true | none | The common name of the certificate. | |
| »»» algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
| »»» not_before | string(date-time) | true | none | Earliest time the certificate is valid | 
| »»» not_after | string(date-time) | true | none | Latest time the certificate is valid | 
| »»» self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. | 
| »»» signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. | 
| »»» signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
| »»» sha256fp | certificateFingerprint(sha256) | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | 
| »»» subj_alt_names | [string] | false | none | provides a list of the subjectAlternative attributes of the certificate | 
| »»» subject | [string] | false | none | the full subject of the certificate and not only the CN | 
| »»» ca | boolean | false | none | Whether the certificate represents a certificate authority | 
| »»» self_signed | boolean | false | none | the signature of the certificate is valid against its own public key | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__eula
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Provides the current EULA and the status of the user accepting it. | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
serverInterfaces
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| no_loopback | query | boolean | false | optionally for excluding localhost | 
Responses
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | [describes a Linux network interface and the associated primary networks] | |
| » name | any | false | none | the name identifying the interface | 
| » networks | [IPsubNet] | false | none | IP addresses assigned to the interface | 
| »» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet | 
| »» netip | string | false | none | the network IP address. | 
| »» prefix_length | integer | false | none | length of the prefix in CIDR notation | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__server_info
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Information about the running Access Server instance | ||
| 403 | only admin users are allowed to use this API | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__vpn_dco-module
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | DCO Module status | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__helper_status-overview
Body parameter
{
  "names": [
    "vpn.server.cipher"
  ]
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 400 | Something went wrong | ||
| 403 | only admin users are allowed to use this API | 
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » names | body | false | list of configuration items that should be retrieve from the active configuration | 
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » configuration_items | object | false | none | Response from the /config/{activeprofile}/items part of the query | 
| »» total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array | 
| »» items | [allOf] | false | none | [This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.] | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | object | false | none | none | 
| »»»» name | true | none | the configuration value’s key. | |
| »»»» derived_from | true | none | the source that the current values has be derived from. | |
| »»»» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. | 
| »»»» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. | 
| »»»» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»» anonymous | false | none | A configuration value that is expressed as an integer. | |
| »»»»» value | integer | false | none | none | 
| »»»»» default_value | integer | false | none | The default value for the configuration. | 
| »»»»» max_value | integer | false | none | A hint of maximum allowed value | 
| »»»»» min_value | integer | false | none | A hint for minimum allowed value | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»» anonymous | false | none | none | |
| »»»»» value | boolean | false | none | none | 
| »»»»» default_value | boolean | false | none | The default value for the configuration. | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | |
| »»»»» value | string | false | none | the value of this string configuration | 
| »»»»» redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. | 
| »»»»» default_value | string | false | none | The default value for the configuration. | 
| »»»»» allowed_values | [string] | false | none | if present this array has a list of the allowed values | 
| »»»»» type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | |
| »»»»» value | string | false | none | none | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » server_info | false | none | none | |
| »» version | string | false | none | the version number of Access Server | 
| »» build | string | false | none | the build of Access Server. | 
| »» web_version | string | false | none | the build version number of Access Server UI | 
| »» web_override | boolean | false | none | if true the version of the web ui that is used comes from an override-web.zip instead of the bundled version | 
| »» client_version | string | false | none | version of the embedded client package | 
| »» os_distribution | string | false | none | a human readable identifier of the current (Linux) distribution like PRETTY_NAME from /etc/os-release | 
| »» architecture | string | false | none | the CPU architecture | 
| »» cores | integer | false | none | the number of cores visible to the operating system | 
| »» os_hostname | string | false | none | Operating system’s hostname | 
| » dco_module | false | none | none | |
| »» available | boolean | true | none | whether AS detected an installed and working data channel offloading kernel module | 
| »» version | string | true | none | version of the module if available | 
| » eula_status | false | none | none | |
| »» eula_version_as | integer | false | none | The version of the AS EULA | 
| »» eula_web_hash | string(sha256) | false | none | A SHA256 string in hex format without : separators | 
| »» eula_accepted | boolean | false | none | indicates whether the config setting (aui.eula_version) has the same value as eula_version_as | 
Enumerated Values
| Property | Value | 
|---|---|
| derived_from | default | 
| derived_from | local_db | 
| derived_from | cluster_db | 
| derived_from | mysql_standalone_db | 
| derived_from | as_conf | 
| derived_from | environment | 
| derived_from | runtime | 
| derived_from | other | 
| type | custom | 
| type | integer | 
| type | boolean | 
| type | string | 
| category | deprecated | 
| category | removed | 
| category | normal | 
| category | required | 
| category | derived | 
| category | advanced | 
| category | custom | 
| type_hint | ipv4Address | 
| type_hint | ipv6Address | 
| type_hint | ipAddress | 
| type_hint | hostname | 
| type_hint | pemCertificate | 
| type_hint | pemPrivateKey | 
| architecture | arm64 | 
| architecture | amd64 | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "certificate": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/certificate/info',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "serial": "1708464983752887'",
  "common_name": "OpenVPN VPN server CA",
  "algorithm": "rsa2048",
  "not_before": "2020-03-27",
  "not_after": "2030-03-26",
  "self_signed": true,
  "signing_ca": "123",
  "signing_ca_cn": "RootCA",
  "sha256fp": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "subj_alt_names": [
    "DNS:foo.example.com",
    "DNS:www.openvpn.net",
    "IP:1.2.3.4"
  ],
  "subject": [
    "C=US",
    "ST=Maryland",
    "L=Pasadena",
    "O=DevOrg",
    "OU=FreeSoft",
    "OU=non-free soft",
    "CN=rogue software department"
  ],
  "ca": true
}
const inputBody = '{
  "certificate": "string",
  "private_key": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/certificate/check-private-key',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "status": true
}
const inputBody = '{
  "certificate": "string",
  "chain": "string",
  "ca_roots": [
    "string"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/certificate/check-against-ca-roots',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "chain": [
    {
      "serial": "1708464983752887'",
      "common_name": "OpenVPN VPN server CA",
      "algorithm": "rsa2048",
      "not_before": "2020-03-27",
      "not_after": "2030-03-26",
      "self_signed": true,
      "signing_ca": "123",
      "signing_ca_cn": "RootCA",
      "sha256fp": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
      "subj_alt_names": [],
      "subject": [],
      "ca": true
    }
  ]
}
{
  "message": "Insufficient privileges to use this API"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/eula',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "eula": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ...",
  "eula_web": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ...",
  "eula_version_as": 7,
  "eula_web_hash": "36D7D51F474A84A2A30A41BC92CBA5D9D65F756484011D6F58B9D667F8DBBE9C",
  "eula_accepted": true
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/interfaces',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
[
  {
    "name": "eth0",
    "networks": [
      {},
      {},
      {}
    ]
  }
]
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/info',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "version": "2.13.0-internal",
  "build": "18eba991",
  "web_version": "2.12.7-82fda2",
  "web_override": true,
  "client_version": [
    "27"
  ],
  "os_distribution": "Ubuntu 24.04.6 LTS",
  "architecture": "arm64",
  "cores": 0,
  "os_hostname": "access-server-os-hostname"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/vpn/dco-module',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "available": true,
  "version": "0.2.20230323"
}
const inputBody = '{
  "names": [
    "vpn.server.cipher"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/helper/status-overview',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "configuration_items": {
    "total": 0,
    "items": [
      {}
    ]
  },
  "server_info": {
    "version": "2.13.0-internal",
    "build": "18eba991",
    "web_version": "2.12.7-82fda2",
    "web_override": true,
    "client_version": [
      "27"
    ],
    "os_distribution": "Ubuntu 24.04.6 LTS",
    "architecture": "arm64",
    "cores": 0,
    "os_hostname": "access-server-os-hostname"
  },
  "dco_module": {
    "available": true,
    "version": "0.2.20230323"
  },
  "eula_status": {
    "eula_version_as": 7,
    "eula_web_hash": "36D7D51F474A84A2A30A41BC92CBA5D9D65F756484011D6F58B9D667F8DBBE9C",
    "eula_accepted": true
  }
}
{
  "message": "Insufficient privileges to use this API"
}
license
APIs that allow examining and setting licensing of the AS instance
licenseInfo
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | the current status of the access Server licensing | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
checkSubscription
Body parameter
{
  "subscription": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » subscription | body | string | true | The subscription file. This is either a string containing a json object or a base64 encoding of the json object. | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | The result of the subscription test | ||
| 400 | format the license is not detected or other error with license. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
loadSubscription
Body parameter
{
  "subscription": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » subscription | body | string | true | The subscription file. This is either a string containing a json object or a base64 encoding of the json object. | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Subscription has been successfully loaded. | None | |
| 400 | format the license is not detected or other error with license. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deactivateSubscription
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Subscription has been successfully deactivated. | None | |
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
activateFixedLicenseOnline
Body parameter
{
  "license": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » license | body | string | true | The license file | 
format the license is not detected or other error with license.
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Online license has been successfully activated. | None | |
| 400 | format the license is not detected or other error with license. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
activateFixedLicenseOffline
Body parameter
license: string
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » license | body | string | true | The license file | 
format the license is not detected or other error with license.
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Fix license has been successfully activated. | None | |
| 400 | format the license is not detected or other error with license. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
licenseGetMachineId
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | machine id file is returned | string | |
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/info',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "licensing_type": "unlicensed",
  "current_cc": 3,
  "max_cc": 13,
  "fixed_licenses": [
    {
      "expiry": "2019-08-24T14:15:22Z",
      "key": "string",
      "max_cc": 0
    }
  ]
}
const inputBody = '{
  "subscription": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/subscription/test',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "agent_id'": "13014502862141447248",
  "agent_disabled": true,
  "cc_limit": 13,
  "error": "string",
  "fallback_cc'": 2,
  "grace_period": 30,
  "last_successful_update": "2019-08-24T14:15:22Z",
  "total_cc": 0,
  "name": "Test subscription for development",
  "subkey": "ASUYHgkSWvVQFZhJXVdgtEa_AStctYuHirYZeFbZjLvQCWCaViVamXwL_7a289be35f6987c9aec4585c922a740c1b7620d5",
  "billing_id": "tctYuHirYZeFbZjLvQC",
  "next_update": "2019-08-24T14:15:22Z",
  "updates_failed": 0,
  "notes": [
    "Subscription will expire on 1/2/3",
    "Maximum allowed concurrent connections might be limited to 23 by the 'subscription.local_cc_limit' setting"
  ],
  "overdraft": true,
  "server": "asb.sts.openvpn.net",
  "type": "-",
  "state": "SUBSCRIPTION_OK"
}
const inputBody = '{
  "subscription": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/subscription',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/subscription',
{
  method: 'DELETE',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "license": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/fixed-license/online-activation',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "License not found on server"
}
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "license": "string"
}';
const headers = {
  'Content-Type':'multipart/form-data',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/fixed-license/offline-activation',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Fixed license already expired"
}
{
  "message": "Insufficient privileges to use this API"
}
const headers = {
  'Accept':'text/plain',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/license/machine-id',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
"string"
proxy
pseudo endpoint that explains the proxying mechanism to reach other AS backend servers in a clustered OpenVPN Access Server setup.
post__proxy
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 502 | there was some communication problems with the other backend node other than a timeout or the host specified in the X-OpenVPN-AS-Node header is not in the list of backend servers. | ||
| 504 | Proxying to the other node timed out | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| X-OpenVPN-AS-Node | header | string | false | This is an optional header that is used to determine the backend that this request should be redirected to. | 
Detailed descriptions
X-OpenVPN-AS-Node: This is an optional header that is used to determine the backend that this request should be redirected to. Note this value of the name is the name of the node and not the api_endpoint of the node. See the /proxy pseudo endpoint to get a description of this mechanism.
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-AS-Node':'string',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/proxy',
{
  method: 'POST',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
cluster
APIs related to setting, querying status and managing an OpenVPN Access Server cluster
clusterListNodes
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » nodes | object | false | none | holds a dictionary of all the nodes that are part of the cluster | 
| »» additionalProperties | any | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | describes a node in the cluster. The certificate field is the certificate that the node will present on its api_endpoint and that is expected to be used to verify the identity of the node. | |
| »»»» name | string | true | none | the name that uniquely identifies the cluster node [node_name] | 
| »»»» api_endpoint | false | none | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | |
| »»»» certificate_fingerprint | certificateFingerprint(sha256) | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | object | false | none | none | 
| »»»» restart_pending | boolean | false | none | Indicates if a node has a pending restart. | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
rrdnshostname
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | None | |
| 400 | Setting the cluster properties failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
clustergetprops
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » props | object | false | none | holds a dictionary of all props of the cluster | 
| »» additionalProperties | false | none | properties common to all nodes in the cluster. | |
| »»» rr_dns_hostname | string | false | none | the Round-Robin hostname that uniquely identifies the cluster | 
| »»» rr_dns_new_nodes | boolean | false | none | if true, use rr_dns_hostname as node hostname for new nodes joining the cluster | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
clustersetprops
Body parameter
{
  "rr_dns_hostname": "cluster.example.com",
  "rr_dns_new_nodes": true
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » rr_dns_hostname | body | string | false | the Round-Robin hostname that uniquely identifies the cluster | 
| » rr_dns_new_nodes | body | boolean | false | if true, use rr_dns_hostname as node hostname for new nodes joining the cluster | 
Setting the cluster properties failed
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Properties on the cluster node have been successfully set. | None | |
| 400 | Setting the cluster properties failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
clusterset
Body parameter
{
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| node | path | string | true | none | 
| body | body | object | false | none | 
| » api_endpoint | body | false | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | |
| » certificate_fingerprint | body | certificateFingerprint(sha256) | false | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Properties on the cluster node have been successfully set. | None | |
| 400 | Error setting the cluster properties failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__cluster_join
Body parameter
{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "mysqluri": "mysql://user:password@mysql.example.com:3306/"
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | None | |
| 400 | joining the cluster failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
post__cluster_create
Body parameter
{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "mysqluri": "mysql://user:password@mysql.example.com:3306/",
  "rr_dns_hostname": "cluster.example.com",
  "rr_dns_new_nodes": true,
  "rr_update_node": true
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | None | |
| 400 | creating the cluster failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
post__cluster_leave
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation. Leaving the cluster succeeded | None | |
| 400 | leaving the cluster failed | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
put__database_convert
Body parameter
{
  "mysqluri": "mysql://user:password@mysql.example.com:3306/"
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | None | |
| 400 | Converting the database failed. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » mysqluri | body | false | the URI of the mysql server. | 
standard response when there insufficient rights to use an API.
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/nodes/list',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "nodes": {
    "property1": {
      "name": "vienna.example.com",
      "api_endpoint": "https://node1:945",
      "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
      "restart_pending": true
    },
    "property2": {
      "name": "vienna.example.com",
      "api_endpoint": "https://node1:945",
      "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
      "restart_pending": true
    }
  }
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/rr-dns-hostname',
{
  method: 'PUT',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/props',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "props": {
    "property1": {
      "rr_dns_hostname": "cluster.example.com",
      "rr_dns_new_nodes": true
    },
    "property2": {
      "rr_dns_hostname": "cluster.example.com",
      "rr_dns_new_nodes": true
    }
  }
}
const inputBody = '{
  "rr_dns_hostname": "cluster.example.com",
  "rr_dns_new_nodes": true
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/props',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "rr_dns_hostname has invalid characters in it"
}
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/{node}/set',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "invalidchars": {
    "value": {
      "message": "api_endpoint has invalid characters in it"
    }
  }
}
const inputBody = '{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "mysqluri": "mysql://user:password@mysql.example.com:3306/"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/join',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "mysqluri": "mysql://user:password@mysql.example.com:3306/",
  "rr_dns_hostname": "cluster.example.com",
  "rr_dns_new_nodes": true,
  "rr_update_node": true
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/cluster/leave',
{
  method: 'POST',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const inputBody = '{
  "mysqluri": "mysql://user:password@mysql.example.com:3306/"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/database/convert',
{
  method: 'PUT',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
maintenance
APIs used for server maintenance like restarting.
get__support_report
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | The report that is also generated by ‘sacli support’ | string | |
| 403 | only admin users are allowed to use this API | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__server_restart
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Server restart successfully scheduled | None | |
| 400 | Server has some misconfiguration and restart is not scheduled | ||
| 403 | User does not have admin permission | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| restartMode | query | false | none | 
Enumerated Values
| Parameter | Value | 
|---|---|
| restartMode | cold | 
| restartMode | warm | 
| restartMode | dry_run | 
| restartMode | systemctl | 
| restartMode | server_agent | 
serverStatus
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | the server status | ||
| 403 | User does not have admin permission | None | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = {
  'Accept':'text/plain',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/support/report',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
"string"
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/restart',
{
  method: 'POST',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/status',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "last_restarted": "2019-08-24T14:15:22Z",
  "service_status": {
    "property1": {
      "status": "on",
      "error": []
    },
    "property2": {
      "status": "on",
      "error": []
    }
  },
  "auth_module_status": {
    "property1": "on",
    "property2": "on"
  }
}
configurationProfile
API to manage OpenVPN Access Server’s main configuration database
enumerateConfigurationProfileList
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » active_profile | false | none | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. | |
| » profiles | false | none | A list of all configuration profiles on Access Server | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
configurationProfileDelete
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| profile | path | true | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 204 | configuration profile successfully deleted | None | |
| 400 | profile deletion would violate some constraints like deleting the active profile | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | configuration profile to be deleted was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
configurationProfileCreate
Body parameter
{
  "profile": "string",
  "copy_from": "string"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | true | none | 
| » profile | body | true | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. | |
| » copy_from | body | false | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 201 | configuration profile successfully created | None | |
| 400 | profile creation has some problem like using an invalid profile name | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | configuration profile to be copied from was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
validateConfigProfile
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| profile | path | true | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success. No errors in the profile are detected | None | |
| 400 | validation of the profile encountered some problems see the error reason for more details. | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | configuration profile to be validated was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
RunSetActiveProfile
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| profile | path | true | none | |
| restartMode | query | false | none | 
Enumerated Values
| Parameter | Value | 
|---|---|
| restartMode | cold | 
| restartMode | warm | 
| restartMode | dry_run | 
| restartMode | systemctl | 
| restartMode | server_agent | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success. No errors in the profile are detected and the new profile is being set. | None | |
| 400 | validation of the profile encountered some problems or some other error occurred. See error reason for more details. | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | the requested configuration profile was not found. | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
getConfigItems
Body parameter
{
  "names": [
    "vpn.server.cipher"
  ]
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| configurationProfile | path | true | none | |
| body | body | any | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 403 | only admin users are allowed to use this API | ||
| 404 | configuration profile to be listed was not found | 
Response Schema
Status Code 200
A list of all or subset of profiles
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array | 
| » items | [allOf] | false | none | [This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.] | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
| »»» name | true | none | the configuration value’s key. | |
| »»» derived_from | true | none | the source that the current values has be derived from. | |
| »»» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. | 
| »»» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. | 
| »»» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | A configuration value that is expressed as an integer. | |
| »»»» value | integer | false | none | none | 
| »»»» default_value | integer | false | none | The default value for the configuration. | 
| »»»» max_value | integer | false | none | A hint of maximum allowed value | 
| »»»» min_value | integer | false | none | A hint for minimum allowed value | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | none | |
| »»»» value | boolean | false | none | none | 
| »»»» default_value | boolean | false | none | The default value for the configuration. | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | |
| »»»» value | string | false | none | the value of this string configuration | 
| »»»» redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. | 
| »»»» default_value | string | false | none | The default value for the configuration. | 
| »»»» allowed_values | [string] | false | none | if present this array has a list of the allowed values | 
| »»»» type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | |
| »»»» value | string | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| derived_from | default | 
| derived_from | local_db | 
| derived_from | cluster_db | 
| derived_from | mysql_standalone_db | 
| derived_from | as_conf | 
| derived_from | environment | 
| derived_from | runtime | 
| derived_from | other | 
| type | custom | 
| type | integer | 
| type | boolean | 
| type | string | 
| category | deprecated | 
| category | removed | 
| category | normal | 
| category | required | 
| category | derived | 
| category | advanced | 
| category | custom | 
| type_hint | ipv4Address | 
| type_hint | ipv6Address | 
| type_hint | ipAddress | 
| type_hint | hostname | 
| type_hint | pemCertificate | 
| type_hint | pemPrivateKey | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post_config-items{configurationProfile}
Body parameter
{
  "property1": "string",
  "property2": "string"
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Configuration items were successfully updated/set | None | |
| 400 | Configuration value do not have the correct type or another problems occurred. See errorReason for detailed information | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | configuration profile to be changed was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| configurationProfile | path | true | none | |
| body | body | object | true | none | 
| » additionalProperties | body | string | false | none | 
standard response when there insufficient rights to use an API.
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-profile/list',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "active_profile": "default",
  "profiles": [
    "default",
    "heaven",
    "hades",
    "olymp"
  ]
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-profile/{profile}',
{
  method: 'DELETE',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const inputBody = '{
  "profile": "string",
  "copy_from": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-profile',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-profile/{profile}/validate',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-profile/{profile}/set-active',
{
  method: 'POST',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "names": [
    "vpn.server.cipher"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-items/{configurationProfile}/list',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "total": 0,
  "items": [
    {
      "name": "vpn.server.cipher",
      "derived_from": "default",
      "type": "custom",
      "description": "string",
      "category": "deprecated",
      "value": 0,
      "default_value": 0,
      "max_value": 0,
      "min_value": 0
    }
  ]
}
const inputBody = '{
  "property1": "string",
  "property2": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/config-items/{configurationProfile}',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "config values had errors",
  "detail": {
    "host.name": "Contains invalid character %",
    "server.port": "Must be an integer between 1 and 65335"
  }
}
{
  "message": "Insufficient privileges to use this API"
}
saml
API endpoints that are related to SAML based authentication
post__saml_acs
Body parameter
RelayState: string SAMLResponse: string
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | This will return a html page similar to index.html that loads the web site of the application. In the source code it will embed a javascript fragment that contains the assertion as javascript variable SAMLResponse itself and the RelayState as RelayState variable. | None | |
| 400 | Throw validation error if wrong request passed | None | |
| 405 | Only POST for this url is allowed. Throw unsupported error if method is not POST | None | 
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » RelayState | body | string | false | cws, profile or vpnauthnodeidsessionid | 
| » SAMLResponse | body | string(xml string encoded in base64 format) | true | none | 
This will return a html page similar to index.html that loads the web site of the application. In the source code it will embed a javascript fragment that contains the assertion as javascript variable SAMLResponse itself and the RelayState as RelayState variable.
Throw validation error if wrong request passed
Only POST for this url is allowed. Throw unsupported error if method is not POST
Response Schema
This operation does not require authentication
get__saml_metadata
SAML is not configured or invalid configuration
Responses
Response Schema
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__saml_redirect
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 302 | Responds with redirect to Identity Provider url | None | |
| 403 | Errors can be: Wrong RelayState parameter or assertion request is invalid | None | 
This operation does not require authentication
get__auth_get-idp-url
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Identity Provider URL to redirect to | string | |
| 400 | Errors can be: Wrong RelayState parameter or SAML configuration error | 
This operation does not require authentication
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| relay_state | query | string | false | If not set, the cws relay_state is assumed | 
const inputBody = '{
  "RelayState": "string",
  "SAMLResponse": "string"
}';
const headers = {
  'Content-Type':'application/x-www-form-urlencoded',
  'Accept':'text/html'
};
fetch('/api/saml/acs',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
"< <head> <javascript> SAMLResponse = \"[samlassertion data]\"; RelayState = \"cwslogin\"; </javascript> [content of index.html]"
"< <head>HEAD content</head> <body><h1>SAML authentication failed</h1><p>assertion request is invalid</p></body>"
"< <head>HEAD content</head> <body><h1>SAML authentication failed</h1><p>assertion method is not supported</p></body>"
const headers = {
  'Accept':'application/samlmetadata+xml',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/saml/metadata',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
"< <head>HEAD content</head> <body><h1>404 Not Found</h1><p>SAML not configured or invalid configuration</p></body>"
fetch('/api/saml/redirect',
{
  method: 'GET'
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
const headers = {
  'Accept':'string'
};
fetch('/api/auth/get-idp-url',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
vpn
directly related to the connected VPN users
vpnAuthSAMLAssertion
Body parameter
{
  "assertion": "string",
  "relay_state": "vpnauth~nod1~Dfk3287761d"
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Assertion Success | None | |
| 400 | Invalid SAML assertion in the case if empty string was passed as saml assertion | ||
| 401 | Wrong Relay State or other assertion error | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__vpn_status
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Vpn Server status | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » vpn_clients | [allOf] | false | none | List of connected VPN clients | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | none | |
| »»» daemon_id | true | none | an ID that identifies the OpenVPN daemon that the client is connected to | |
| »»» client_id | true | none | the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
| »»» bytes_sent | integer | false | none | number of bytes sent | 
| »»» bytes_received | integer | false | none | number of bytes received | 
| »»» commonname | string | false | none | the common name the client uses in its certificate. | 
| »»» username | string | false | none | username of the client | 
| »»» connected_since | string(date-time) | false | none | time in UTC since when the client is connected. | 
| »»» datachannel_cipher | string | false | none | the data channel cipher that is used with this client. | 
| »»» real_address | string | false | none | the IP address the client is connected from | 
| »»» virtual_ipv4_address | string | false | none | the virtual or VPN address of the client | 
| »»» virtual_ipv6_address | string | false | none | none | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » vpn_daemons | object | false | none | none | 
| »» additionalProperties | false | none | status of a VPN daemon | |
| »»» dco | boolean | false | none | if DCO is used on this daemon instance | 
| »»» version | string | false | none | the OpenVPN 2.x version of the daemon | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
disconnectClient
Body parameter
{
  "reason": "John should not be working after hours",
  "client_reason": "Client disconnected for administrative reasons",
  "users": [
    "niccolo@paganini.it"
  ]
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | any | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | client has been successfully disconnected | None | |
| 400 | One or more of the clients failed to disconnect | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | A client with the specified daemon and client id could not be found. | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "assertion": "string",
  "relay_state": "vpnauth~nod1~Dfk3287761d"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/auth/vpn/vpnsaml',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/vpn/status',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "vpn_clients": [
    {
      "daemon_id": "openvpn_7",
      "client_id": 7,
      "bytes_sent": 0,
      "bytes_received": 0,
      "commonname": "plato_AUTOLOGIN",
      "username": "plato",
      "connected_since": "2019-08-24T14:15:22Z",
      "datachannel_cipher": "ChaCha20-Poly1305",
      "real_address": "1.2.7.8:23123",
      "virtual_ipv4_address": "10.0.0.7",
      "virtual_ipv6_address": "fd00:f00f::b00f"
    }
  ],
  "vpn_daemons": {
    "property1": {
      "dco": true,
      "version": "OpenVPN 2.7_git [git:bloom/520bc001b093857c+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] [DCO] built on Nov 30 2023"
    },
    "property2": {
      "dco": true,
      "version": "OpenVPN 2.7_git [git:bloom/520bc001b093857c+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] [DCO] built on Nov 30 2023"
    }
  }
}
const inputBody = '{
  "reason": "John should not be working after hours",
  "client_reason": "Client disconnected for administrative reasons",
  "users": [
    "niccolo@paganini.it"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/vpn/client/disconnect',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
cws
cws stands for client website. These APIs are the ones that can be used as normal users and do not require admin permission for basic operations. Some have extended functionality that require admin privileges like acting on the behalf of another user.
generateInstallerUrl
Body parameter
{
  "user": "niccolo@paganini.it",
  "installer_type": "win_v3",
  "profile_type": "autologin",
  "tls_crypt_v2": true
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » user | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| » installer_type | body | true | Type of the installer binary that should be created for installation. | |
| » profile_type | body | false | none | |
| » tls_crypt_v2 | body | boolean | false | The client is capable of TLS-Crypt v2 | 
Enumerated Values
| Parameter | Value | 
|---|---|
| » installer_type | win_v3 | 
| » installer_type | mac_v3 | 
| » installer_type | win | 
| » installer_type | mac | 
| » installer_type | ios | 
| » installer_type | android | 
| » installer_type | linux | 
| » profile_type | autologin | 
| » profile_type | userlogin | 
| » profile_type | generic | 
| » profile_type | epki-generic | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Installer URL was successfully generated | string | |
| 400 | “Generation of installer url was not permitted” or “Requested installer is not downloadable” or “An error occurred while trying to download OpenVPN Connect from the server. The required client installer file was not found on the server” | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "user": "niccolo@paganini.it",
  "installer_type": "win_v3",
  "profile_type": "autologin",
  "tls_crypt_v2": true
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/installer-url',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
userprop
APIs that related to retrieving and modifying user properties.
getdefaultuserprops
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
getuserprops
Body parameter
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "admin",
  "filters": {
    "name": {
      "operation": "substring",
      "value": "vio"
    },
    "group": {
      "operation": "substring",
      "value": "vio"
    },
    "admin": {
      "value": true
    },
    "autologin": {
      "value": true
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  },
  "users": [
    "niccolo@paganini.it"
  ],
  "proplist": [
    "string"
  ]
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
A list of all or subset of profiles
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » total | integer | false | none | total number of users that match if pagination is not in effect, this matches the size of the provided array | 
| » profiles | [allOf] | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | |
| »»» name | string | false | none | the name of the user or group. | 
| »»» deny | false | none | This object describes a single user property value. If it is | |
| »»»» value | any | true | none | the value that this property has. If inherited is false, this is identical to inheritedValue | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»» anonymous | string | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»» anonymous | boolean | false | none | none | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»» inherited | boolean | false | none | specifies if this value is inherited from an upper level if this | 
| »»»» inherited_source_type | string | false | none | describes where the inherited values comes. This can be from the default user properties (default) or from a global configuration settings or from a group If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. | 
| »»»» inherited_source_name | string | false | none | for the inherited types where knowing the name of the source can be beneficial. Like the group name or in some cases the configuration key. If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. | 
| »»» deny_web | false | none | This object describes a single user property value. If it is | |
| »»» admin | false | none | This object describes a single user property value. If it is | |
| »»» autologin | false | none | This object describes a single user property value. If it is | |
| »»» auth_method | false | none | This object describes a single user property value. If it is | |
| »»» cc_commands | false | none | This object describes a single user property value. If it is | |
| »»» totp | false | none | This object describes a single user property value. If it is | |
| »»» password_strength | false | none | This object describes a single user property value. If it is | |
| »»» allow_password_change | false | none | This object describes a single user property value. If it is | |
| »»» reroute_gw | false | none | This object describes a single user property value. If it is | |
| »»» allow_generate_profiles | false | none | This object describes a single user property value. If it is | |
| »»» bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. | 
| »»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet | 
| »»»» netip | string | false | none | the network IP address. | 
| »»»» prefix_length | integer | false | none | length of the prefix in CIDR notation | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | this describes the properties that are only allowed on the user level itself are not inheritable from other levels | |
| »»» password_defined | boolean | false | none | This indicates whether the user has a password set. The API will NOT provide the hash of the password but only the information if a user password has been set. | 
| »»» mfa_status | string | false | none | the status of the multi factor authentication. This is a read-only property that combines totp and totp_locked into a single status. | 
| »»» totp_locked | boolean | false | none | specifies if the TOTP for the user is locked/enrolled. If true, secret is no longer viewable | 
| »»» group | string | false | none | the group a user belongs too (conn_group) | 
| »»» static_ipv4 | string | false | none | optional property. Maps to conn_ip | 
| »»» static_ipv6 | string | false | none | optional property. Maps to conn_ip6 | 
| »»» dmz_ip | [DMZIP] | false | none | The IP addresses and port-ranges that are exposed on this client. | 
| »»»» ip | string | true | none | the external IP address of the Access Server | 
| »»»» protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| »»»» start_port | integer | false | none | the starting port for the dmz. If not specified all ports will be forwarded | 
| »»»» end_port | integer | false | none | the end port of the ports that are being forwarded. If not specified only a single port (the start_port) is forwarded. | 
| »»» dmz_ipv6 | [DMZIP] | false | none | The IPv6 addresses and port-ranges that are exposed on this client. | 
| »»» compile | boolean | false | none | If true the type is ‘user_compile’ instead of ‘user_connect’. | 
| »»» totp_secret | string | false | none | the TOTP secret code according to RFC 6238. Note, that this is value might not be present for locked users in later versions (pvt_google_auth_secret). | 
| »»» totp_admin_only | boolean | false | none | totp_admin_only only AS admins can generate and view Google Authenticator secrets (prop_google_auth_admin_locked) | 
| »»» client_to_server_subnets | [IPsubNet] | false | none | < Subnets that are behind the client. I.e. the client will be a router/gateway for the subnets specified in this array. On the server side, this is split into ipv4 and ipv6 subnets (c2s_subnets and c2s_subnets6) but this API represents that as a single list. Use the ipv6 flag of the subnet to determine the address family. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | |
| »»» cli_script_connect_win_user_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_user_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_admin_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_admin_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_user_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_user_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_admin_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_admin_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. | 
| »»»» additionalProperties | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. | 
| »»»» additionalProperties | false | none | This object describes a single user property value. If it is | 
Enumerated Values
| Property | Value | 
|---|---|
| inherited_source_type | default | 
| inherited_source_type | implicit_default | 
| inherited_source_type | group | 
| inherited_source_type | configuration | 
| mfa_status | pending | 
| mfa_status | disabled | 
| mfa_status | enrolled | 
| protocol | tcp | 
| protocol | udp | 
| protocol | icmp | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
createUserPropUser
Body parameter
{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "password_defined": true,
  "mfa_status": "pending",
  "totp_locked": true,
  "group": "stringsection",
  "static_ipv4": "string",
  "static_ipv6": "string",
  "dmz_ip": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "dmz_ipv6": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "compile": true,
  "totp_secret": "string",
  "totp_admin_only": true,
  "client_to_server_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 201 | New User has been successfully created | None | |
| 400 | the user already exists or contains invalid characters or a group of the same name already exists or one of the specified userprop is invalid. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
createUserPropGroup
Body parameter
{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "members": [
    "niccolo@paganini.it",
    "hillary@hahn.us",
    "yoyoma"
  ],
  "member_count": 0,
  "subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "dynamic_ranges": [
    {
      "ipv6": true,
      "first_ip": "fd00::18cc:1b01:a772:50e1",
      "last_ip": "fd00::18cc:1b01:a772:80e1"
    }
  ],
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 201 | New group has been successfully created | None | |
| 400 | the group already exists or contains invalid characters or a user of the same name already exists or one of the properties has an invalid value. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
listAccessLists
Body parameter
{
  "order_by": "internal_prop_representation",
  "filters": {
    "internal_representation": {
      "operation": "substring",
      "value": "vio"
    },
    "groupname": {
      "operation": "substring",
      "value": "vio"
    },
    "username": {
      "operation": "substring",
      "value": "vio"
    },
    "object_type": "user"
  },
  "groups": [
    "string"
  ],
  "users": [
    "niccolo@paganini.it"
  ]
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | |
| » order_by | body | string | false | none | 
| » filters | body | object | false | filters for the access list objects. | 
| »» internal_representation | body | false | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »»» value | body | string | true | none | 
| »»» operation | body | string | true | none | 
| »» groupname | body | false | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» username | body | false | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» object_type | body | string | false | Only return users or groups in the response. | 
| » groups | body | false | a list of groups that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that groups that are not found in the backend will be missing from the response. | |
| » users | body | [username] | false | a list of usernames that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that usernames that are not found in the backend will be missing from the response. | 
Enumerated Values
| Parameter | Value | 
|---|---|
| » order_by | internal_prop_representation | 
| » order_by | name | 
| »»» operation | equal | 
| »»» operation | substring | 
| »»» operation | not_equal | 
| »» object_type | user | 
| »» object_type | group | 
| »» object_type | all | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
A list of all matching access lists
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » profiles | [oneOf] | false | none | [Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. - The user/group require the username/groupname property - the nat and route type require the subnet property. Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class. Either username or groupname is set to indicate whether this is a user or group assigned access rules. ] | 
| »» username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| »» groupname | false | none | a group name that is being in used in user management to specify a group name. | |
| »» access_route | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. - The user/group require the username/groupname property - the nat and route type require the subnet property. Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class. | |
| »»»» type | string | false | none | none | 
| »»»» accept | boolean | false | none | specifies if we accept or deny this particular access | 
| »»»» username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| »»»» groupname | false | none | a group name that is being in used in user management to specify a group name. | |
| »»»» subnet | false | none | The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64 | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»» anonymous | object | false | none | describes an IP subnet. | 
| »»»»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet | 
| »»»»»» netip | string | false | none | the network IP address. | 
| »»»»»» prefix_length | integer | false | none | length of the prefix in CIDR notation | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»» anonymous | object | false | none | none | 
| »»»»»» service | [oneOf] | false | none | [describes an IP UDP/TCP service or an icmp service] | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»»»» anonymous | false | none | Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp | |
| »»»»»»»» protocol | true | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| »»»»»»»» start_port | integer | true | none | The start port of the port range | 
| »»»»»»»» end_port | integer | false | none | The end port of the port range. If not specified, the range will consist of only one single port (start_port) | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»»»» anonymous | false | none | Describes an icmp service type. protocol is always icmp | |
| »»»»»»»» protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| »»»»»»»» type | string | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | null | false | none | indicator that routes of this type should be deleted | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» type | string | false | none | the type of access list this item this is in the user/group. | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
not
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | object | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
not
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | object | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| type | user | 
| type | group | 
| type | route | 
| type | nat | 
| type | all | 
| type | all_vpn_clients | 
| type | all_s2c_subnets | 
| protocol | tcp | 
| protocol | udp | 
| protocol | icmp | 
| protocol | tcp | 
| protocol | udp | 
| protocol | icmp | 
| type | icmp-any | 
| type | icmp-echo-reply | 
| type | icmp-destination-unreachable | 
| type | icmp-network-unreachable | 
| type | icmp-host-unreachable | 
| type | icmp-protocol-unreachable | 
| type | icmp-port-unreachable | 
| type | icmp-fragmentation-needed | 
| type | icmp-source-route-failed | 
| type | icmp-network-unknown | 
| type | icmp-host-unknown | 
| type | icmp-network-prohibited | 
| type | icmp-host-prohibited | 
| type | icmp-TOS-network-unreachable | 
| type | icmp-TOS-host-unreachable | 
| type | icmp-communication-prohibited | 
| type | icmp-host-precedence-violation | 
| type | icmp-precedence-cutoff | 
| type | icmp-source-quench | 
| type | icmp-redirect | 
| type | icmp-network-redirect | 
| type | icmp-host-redirect | 
| type | icmp-TOS-network-redirect | 
| type | icmp-TOS-host-redirect | 
| type | icmp-echo-request | 
| type | icmp-router-advertisement | 
| type | icmp-router-solicitation | 
| type | icmp-time-exceeded | 
| type | icmp-ttl-zero-during-transit | 
| type | icmp-ttl-zero-during-reassembly | 
| type | icmp-parameter-problem | 
| type | icmp-ip-header-bad | 
| type | icmp-required-option-missing | 
| type | icmp-timestamp-request | 
| type | icmp-timestamp-reply | 
| type | icmp-address-mask-request | 
| type | access_from_ipv6 | 
| type | access_from_ipv4 | 
| type | access_to_ipv4 | 
| type | access_to_ipv6 | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
setAccessLists
Body parameter
{
  "items_set": [
    {
      "username": "johann",
      "access_route": {}
    },
    {
      "username": "wolfgang",
      "access_route": null,
      "type": "access_to_ipv4"
    }
  ]
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » items_set | body | array | false | none | 
| »» username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| »» groupname | body | false | a group name that is being in used in user management to specify a group name. | |
| »» access_route | body | any | false | none | 
| »»» anonymous | body | false | Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. | |
| »»»» type | body | string | false | none | 
| »»»» accept | body | boolean | false | specifies if we accept or deny this particular access | 
| »»»» username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| »»»» groupname | body | false | a group name that is being in used in user management to specify a group name. | |
| »»»» subnet | body | false | The definition of the subnet used by the nat and route accessRoute classes. | |
| »»»»» anonymous | body | object | false | describes an IP subnet. | 
| »»»»»» ipv6 | body | boolean | false | whether this describes an IPv4 or an IPv6 subnet | 
| »»»»»» netip | body | string | false | the network IP address. | 
| »»»»»» prefix_length | body | integer | false | length of the prefix in CIDR notation | 
| »»»»» anonymous | body | object | false | none | 
| »»»»»» service | body | [oneOf] | false | [describes an IP UDP/TCP service or an icmp service] | 
| »»»»»»» anonymous | body | false | Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp | |
| »»»»»»»» protocol | body | true | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| »»»»»»»» start_port | body | integer | true | The start port of the port range | 
| »»»»»»»» end_port | body | integer | false | The end port of the port range. If not specified, the range will consist of only one single port (start_port) | 
| »»»»»»» anonymous | body | false | Describes an icmp service type. protocol is always icmp | |
| »»»»»»»» protocol | body | false | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| »»»»»»»» type | body | string | false | none | 
| »»» anonymous | body | null | false | indicator that routes of this type should be deleted | 
| »» type | body | string | false | the type of access list this item this is in the user/group. | 
| »» anonymous | body | object | false | none | 
| »»» anonymous | body | object | false | none | 
| »» anonymous | body | object | false | none | 
| »»» anonymous | body | object | false | none | 
Detailed descriptions
»»» anonymous: Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property.
- The user/group require the username/groupname property 
- the nat and route type require the subnet property. 
Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class.
»»»» subnet: The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges
For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64|https,udp/1194,tcp/1194,udp/2000-2999|R - 10.0.0.7/24:icmp-any,rdp,imaps - 10.0.0.1/25:icmp-TOS-host-redirect
Note that the services array is optional. A missing service array indicates that the whole subnet is affected regardless of the used layer 4 service (icmp, tcp, udp or other IP protocol)
Enumerated Values
| Parameter | Value | 
|---|---|
| »»»» type | user | 
| »»»» type | group | 
| »»»» type | route | 
| »»»» type | nat | 
| »»»» type | all | 
| »»»» type | all_vpn_clients | 
| »»»» type | all_s2c_subnets | 
| »»»»»»»» protocol | tcp | 
| »»»»»»»» protocol | udp | 
| »»»»»»»» protocol | icmp | 
| »»»»»»»» protocol | tcp | 
| »»»»»»»» protocol | udp | 
| »»»»»»»» protocol | icmp | 
| »»»»»»»» type | icmp-any | 
| »»»»»»»» type | icmp-echo-reply | 
| »»»»»»»» type | icmp-destination-unreachable | 
| »»»»»»»» type | icmp-network-unreachable | 
| »»»»»»»» type | icmp-host-unreachable | 
| »»»»»»»» type | icmp-protocol-unreachable | 
| »»»»»»»» type | icmp-port-unreachable | 
| »»»»»»»» type | icmp-fragmentation-needed | 
| »»»»»»»» type | icmp-source-route-failed | 
| »»»»»»»» type | icmp-network-unknown | 
| »»»»»»»» type | icmp-host-unknown | 
| »»»»»»»» type | icmp-network-prohibited | 
| »»»»»»»» type | icmp-host-prohibited | 
| »»»»»»»» type | icmp-TOS-network-unreachable | 
| »»»»»»»» type | icmp-TOS-host-unreachable | 
| »»»»»»»» type | icmp-communication-prohibited | 
| »»»»»»»» type | icmp-host-precedence-violation | 
| »»»»»»»» type | icmp-precedence-cutoff | 
| »»»»»»»» type | icmp-source-quench | 
| »»»»»»»» type | icmp-redirect | 
| »»»»»»»» type | icmp-network-redirect | 
| »»»»»»»» type | icmp-host-redirect | 
| »»»»»»»» type | icmp-TOS-network-redirect | 
| »»»»»»»» type | icmp-TOS-host-redirect | 
| »»»»»»»» type | icmp-echo-request | 
| »»»»»»»» type | icmp-router-advertisement | 
| »»»»»»»» type | icmp-router-solicitation | 
| »»»»»»»» type | icmp-time-exceeded | 
| »»»»»»»» type | icmp-ttl-zero-during-transit | 
| »»»»»»»» type | icmp-ttl-zero-during-reassembly | 
| »»»»»»»» type | icmp-parameter-problem | 
| »»»»»»»» type | icmp-ip-header-bad | 
| »»»»»»»» type | icmp-required-option-missing | 
| »»»»»»»» type | icmp-timestamp-request | 
| »»»»»»»» type | icmp-timestamp-reply | 
| »»»»»»»» type | icmp-address-mask-request | 
| »» type | access_from_ipv6 | 
| »» type | access_from_ipv4 | 
| »» type | access_to_ipv4 | 
| »» type | access_to_ipv6 | 
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | access rules are successfully set | None | |
| 400 | the rules are not formattted corrrectly or the specified user/group does not exist. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__users_delete
Body parameter
{
  "users": [
    "niccolo@paganini.it"
  ]
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 204 | userprop was successfully deleted | None | |
| 400 | invalid request args | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | userprop to be deleted was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » users | body | [username] | false | users name list to delete. | 
standard response when there insufficient rights to use an API.
post__groups_delete
Body parameter
{
  "groups": [
    "string"
  ]
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 204 | userprop was successfully deleted | None | |
| 400 | invalid request args | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | userprop to be deleted was not found | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » groups | body | false | users name list to delete. | 
standard response when there insufficient rights to use an API.
modifyUserPropGroupBulk
Body parameter
"[{ 'name': 'bob', 'auth_method': 'saml'}, {'name': 'bob', 'autologin': false, pw_strength: null }]"
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | array[any] | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | changes to userproperties profile successfully done | None | |
| 400 | user property creation has some problem like using an invalid property name or using wrong type (boolean vs string) or using a property that is not valid on this userproperty (group only attribute on a user or vice versa). Keys in the detailed error response are tuples (user, property). | ||
| 403 | only admin users are allowed to use this API | ||
| 404 | user or group does not exist | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/users/defaultuser',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "name": "string",
  "deny": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "deny_web": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "admin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "autologin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "auth_method": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cc_commands": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "totp": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "password_strength": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_password_change": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "reroute_gw": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_generate_profiles": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "def_deny": true,
  "cli_script_connect_win_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    },
    "property2": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    }
  },
  "group": "stringsection"
}
const inputBody = '{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "admin",
  "filters": {
    "name": {
      "operation": "substring",
      "value": "vio"
    },
    "group": {
      "operation": "substring",
      "value": "vio"
    },
    "admin": {
      "value": true
    },
    "autologin": {
      "value": true
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  },
  "users": [
    "niccolo@paganini.it"
  ],
  "proplist": [
    "string"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/users/list',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "total": 0,
  "profiles": [
    {
      "name": "string",
      "deny": {},
      "deny_web": {},
      "admin": {},
      "autologin": {},
      "auth_method": {},
      "cc_commands": {},
      "totp": {},
      "password_strength": {},
      "allow_password_change": {},
      "reroute_gw": {},
      "allow_generate_profiles": {},
      "bypass_subnets": [],
      "password_defined": true,
      "mfa_status": "pending",
      "totp_locked": true,
      "group": "stringsection",
      "static_ipv4": "string",
      "static_ipv6": "string",
      "dmz_ip": [],
      "dmz_ipv6": [],
      "compile": true,
      "totp_secret": "string",
      "totp_admin_only": true,
      "client_to_server_subnets": [],
      "cli_script_connect_win_user_connect": {},
      "cli_script_connect_win_user_disconnect": {},
      "cli_script_connect_win_admin_connect": {},
      "cli_script_connect_win_admin_disconnect": {},
      "cli_script_connect_mac_user_connect": {},
      "cli_script_connect_mac_user_disconnect": {},
      "cli_script_connect_mac_admin_connect": {},
      "cli_script_connect_mac_admin_disconnect": {},
      "cli_script_connect_win_env": {},
      "cli_script_connect_mac_env": {}
    }
  ]
}
const inputBody = '{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "password_defined": true,
  "mfa_status": "pending",
  "totp_locked": true,
  "group": "stringsection",
  "static_ipv4": "string",
  "static_ipv6": "string",
  "dmz_ip": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "dmz_ipv6": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "compile": true,
  "totp_secret": "string",
  "totp_admin_only": true,
  "client_to_server_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/users/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "config values had errors",
  "detail": {
    "host.name": "Contains invalid character %",
    "server.port": "Must be an integer between 1 and 65335"
  }
}
const inputBody = '{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "members": [
    "niccolo@paganini.it",
    "hillary@hahn.us",
    "yoyoma"
  ],
  "member_count": 0,
  "subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "dynamic_ranges": [
    {
      "ipv6": true,
      "first_ip": "fd00::18cc:1b01:a772:50e1",
      "last_ip": "fd00::18cc:1b01:a772:80e1"
    }
  ],
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/groups/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "config values had errors",
  "detail": {
    "host.name": "Contains invalid character %",
    "server.port": "Must be an integer between 1 and 65335"
  }
}
const inputBody = '{
  "order_by": "internal_prop_representation",
  "filters": {
    "internal_representation": {
      "operation": "substring",
      "value": "vio"
    },
    "groupname": {
      "operation": "substring",
      "value": "vio"
    },
    "username": {
      "operation": "substring",
      "value": "vio"
    },
    "object_type": "user"
  },
  "groups": [
    "string"
  ],
  "users": [
    "niccolo@paganini.it"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/userprop/access/list',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "items_set": [
    {
      "username": "johann",
      "access_route": {}
    },
    {
      "username": "wolfgang",
      "access_route": null,
      "type": "access_to_ipv4"
    }
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/userprop/access/set',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "users": [
    "niccolo@paganini.it"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/users/delete',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '{
  "groups": [
    "string"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/groups/delete',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = '[{ 'name': 'bob', 'auth_method': 'saml'}, {'name': 'bob', 'autologin': false, pw_strength: null }]';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/userprop/set',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "reason": "config values had errors",
  "detail": {
    "host.name": "Contains invalid character %",
    "server.port": "Must be an integer between 1 and 65335"
  }
}
helper
various API function which functionality could be achieved purely on the frontend or with a combination of various backend calls but are provided to make these tasks easier or to not have a second implementation purely on the frontend (like parsing SAML metadata).
post__helper_get-saml-configuration
Body parameter
{
  "data": "string",
  "url": "http://example.com"
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 400 | Something went wrong parsing the data or fetching the metadata | ||
| 403 | only admin users are allowed to use this API | 
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » data | body | string | false | The string that contains SAML Idp metadata in xml format | 
| » url | body | string(uri) | false | the url from which the backend will fetch SAML Idp metadata from | 
| » anonymous | body | object | false | none | 
| » anonymous | body | object | false | none | 
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » configuration_items | [allOf] | false | none | [This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.] | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
| »»» name | true | none | the configuration value’s key. | |
| »»» derived_from | true | none | the source that the current values has be derived from. | |
| »»» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. | 
| »»» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. | 
| »»» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | A configuration value that is expressed as an integer. | |
| »»»» value | integer | false | none | none | 
| »»»» default_value | integer | false | none | The default value for the configuration. | 
| »»»» max_value | integer | false | none | A hint of maximum allowed value | 
| »»»» min_value | integer | false | none | A hint for minimum allowed value | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | none | |
| »»»» value | boolean | false | none | none | 
| »»»» default_value | boolean | false | none | The default value for the configuration. | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | |
| »»»» value | string | false | none | the value of this string configuration | 
| »»»» redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. | 
| »»»» default_value | string | false | none | The default value for the configuration. | 
| »»»» allowed_values | [string] | false | none | if present this array has a list of the allowed values | 
| »»»» type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | |
| »»»» value | string | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| derived_from | default | 
| derived_from | local_db | 
| derived_from | cluster_db | 
| derived_from | mysql_standalone_db | 
| derived_from | as_conf | 
| derived_from | environment | 
| derived_from | runtime | 
| derived_from | other | 
| type | custom | 
| type | integer | 
| type | boolean | 
| type | string | 
| category | deprecated | 
| category | removed | 
| category | normal | 
| category | required | 
| category | derived | 
| category | advanced | 
| category | custom | 
| type_hint | ipv4Address | 
| type_hint | ipv6Address | 
| type_hint | ipAddress | 
| type_hint | hostname | 
| type_hint | pemCertificate | 
| type_hint | pemPrivateKey | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "data": "string",
  "url": "http://example.com"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/helper/get-saml-configuration',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "configuration_items": [
    {
      "name": "vpn.server.cipher",
      "derived_from": "default",
      "type": "custom",
      "description": "string",
      "category": "deprecated",
      "value": 0,
      "default_value": 0,
      "max_value": 0,
      "min_value": 0
    }
  ]
}
{
  "message": "Insufficient privileges to use this API"
}
certificate
APIs related to certificate management like parsing a certificate or querying information about a certificate
post__certificate_create
Body parameter
{
  "algorithm": "secp384r1",
  "common_name": "my shiny new CA",
  "cert_template": "spcert",
  "days_to_expiry": 365,
  "private_key_passphrase": "string",
  "signing_ca": "string",
  "subj_alt_dns_names": [
    "vpn-server.example.com"
  ],
  "signing_ca_key": "string",
  "signing_ca_config_key": null,
  "signing_ca_private_key_passphrase": "string"
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Certificate has been generated. | Inline | |
| 400 | there was some error while trying to generate the certificate | ||
| 403 | only admin users are allowed to use this API | 
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » certificate | false | none | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
| » private_key | pemEncodedPrivateKey(pem) | false | none | An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—– | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "algorithm": "secp384r1",
  "common_name": "my shiny new CA",
  "cert_template": "spcert",
  "days_to_expiry": 365,
  "private_key_passphrase": "string",
  "signing_ca": "string",
  "subj_alt_dns_names": [
    "vpn-server.example.com"
  ],
  "signing_ca_key": "string",
  "signing_ca_config_key": null,
  "signing_ca_private_key_passphrase": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/certificate/create',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "certificate": "string",
  "private_key": "string"
}
{
  "message": "Insufficient privileges to use this API"
}
logs
Querying the log database of OpenVPN Access Server
getLogReports
Body parameter
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "node",
  "filters": {
    "start_time": {
      "start_relative": "20d",
      "end_relative": "15d 20m"
    },
    "timestamp": {
      "start_relative": "20d",
      "end_relative": "15d 20m"
    },
    "duration": {
      "value": "20d",
      "operation": "less_than"
    },
    "node": {
      "operation": "substring",
      "value": "vio"
    },
    "username": {
      "operation": "substring",
      "value": "vio"
    },
    "active": {
      "value": true
    },
    "error": {
      "value": true
    },
    "service": {
      "operation": "substring",
      "value": "vio"
    },
    "virtual_ipv4_address": {
      "operation": "substring",
      "value": "vio"
    },
    "bytes_sent": {
      "value": "20kb",
      "operation": "less_than"
    },
    "bytes_received": {
      "value": "20kb",
      "operation": "less_than"
    },
    "gui_version": {
      "operation": "substring",
      "value": "vio"
    },
    "version": {
      "operation": "substring",
      "value": "vio"
    },
    "platform": {
      "operation": "substring",
      "value": "vio"
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  }
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | log reports entries | Inline | |
| 400 | format of the filters is not valid | ||
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » records | false | none | none | |
| »» timestamp | string(date-time) | true | none | record modification timestamp | 
| »» node | any | true | none | AS node that created the log report | 
| »» username | any | false | none | username that created the entry | 
| »» start_time | any | false | none | start time of the event or just time of the event if duration is missing | 
| »» duration | any | false | none | duration of the event in seconds | 
| »» service | string | false | none | the service of OpenVPN Access Server that created the event | 
| »» active | boolean | false | none | if the session is still active | 
| »» auth | boolean | false | none | whether authentication succeeded or not | 
| »» platform | any | false | none | the platform of the client. | 
| »» version | any | false | none | the version of the OpenVPN component that implement the OpenVPN protocol | 
| »» proto | string,null | false | none | the protocol being used | 
| »» gui_version | any | false | none | the IV_GUI version the client reported. | 
| »» real_address | string | false | none | the IP address the client is connected from | 
| »» server_port | integer | false | none | the server side port the client connects/connected to | 
| »» virtual_ipv4_address | string | false | none | the virtual or VPN address of the client | 
| »» virtual_ipv6_address | string | false | none | none | 
| »» session_id | string | false | none | internal session ID of the connection (this might be truncated) | 
| »» api_method | string | false | none | description of the API method that was called | 
| »» bytes_sent | integer | false | none | number of bytes sent | 
| »» bytes_received | integer | false | none | number of bytes received | 
| »» total_bytes | integer | false | none | total number of transferred bytes. (This seems and probably is redundant but currently we keep this as individual record in the backend database) | 
| »» error | string | false | none | error message on auth failure | 
| »» extra | string | false | none | service-specific data | 
| » total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array | 
Enumerated Values
| Property | Value | 
|---|---|
| proto | tcp | 
| proto | udp | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "node",
  "filters": {
    "start_time": {
      "start_relative": "20d",
      "end_relative": "15d 20m"
    },
    "timestamp": {
      "start_relative": "20d",
      "end_relative": "15d 20m"
    },
    "duration": {
      "value": "20d",
      "operation": "less_than"
    },
    "node": {
      "operation": "substring",
      "value": "vio"
    },
    "username": {
      "operation": "substring",
      "value": "vio"
    },
    "active": {
      "value": true
    },
    "error": {
      "value": true
    },
    "service": {
      "operation": "substring",
      "value": "vio"
    },
    "virtual_ipv4_address": {
      "operation": "substring",
      "value": "vio"
    },
    "bytes_sent": {
      "value": "20kb",
      "operation": "less_than"
    },
    "bytes_received": {
      "value": "20kb",
      "operation": "less_than"
    },
    "gui_version": {
      "operation": "substring",
      "value": "vio"
    },
    "version": {
      "operation": "substring",
      "value": "vio"
    },
    "platform": {
      "operation": "substring",
      "value": "vio"
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  }
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/log/reports',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "records": [
    {
      "timestamp": "2019-08-24T14:15:22Z",
      "node": "vpn-12.example.com",
      "username": null,
      "start_time": null,
      "duration": null,
      "service": "WEB_ADMIN",
      "active": true,
      "auth": true,
      "platform": "android",
      "version": "2.6.11",
      "proto": "tcp",
      "gui_version": "de.blinkt.openvpn_0.7.48",
      "real_address": "1.2.7.8:23123",
      "server_port": 1194,
      "virtual_ipv4_address": "10.0.0.7",
      "virtual_ipv6_address": "fd00:f00f::b00f",
      "session_id": "gOB8vpI1MEr0vBnm",
      "api_method": "ConfigQuery",
      "bytes_sent": 0,
      "bytes_received": 0,
      "total_bytes": 0,
      "error": "LOCKOUT: user temporarily locked out due to multiple authentication failures",
      "extra": "string"
    }
  ],
  "total": 0
}
user
Userprop APIs that apply to managing users
post__userprop_mfa_generate-secret
Body parameter
{
  "username": "niccolo@paganini.it",
  "reset_secret": true,
  "locked": true
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Operation successfully finished. | Inline | |
| 403 | only admin users are allowed to use this API | ||
| 404 | user not found | None | 
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| » reset_secret | body | boolean | false | When set to false, a user that already has a token, the function will not generate a new secret. If not present, reset_secret is assumed to be false. | 
| » locked | body | boolean | false | When reset_locked is set to true, this will be set the newed locked status | 
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » totp_secret | string | false | none | the RFC 6238 TOTP secret to allow enrollment of the user. | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "username": "niccolo@paganini.it",
  "reset_secret": true,
  "locked": true
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/userprop/mfa/generate-secret',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "totp_secret": "string"
}
{
  "message": "Insufficient privileges to use this API"
}
group
Userprop APIs that apply to managing groups
getgroupuserprops
Body parameter
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "name",
  "filters": {
    "name": {
      "operation": "substring",
      "value": "vio"
    },
    "admin": {
      "value": true
    },
    "autologin": {
      "value": true
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  },
  "enumerate_members": true,
  "groups": [
    "string"
  ],
  "proplist": [
    "string"
  ]
}
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | false | none | 
standard response when there insufficient rights to use an API.
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Success | Inline | |
| 400 | Some of the arguments are incorrect | ||
| 403 | only admin users are allowed to use this API | 
Response Schema
Status Code 200
A list of all or subset of profiles
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » total | integer | false | none | total number of users that match if pagination is not in effect, this matches the size of the provided array | 
| » profiles | [allOf] | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | |
| »»» name | string | false | none | the name of the user or group. | 
| »»» deny | false | none | This object describes a single user property value. If it is | |
| »»»» value | any | true | none | the value that this property has. If inherited is false, this is identical to inheritedValue | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»» anonymous | string | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»»» anonymous | boolean | false | none | none | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »»»» inherited | boolean | false | none | specifies if this value is inherited from an upper level if this | 
| »»»» inherited_source_type | string | false | none | describes where the inherited values comes. This can be from the default user properties (default) or from a global configuration settings or from a group If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. | 
| »»»» inherited_source_name | string | false | none | for the inherited types where knowing the name of the source can be beneficial. Like the group name or in some cases the configuration key. If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. | 
| »»» deny_web | false | none | This object describes a single user property value. If it is | |
| »»» admin | false | none | This object describes a single user property value. If it is | |
| »»» autologin | false | none | This object describes a single user property value. If it is | |
| »»» auth_method | false | none | This object describes a single user property value. If it is | |
| »»» cc_commands | false | none | This object describes a single user property value. If it is | |
| »»» totp | false | none | This object describes a single user property value. If it is | |
| »»» password_strength | false | none | This object describes a single user property value. If it is | |
| »»» allow_password_change | false | none | This object describes a single user property value. If it is | |
| »»» reroute_gw | false | none | This object describes a single user property value. If it is | |
| »»» allow_generate_profiles | false | none | This object describes a single user property value. If it is | |
| »»» bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. | 
| »»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet | 
| »»»» netip | string | false | none | the network IP address. | 
| »»»» prefix_length | integer | false | none | length of the prefix in CIDR notation | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | this describes properties that are only are present for groups and not for users | |
| »»» members | [string] | false | none | list of all users that are members of this group. This property will be only be present if members of the group are enumerate_memberate is true in the groupRequestParameters | 
| »»» member_count | integer | false | none | the number of users that belong to this group. | 
| »»» subnets | [IPsubNet] | false | none | The subnets assigned to this group. This list will be a mixed list of IPv4 and IPv6 subnets. The backend userprops are group_subnets and group_subnets6 | 
| »»» dynamic_ranges | false | none | The dynamic ranges assigned to this group. This list will contain both IPv4 and IPv6 ranges. The backend userprops for this property are group_range and group_range6. | |
| »»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 range | 
| »»»» first_ip | string | false | none | the start address of the IP range. | 
| »»»» last_ip | string | false | none | the end address of the IP range. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | |
| »»» cli_script_connect_win_user_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_user_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_admin_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_admin_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_user_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_user_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_admin_connect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_admin_disconnect | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. | 
| »»»» additionalProperties | false | none | This object describes a single user property value. If it is | |
| »»» cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. | 
| »»»» additionalProperties | false | none | This object describes a single user property value. If it is | 
Enumerated Values
| Property | Value | 
|---|---|
| inherited_source_type | default | 
| inherited_source_type | implicit_default | 
| inherited_source_type | group | 
| inherited_source_type | configuration | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "name",
  "filters": {
    "name": {
      "operation": "substring",
      "value": "vio"
    },
    "admin": {
      "value": true
    },
    "autologin": {
      "value": true
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  },
  "enumerate_members": true,
  "groups": [
    "string"
  ],
  "proplist": [
    "string"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/groups/list',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "message": "Insufficient privileges to use this API"
}
{
  "total": 0,
  "profiles": [
    {
      "name": "string",
      "deny": {},
      "deny_web": {},
      "admin": {},
      "autologin": {},
      "auth_method": {},
      "cc_commands": {},
      "totp": {},
      "password_strength": {},
      "allow_password_change": {},
      "reroute_gw": {},
      "allow_generate_profiles": {},
      "bypass_subnets": [],
      "members": [],
      "member_count": 0,
      "subnets": [],
      "dynamic_ranges": [],
      "cli_script_connect_win_user_connect": {},
      "cli_script_connect_win_user_disconnect": {},
      "cli_script_connect_win_admin_connect": {},
      "cli_script_connect_win_admin_disconnect": {},
      "cli_script_connect_mac_user_connect": {},
      "cli_script_connect_mac_user_disconnect": {},
      "cli_script_connect_mac_admin_connect": {},
      "cli_script_connect_mac_admin_disconnect": {},
      "cli_script_connect_win_env": {},
      "cli_script_connect_mac_env": {}
    }
  ]
}
misc
APIs that do not fit in any other category
get_server_config
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
getCWSconfig
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Successful operation | 
This operation does not require authentication
const headers = {
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/config',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "control_channel_security": "none",
  "installers": [
    "win_v3"
  ],
  "hide_profiles_page": true,
  "password_min_len": 0,
  "disable_open_in_app": true,
  "admin_port": 0,
  "shared_origin": true
}
const headers = {
  'Accept':'application/json'
};
fetch('/api/ui/config',
{
  method: 'GET',
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "header_image": "string",
  "hide_footer": "string",
  "enabled_auth_methods": [
    "saml",
    "userandpassword"
  ],
  "login_text": "Enter your TOTP Authentication code."
}
maintainance
post__server_failover-test
Body parameter
{
  "failover.mode": "ucarp",
  "ucarp.addr": "192.168.188.254",
  "ucarp.secret": "sharedsecret",
  "dbpush.hosts.0.enable": "true",
  "dbpush.hosts.0.public": "grace.hopper",
  "dbpush.hosts.0.internal": "PRIMARY",
  "dbpush.hosts.0.username": "root",
  "dbpush.hosts.1.enable": "true",
  "dbpush.hosts.1.public": "ada.lovelace",
  "dbpush.hosts.1.internal": "SECONDARY",
  "dbpush.hosts.1.username": "root",
  "dbpush.hosts.1.password": "",
  "dbpush.hosts.1.ssh_port": "22"
}
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Results of the failoover test. | ||
| 400 | Failover test initialisation failed. | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | object | false | none | 
| » additionalProperties | body | string | false | none | 
standard response when there insufficient rights to use an API.
post__server_failover-init
Body parameter
null
Responses
| Status | Meaning | Description | Schema | 
|---|---|---|---|
| 200 | Secondary node setup was successful. | None | |
| 400 | Something went wrong during secondary node setup | ||
| 403 | only admin users are allowed to use this API | 
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
| Name | In | Type | Required | Description | 
|---|---|---|---|---|
| body | body | any | false | none | 
standard response when there insufficient rights to use an API.
const inputBody = '{
  "failover.mode": "ucarp",
  "ucarp.addr": "192.168.188.254",
  "ucarp.secret": "sharedsecret",
  "dbpush.hosts.0.enable": "true",
  "dbpush.hosts.0.public": "grace.hopper",
  "dbpush.hosts.0.internal": "PRIMARY",
  "dbpush.hosts.0.username": "root",
  "dbpush.hosts.1.enable": "true",
  "dbpush.hosts.1.public": "ada.lovelace",
  "dbpush.hosts.1.internal": "SECONDARY",
  "dbpush.hosts.1.username": "root",
  "dbpush.hosts.1.password": "",
  "dbpush.hosts.1.ssh_port": "22"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/failover-test',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "ucarp": {
    "friendly": "string",
    "status": true,
    "message": "string"
  },
  "license_primary": {
    "friendly": "string",
    "status": true,
    "message": "string"
  },
  "license_secondary": {
    "friendly": "string",
    "status": true,
    "message": "string"
  },
  "connectivity": {
    "friendly": "string",
    "status": true,
    "message": "string"
  }
}
{
  "message": "Insufficient privileges to use this API"
}
const inputBody = 'null';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'X-OpenVPN-As-AuthToken':'API_KEY'
};
fetch('/api/server/failover-init',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "message": "Insufficient privileges to use this API"
}
Schemas
WebsiteConfig
Provides the information about the website personality and other web-site wide configuration that must be available without authentication
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| header_image | string,null | false | none | An URI to an alternative header image that is customised. If not present use default logo | 
| hide_footer | string,null | false | none | If true then hide footer | 
| enabled_auth_methods | [string] | true | none | A list of enabled authentication methods. UI should only offer enabled methods. These are NOT the backend methods but rather the ways of providing credentials regardless of the backend authentication method. The userandpasswordwithmfa method will provide the user with username, password and TOTP field for the login to make allow entering both factors in one step instead of two. | 
| login_text | string,null | false | none | Alternative login text. | 
profileType
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | autologin | 
| anonymous | userlogin | 
| anonymous | generic | 
| anonymous | epki-generic | 
username
a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | 
groupname
a group name that is being in used in user management to specify a group name.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | a group name that is being in used in user management to specify a group name. | 
installerType
Type of the installer binary that should be created for installation.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | Type of the installer binary that should be created for installation. | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | win_v3 | 
| anonymous | mac_v3 | 
| anonymous | win | 
| anonymous | mac | 
| anonymous | ios | 
| anonymous | android | 
| anonymous | linux | 
certProfileSorting
specifies by which attribute profiles should be sorted
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | specifies by which attribute profiles should be sorted | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | serial | 
| anonymous | username | 
| anonymous | not_before | 
| anonymous | type | 
| anonymous | not_after | 
| anonymous | tls_crypt_v2 | 
| anonymous | last_used | 
| anonymous | algorithm | 
userSorting
specifies by which attribute profiles should be sorted
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | specifies by which attribute profiles should be sorted | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | admin | 
| anonymous | name | 
| anonymous | autologin | 
| anonymous | group | 
groupSorting
specifies by which attribute groups should be sorted
Properties
None
logDBSortingFields
Enum representing valid sorting fields for LogDB.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | Enum representing valid sorting fields for LogDB. | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | node | 
| anonymous | username | 
| anonymous | service | 
| anonymous | duration | 
| anonymous | active | 
| anonymous | virtual_ipv4_address | 
| anonymous | bytes_received | 
| anonymous | bytes_sent | 
| anonymous | timestamp | 
| anonymous | error | 
| anonymous | version | 
| anonymous | gui_version | 
| anonymous | platform | 
sortingDirection
The direction of sorting
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | The direction of sorting | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | asc | 
| anonymous | desc | 
UserCertProfile
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | A profile for a user. | 
| » device_id | string,null | false | none | Device ID, only used for server-locked v1 profiles | 
| » comment | string,null | false | none | A user-defined comment | 
| » profile_type | false | none | none | |
| » tls_crypt_v2 | boolean | false | none | This profile uses tls-crypt-v2 | 
| » last_used | string,null(date) | false | none | Last date this profile was used (only date is known, there is no more granular resolution) | 
| » username | string | false | none | User’s name | 
usertype
type of the user
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | type of the user | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | admin | 
| anonymous | user | 
userproperties
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| requires_mfa_enrollment | boolean | true | none | if present, this user needs to finish MFA enrollment | 
| user_type | false | none | type of the user | |
| mfa_secret | string | false | none | This is an optional field that is only visible if the user has not enrolled yet or is an admin user. | 
| allowed_profiles | false | none | A list of profiles types allowed for the user. Sorted by preference. | |
| enforce_strong_passwords | boolean | false | none | If true, than checking for strong password is required. | 
| allow_password_change | boolean | false | none | Indicates whether password change is allowed for the user. | 
MFAChallenge
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| echo | boolean | true | none | If true, the entered code should be displayed in cleartext. Otherwise masked like a password. | 
| challenge | string | true | none | The text presented to the user when asking for the challenge. | 
| challenge_context | string | true | none | Often authentication backends require the challenge to be answered in the same session as the initial user/password. This allows tying the MFA answer to the initial authentication attempt. | 
MFAResponse
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| response | string(password) | false | none | the user’s response to the MFA challenge | 
| challenge_context | string | false | none | The challenge context that was in the MFAChallenge. | 
| username | string | true | none | The user name for login | 
certificateSerial
A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string(int64) | false | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. | 
certificateCommonName
The common name of the certificate.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string,null | false | none | The common name of the certificate. | 
userAndPwLogin
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| username | string | true | none | The user name for login. Note that if this is case-sensitive or not depends on the OpenVPN Access Server configuration. | 
| password | string | true | none | The password for login in clear text | 
| totp | string | false | none | Optional TOTP token for the user when wishing to do all MFA credentials in one go | 
samlLogin
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| assertion | string(xml) | true | none | SAML Assertion in xml format , encoded as base64-string | 
| relay_state | string | false | none | Optional relay state identifying the type of SAML request. If not passed or empty, defaults to cws | 
loginResponse
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » user_properties | false | none | none | |
| » username | string | true | none | username of the authenticated user | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
authTokenResponse
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| auth_token | string | true | none | An opaque token that is used to access protected APIs | 
| expires_after | string(%a %b %d %Y %-H:%-M:%-S GMT%z (%Z)) | true | none | date in UTC when token expires | 
| renewable_until | string(%a %b %d %Y %-H:%-M:%-S GMT%z (%Z)) | true | none | date in UTC when the token is no longer renewable | 
profileDeleteCode
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | integer | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | {“204”:null,“description”:“profile successfully deleted”} | 
| anonymous | {“404”:null,“description”:“profile to be deleted was not found”} | 
| anonymous | {“403”:null,“description”:“profile to be deleted is not owned by the user or another error”} | 
clientReason
the reason given to the client why it is being disconnected.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | the reason given to the client why it is being disconnected. | 
adminReason
The reason that will be logged why a client was disconnected
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | The reason that will be logged why a client was disconnected | 
vpnConnectionID
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| daemon_id | true | none | an ID that identifies the OpenVPN daemon that the client is connected to | |
| client_id | true | none | the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client. | 
errorReason
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| reason | string | true | none | a user-friendly message of reason of API failure, allowed to be displayed | 
| title | string | false | none | a title describing the error message | 
errorReasonDetail
an errorReason that has been extended to provide specific errors for specific fields. The references are dependent on the fields used in the query. E.g. when setting configuration keys the detail keys are the fields trying to be set.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » detail | object | false | none | errorReasons that specify the errorReason for a specific sub object | 
| »» additionalProperties | false | none | none | 
configurationProfile
This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. | 
certificateAlgorithm
This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072).
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | 
certificateType
The type of certificate.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | The type of certificate. | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | ca | 
| anonymous | old_ca | 
| anonymous | cross_ca | 
| anonymous | client | 
certificateDetails
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| serial | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. | |
| common_name | true | none | The common name of the certificate. | |
| algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
| not_before | string(date-time) | true | none | Earliest time the certificate is valid | 
| not_after | string(date-time) | true | none | Latest time the certificate is valid | 
| self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. | 
| signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. | 
| signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. | 
certificateInformationDetails
Provides more information about a certificate
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » sha256fp | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | |
| » subj_alt_names | [string] | false | none | provides a list of the subjectAlternative attributes of the certificate | 
| » subject | [string] | false | none | the full subject of the certificate and not only the CN | 
| » ca | boolean | false | none | Whether the certificate represents a certificate authority | 
| » self_signed | boolean | false | none | the signature of the certificate is valid against its own public key | 
certificateAuthorityDetails
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » cert_type | true | none | The type of certificate. | |
| » client_profiles | integer | true | none | the number of VPN client profiles are issued by this CA. | 
certificateCreateRequest
A request to generate a certificate and sign it. If the signing_ca and its private key are provided (via signing_ca_key OR signing_ca_config_key) the generated certificate will signed by the CA, otherwise the certificate will be self-signed.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » cert_template | string | true | none | the template to use when creating the certificate. This mainly controls the key usage (KU) and extend key usage (EKU) attributes of the certificate | 
| » days_to_expiry | integer | false | none | number of days while certificate is considered valid | 
| » private_key_passphrase | string | false | none | passhprase for the certificate’s private key | 
| » signing_ca | false | none | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
| » subj_alt_dns_names | [string] | false | none | a list of DNS names that should be added as SubjectAlternativeName DNSJake in the certificate if the cert_template is webserver. | 
| » signing_ca_key | false | none | An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—– | |
| » signing_ca_config_key | any | false | none | the name of a configuration key (e.g. cs.priv.key) that will be used to check the certificate validity | 
| » signing_ca_private_key_passphrase | string | false | none | passhprase for signing CA’s private key | 
Enumerated Values
| Property | Value | 
|---|---|
| cert_template | spcert | 
| cert_template | ca | 
| cert_template | intermediate_ca | 
| cert_template | webserver | 
| cert_template | server | 
| cert_template | client | 
| cert_template | hybrid | 
certificateRequest
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| algorithm | false | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
| common_name | false | none | The common name of the certificate. | 
integerConfigurationValue
A configuration value that is expressed as an integer.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | integer | false | none | none | 
| default_value | integer | false | none | The default value for the configuration. | 
| max_value | integer | false | none | A hint of maximum allowed value | 
| min_value | integer | false | none | A hint for minimum allowed value | 
stringConfigurationValue
A configuration value that is expressed as a string. Either value or redacted_value is present
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | string | false | none | the value of this string configuration | 
| redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. | 
| default_value | string | false | none | The default value for the configuration. | 
| allowed_values | [string] | false | none | if present this array has a list of the allowed values | 
| type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type | 
Enumerated Values
| Property | Value | 
|---|---|
| type_hint | ipv4Address | 
| type_hint | ipv6Address | 
| type_hint | ipAddress | 
| type_hint | hostname | 
| type_hint | pemCertificate | 
| type_hint | pemPrivateKey | 
booleanConfigurationValue
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | boolean | false | none | none | 
| default_value | boolean | false | none | The default value for the configuration. | 
customConfigurationValue
This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | string | false | none | none | 
configurationValueSource
the source that the current values has be derived from.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | the source that the current values has be derived from. | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | default | 
| anonymous | local_db | 
| anonymous | cluster_db | 
| anonymous | mysql_standalone_db | 
| anonymous | as_conf | 
| anonymous | environment | 
| anonymous | runtime | 
| anonymous | other | 
configurationItemKey
the configuration value’s key.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | the configuration value’s key. | 
configurationItem
This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » name | true | none | the configuration value’s key. | |
| » derived_from | true | none | the source that the current values has be derived from. | |
| » type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. | 
| » description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. | 
| » category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | A configuration value that is expressed as an integer. | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | 
Enumerated Values
| Property | Value | 
|---|---|
| type | custom | 
| type | integer | 
| type | boolean | 
| type | string | 
| category | deprecated | 
| category | removed | 
| category | normal | 
| category | required | 
| category | derived | 
| category | advanced | 
| category | custom | 
pemEncodedCertificate
An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—–
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string(pem) | false | none | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | 
pemEncodedPrivateKey
An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—–
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string(pem) | false | none | An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—– | 
certificateFingerprint
The SHA256 hash of the certificate body, also known as the fingerprint of the certificate.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string(sha256) | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | 
apiEndpoint
the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | 
restartMode
the requested mode to restart AS. - Warm will only restart the internal services that are needed to be restarted - cold will restart OpenVPN Access Server completely - systemctl instruct OpenVPN Access Server to initiate a restart via systemd/systemctl - server_agent instruct OpenVPN Access Server to initiate a full reinit of the server agent, including re-reading the configuration in as.conf. If we don’t need to re-read the configuration from a new DB URI (e.g. after converting the DB or creating a cluster) - ‘cold’ should generally be enough, as it will revalidate the individual services’ need to reinit, based on the information in the DB being used at that moment.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | the requested mode to restart AS. - Warm will only restart the internal services that are needed to be restarted - cold will restart OpenVPN Access Server completely - systemctl instruct OpenVPN Access Server to initiate a restart via systemd/systemctl - server_agent instruct OpenVPN Access Server to initiate a full reinit of the server agent, including re-reading the configuration in as.conf. If we don’t need to re-read the configuration from a new DB URI (e.g. after converting the DB or creating a cluster) - ‘cold’ should generally be enough, as it will revalidate the individual services’ need to reinit, based on the information in the DB being used at that moment. | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | cold | 
| anonymous | warm | 
| anonymous | dry_run | 
| anonymous | systemctl | 
| anonymous | server_agent | 
connectedVPNClient
a connected VPN client with the current information about this client
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » bytes_sent | integer | false | none | number of bytes sent | 
| » bytes_received | integer | false | none | number of bytes received | 
| » commonname | string | false | none | the common name the client uses in its certificate. | 
| » username | string | false | none | username of the client | 
| » connected_since | string(date-time) | false | none | time in UTC since when the client is connected. | 
| » datachannel_cipher | string | false | none | the data channel cipher that is used with this client. | 
| » real_address | string | false | none | the IP address the client is connected from | 
| » virtual_ipv4_address | string | false | none | the virtual or VPN address of the client | 
| » virtual_ipv6_address | string | false | none | none | 
clientID
the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | integer | false | none | the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client. | 
daemonID
an ID that identifies the OpenVPN daemon that the client is connected to
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | an ID that identifies the OpenVPN daemon that the client is connected to | 
vpnDaemonStatus
status of a VPN daemon
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| dco | boolean | false | none | if DCO is used on this daemon instance | 
| version | string | false | none | the OpenVPN 2.x version of the daemon | 
dcoModuleStatus
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| available | boolean | true | none | whether AS detected an installed and working data channel offloading kernel module | 
| version | string | true | none | version of the module if available | 
logDBRecord
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| timestamp | string(date-time) | true | none | record modification timestamp | 
| node | any | true | none | AS node that created the log report | 
| username | any | false | none | username that created the entry | 
| start_time | any | false | none | start time of the event or just time of the event if duration is missing | 
| duration | any | false | none | duration of the event in seconds | 
| service | string | false | none | the service of OpenVPN Access Server that created the event | 
| active | boolean | false | none | if the session is still active | 
| auth | boolean | false | none | whether authentication succeeded or not | 
| platform | any | false | none | the platform of the client. | 
| version | any | false | none | the version of the OpenVPN component that implement the OpenVPN protocol | 
| proto | string,null | false | none | the protocol being used | 
| gui_version | any | false | none | the IV_GUI version the client reported. | 
| real_address | string | false | none | the IP address the client is connected from | 
| server_port | integer | false | none | the server side port the client connects/connected to | 
| virtual_ipv4_address | string | false | none | the virtual or VPN address of the client | 
| virtual_ipv6_address | string | false | none | none | 
| session_id | string | false | none | internal session ID of the connection (this might be truncated) | 
| api_method | string | false | none | description of the API method that was called | 
| bytes_sent | integer | false | none | number of bytes sent | 
| bytes_received | integer | false | none | number of bytes received | 
| total_bytes | integer | false | none | total number of transferred bytes. (This seems and probably is redundant but currently we keep this as individual record in the backend database) | 
| error | string | false | none | error message on auth failure | 
| extra | string | false | none | service-specific data | 
Enumerated Values
| Property | Value | 
|---|---|
| proto | tcp | 
| proto | udp | 
licenseInfo
fields that are common to licensing options and the licensing method that currently in. Will also contain additional fields depending on the licensing_type in use.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » licensing_type | string | false | none | the method that Access Server is licensed | 
| » current_cc | integer | false | none | the number of current concurrent connections | 
| » max_cc | integer | false | none | the maximum amount of connections that this license allows to use. For license types are single node (aws, fixed, unlicensed) this is also the limit for all connections. For shared licenses (subscription) this denotes the total number of connections in the subscription and the current number of allocated connection for an Access Server is denoted in cc_limit. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | describes the current licensing information about OpenVPN Access Server. An OpenVPN Access Server can have multiple fixed licenses assigned to it and allowed connections of all the valid (not expired) licenses are summed up. | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | (dummy) information when AS is not currently licensed | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| licensing_type | unlicensed | 
| licensing_type | subscription | 
| licensing_type | awstiered | 
| licensing_type | fixed | 
unlicensedInfo
(dummy) information when AS is not currently licensed
Properties
None
fixedLicenseInfo
describes the current licensing information about OpenVPN Access Server. An OpenVPN Access Server can have multiple fixed licenses assigned to it and allowed connections of all the valid (not expired) licenses are summed up.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| fixed_licenses | [object] | false | none | none | 
| » expiry | string(date-time) | false | none | expiry date of the license. | 
| » key | string | false | none | the key of the fixed license | 
| » max_cc | integer | false | none | maximum amount of connection for this fixed license. | 
awsTieredLicenseInfo
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| region | string | false | none | the AWS region | 
| product_code | string | false | none | the AWS product code that identifies this license | 
| instance_id | string | false | none | the AWS instance ID | 
subscriptionInfo
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| agent_id’ | string | false | none | the identifier the client uses to connect to STS | 
| agent_disabled | boolean | false | none | none | 
| cc_limit | integer | false | none | the limit of connection assigned to the Access Server. This can dynamically change. | 
| error | string,null | false | none | if an error occurred this will be set to a human-readable error message | 
| fallback_cc’ | integer | false | none | the amount of connection that the subscription will revert to if the subscription server cannot be reached for an extended time (grace_period) | 
| grace_period | integer | false | none | number of days after which the subscription will revert to fallback_cc amount of connections | 
| last_successful_update | string(date-time) | false | none | the last time the subscription was successfully updated | 
| total_cc | integer | false | none | the total number of current connections for the subscription over all Access Server that use this subscription. Basically the current_cc of all OpenVPN Access Server using this subscription summed up. | 
| name | string | false | none | A name given to the subscription. | 
| subkey | string | false | none | The subkey that uniquely identifies the subscription on the backend. | 
| billing_id | string | false | none | An opaque identifier that allows identifying the subscription on the billing portal. | 
| next_update | string(date-time) | false | none | when the next update to the subscription server is scheduled | 
| updates_failed | integer | false | none | the number of updates that failed since the last successful update. | 
| notes | [string] | false | none | both server generated and locally generated additional notes to display to the user | 
| overdraft | boolean | false | none | Subscription is currently in overdraft mode | 
| server | string | false | none | the server that is used to for subscription tracking | 
| type | string | false | none | Type of the subscription as reported by the STS server | 
| state | string | false | none | the current state of the subscription agent | 
Enumerated Values
| Property | Value | 
|---|---|
| state | SUBSCRIPTION_OK | 
| state | SUBSCRIPTION_EXPIRED | 
| state | NOT_CONFIGURED | 
| state | AGENT_DISABLED | 
| state | SUBSCRIPTION_INVALID | 
| state | SUBSCRIPTION_ENDED | 
| state | SUBSCRIPTION_PAUSED | 
| state | STSTRACK_ERROR | 
| state | REQUEST_ERROR | 
profileToken
this represent a (typically one-time) token that can be used to retrieve a profile from Access Server
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| token | string | false | none | the unique string that identifies the token | 
| username | string | false | none | the username this token will generate the profile for | 
| expires | string(date-time) | false | none | the token is only valid until this time | 
| profile_type | false | none | none | |
| usages | integer | false | none | how often this token can be used to retrieve a profile | 
userPropUser
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | this describes the properties that are only allowed on the user level itself are not inheritable from other levels | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | 
userPropUserSet
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | this describes the properties that are only allowed on the user level itself are not inheritable from other levels | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | The same as userPropScripts schema. With the diffirence that it is used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. | 
userPropGroup
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | this describes properties that are only are present for groups and not for users | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | 
userPropGroupSet
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | this describes properties that are only are present for groups and not for users | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | The same as userPropScripts schema. With the diffirence that it is used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. | 
userPropUserDefault
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | this describes properties that are only are present for groups and not for users | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » group | string | false | none | the group a user belongs too (conn_group) | 
userPropUserDefaultSet
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | this describes properties that are only are present for groups and not for users | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » group | string | false | none | the group a user belongs too (conn_group) | 
defaultUserOnlyProps
this describes properties that are only are present for groups and not for users
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| def_deny | boolean | false | none | If this is set to true user accounts will not be created if they are not listed in userprop. Normally, if an external auth is used (e.g. LDAP), then a user will automatically create if the external authentication system indicates a successful login. | 
groupLevelOnlyProps
this describes properties that are only are present for groups and not for users
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| members | [string] | false | none | list of all users that are members of this group. This property will be only be present if members of the group are enumerate_memberate is true in the groupRequestParameters | 
| member_count | integer | false | none | the number of users that belong to this group. | 
| subnets | [IPsubNet] | false | none | The subnets assigned to this group. This list will be a mixed list of IPv4 and IPv6 subnets. The backend userprops are group_subnets and group_subnets6 | 
| dynamic_ranges | false | none | The dynamic ranges assigned to this group. This list will contain both IPv4 and IPv6 ranges. The backend userprops for this property are group_range and group_range6. | 
userLevelOnlyProps
this describes the properties that are only allowed on the user level itself are not inheritable from other levels
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| password_defined | boolean | false | none | This indicates whether the user has a password set. The API will NOT provide the hash of the password but only the information if a user password has been set. | 
| mfa_status | string | false | none | the status of the multi factor authentication. This is a read-only property that combines totp and totp_locked into a single status. | 
| totp_locked | boolean | false | none | specifies if the TOTP for the user is locked/enrolled. If true, secret is no longer viewable | 
| group | string | false | none | the group a user belongs too (conn_group) | 
| static_ipv4 | string | false | none | optional property. Maps to conn_ip | 
| static_ipv6 | string | false | none | optional property. Maps to conn_ip6 | 
| dmz_ip | [DMZIP] | false | none | The IP addresses and port-ranges that are exposed on this client. | 
| dmz_ipv6 | [DMZIP] | false | none | The IPv6 addresses and port-ranges that are exposed on this client. | 
| compile | boolean | false | none | If true the type is ‘user_compile’ instead of ‘user_connect’. | 
| totp_secret | string | false | none | the TOTP secret code according to RFC 6238. Note, that this is value might not be present for locked users in later versions (pvt_google_auth_secret). | 
| totp_admin_only | boolean | false | none | totp_admin_only only AS admins can generate and view Google Authenticator secrets (prop_google_auth_admin_locked) | 
| client_to_server_subnets | [IPsubNet] | false | none | < Subnets that are behind the client. I.e. the client will be a router/gateway for the subnets specified in this array. On the server side, this is split into ipv4 and ipv6 subnets (c2s_subnets and c2s_subnets6) but this API represents that as a single list. Use the ipv6 flag of the subnet to determine the address family. | 
Enumerated Values
| Property | Value | 
|---|---|
| mfa_status | pending | 
| mfa_status | disabled | 
| mfa_status | enrolled | 
userPropValue
This object describes a single user property value. If it is
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object,null | false | none | This object describes a single user property value. If it is | 
| value | any | true | none | the value that this property has. If inherited is false, this is identical to inheritedValue | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | string | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | boolean | false | none | none | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| inherited | boolean | false | none | specifies if this value is inherited from an upper level if this | 
| inherited_source_type | string | false | none | describes where the inherited values comes. This can be from the default user properties (default) or from a global configuration settings or from a group If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. | 
| inherited_source_name | string | false | none | for the inherited types where knowing the name of the source can be beneficial. Like the group name or in some cases the configuration key. If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. | 
Enumerated Values
| Property | Value | 
|---|---|
| inherited_source_type | default | 
| inherited_source_type | implicit_default | 
| inherited_source_type | group | 
| inherited_source_type | configuration | 
userProp
This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions.
- deny (boolean): If true cannot connect or login (prop_deny) 
- deny_web (boolean): If true cannot login to web (prop_deny_web) 
- compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) 
- admin (boolean): user is admin (prop_superuser) 
- autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) 
- auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. 
- cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) 
- totp: specifies whether TOTP based MFA is required (prop_google_auth) 
- password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) 
- allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). 
- reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) 
- allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles 
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| name | string | false | none | the name of the user or group. | 
| deny | false | none | This object describes a single user property value. If it is | |
| deny_web | false | none | This object describes a single user property value. If it is | |
| admin | false | none | This object describes a single user property value. If it is | |
| autologin | false | none | This object describes a single user property value. If it is | |
| auth_method | false | none | This object describes a single user property value. If it is | |
| cc_commands | false | none | This object describes a single user property value. If it is | |
| totp | false | none | This object describes a single user property value. If it is | |
| password_strength | false | none | This object describes a single user property value. If it is | |
| allow_password_change | false | none | This object describes a single user property value. If it is | |
| reroute_gw | false | none | This object describes a single user property value. If it is | |
| allow_generate_profiles | false | none | This object describes a single user property value. If it is | |
| bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. | 
userPropSet
The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| name | string | false | none | the name of the user or group. | 
| deny | boolean | false | none | none | 
| deny_web | boolean | false | none | none | 
| admin | boolean | false | none | none | 
| autologin | boolean | false | none | none | 
| auth_method | string | false | none | none | 
| cc_commands | string | false | none | none | 
| totp | boolean | false | none | none | 
| password_strength | boolean | false | none | none | 
| allow_password_change | boolean | false | none | none | 
| reroute_gw | boolean | false | none | none | 
| allow_generate_profiles | boolean | false | none | none | 
| bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. | 
userPropScripts
This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions.
- Client side scripting: prop_cli.script.<win|mac|all>.<user|admin>.<connect|disconnect> 
- Client script env: prop_cli.script_env.win|prop_cli.script_env.mac” 
example environment variable: “prop_cli.script_env.win.MSI_URL”: “https://secure.openvpn.net/tmp/bogi.msi”,
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| cli_script_connect_win_user_connect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_win_user_disconnect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_win_admin_connect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_win_admin_disconnect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_mac_user_connect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_mac_user_disconnect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_mac_admin_connect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_mac_admin_disconnect | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. | 
| » additionalProperties | false | none | This object describes a single user property value. If it is | |
| cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. | 
| » additionalProperties | false | none | This object describes a single user property value. If it is | 
userPropScriptsSet
The same as userPropScripts schema. With the diffirence that it is used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| cli_script_connect_win_user_connect | string | false | none | none | 
| cli_script_connect_win_user_disconnect | string | false | none | none | 
| cli_script_connect_win_admin_connect | string | false | none | none | 
| cli_script_connect_win_admin_disconnect | string | false | none | none | 
| cli_script_connect_mac_user_connect | string | false | none | none | 
| cli_script_connect_mac_user_disconnect | string | false | none | none | 
| cli_script_connect_mac_admin_connect | string | false | none | none | 
| cli_script_connect_mac_admin_disconnect | string | false | none | none | 
| cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. | 
| » additionalProperties | string | false | none | none | 
| cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. | 
| » additionalProperties | string | false | none | none | 
serviceStatusEnum
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | on | 
| anonymous | disabled | 
| anonymous | error | 
| anonymous | enabled | 
serviceWarning
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| tag | string | false | none | A tag assigned to the type of warning/error message | 
| message | string | false | none | A short summary of the warning in question | 
| description | any | false | none | A longer more detailed description of the warning | 
| severity | string | false | none | The level of the warning. The level error signals a hard error that prevents Access Server from starting and ok signal | 
Enumerated Values
| Property | Value | 
|---|---|
| severity | ok | 
| severity | info | 
| severity | warning | 
| severity | critical | 
| severity | error | 
serviceStatus
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| status | false | none | none | |
| error | false | none | a list of important error message/warnings that impact current operation | 
serverStatus
retrieve the status of the internal services of the server.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| last_restarted | string(date-time) | false | none | the last time the server was restarted | 
| service_status | object | false | none | an object containing the status of the various internal services. The key name holds the name of the service. | 
| » additionalProperties | false | none | none | |
| auth_module_status | object | false | none | an object containing the status of the various authentication services. The key name holds the name of the service. | 
| » additionalProperties | false | none | none | 
serverInterface
describes a Linux network interface and the associated primary networks
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| name | any | false | none | the name identifying the interface | 
| networks | [IPsubNet] | false | none | IP addresses assigned to the interface | 
serverConfig
Describes global settings for AS server available to any authenticated users..
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| control_channel_security | true | none | none | |
| installers | true | none | [Type of the installer binary that should be created for installation.] | |
| hide_profiles_page | boolean | false | none | If True, the Connections profile page is hidden | 
| password_min_len | integer | true | none | Minimal length for the password if strength check is enabled. | 
| disable_open_in_app | boolean | true | none | If True then disable in app on UI | 
| admin_port | integer | true | none | port for Admin site | 
| shared_origin | boolean | true | none | CWS and Admin ui are both available on same origin (protocol + hostname + port) as this API endpoint being called. | 
controlChannelSecurity
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | none | 
| anonymous | tls-auth | 
| anonymous | tls-crypt | 
| anonymous | tls-crypt-v2 | 
serverInfo
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| version | string | false | none | the version number of Access Server | 
| build | string | false | none | the build of Access Server. | 
| web_version | string | false | none | the build version number of Access Server UI | 
| web_override | boolean | false | none | if true the version of the web ui that is used comes from an override-web.zip instead of the bundled version | 
| client_version | string | false | none | version of the embedded client package | 
| os_distribution | string | false | none | a human readable identifier of the current (Linux) distribution like PRETTY_NAME from /etc/os-release | 
| architecture | string | false | none | the CPU architecture | 
| cores | integer | false | none | the number of cores visible to the operating system | 
| os_hostname | string | false | none | Operating system’s hostname | 
Enumerated Values
| Property | Value | 
|---|---|
| architecture | arm64 | 
| architecture | amd64 | 
eulaStatus
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| eula_version_as | integer | false | none | The version of the AS EULA | 
| eula_web_hash | string(sha256) | false | none | A SHA256 string in hex format without : separators | 
| eula_accepted | boolean | false | none | indicates whether the config setting (aui.eula_version) has the same value as eula_version_as | 
notificationMessage
notification msg stored in notificationdb
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| notification_type | string | true | none | the type of notification | 
Enumerated Values
| Property | Value | 
|---|---|
| notification_type | CLUSTER_RESTART_PENDING | 
| notification_type | NODE_RESTARTED | 
clusterProps
properties common to all nodes in the cluster.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| rr_dns_hostname | string | false | none | the Round-Robin hostname that uniquely identifies the cluster | 
| rr_dns_new_nodes | boolean | false | none | if true, use rr_dns_hostname as node hostname for new nodes joining the cluster | 
clusterNode
describes a node in the cluster. The certificate field is the certificate that the node will present on its api_endpoint and that is expected to be used to verify the identity of the node.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| name | string | true | none | the name that uniquely identifies the cluster node [node_name] | 
| api_endpoint | false | none | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | |
| certificate_fingerprint | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | 
clusterNodeJoinRequest
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | describes a node in the cluster. The certificate field is the certificate that the node will present on its api_endpoint and that is expected to be used to verify the identity of the node. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » mysqluri | false | none | the URI of the mysql server. | 
clusterNodeCreateRequest
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | none | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | properties common to all nodes in the cluster. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » rr_update_node | boolean | false | none | if true: update host.name in confdb_local to rr_dns_hostname in clusterdb when creating the cluster. if false: do not use rr_dns_hostname to update host.name in confdb_local, at cluster creation time. This is to provide admin the flexibility to update host.name to rr_dns_hostname at a later stage than cluster creation. | 
mysqluri
the URI of the mysql server.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | the URI of the mysql server. | 
profileRequest
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| user | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| profile_type | true | none | none | |
| tls_crypt_v2 | boolean | false | none | The client is capable of TLS-Crypt v2 | 
| comment | string | false | none | A user-defined comment | 
| ignore_missing_user | any | false | none | if this is flag, which requires admin rights, is set, a profile will be created even if the specified user does not exist. | 
installerProfileRequest
Fields for request to get installer download url
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| user | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| installer_type | true | none | Type of the installer binary that should be created for installation. | |
| profile_type | false | none | none | |
| tls_crypt_v2 | boolean | false | none | The client is capable of TLS-Crypt v2 | 
commonPaginationParameters
the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| page_size | integer | false | none | number of the profiles that are returned | 
| offset | integer | false | none | offset for pagination | 
| sort_by | false | none | The direction of sorting | 
profileRequestParameters
This specifies the filters and parameters for the request of the user profiles.
Note, that some of the search fields do not have indices on the backend database and might be slow.
Using the user filter with anything than the own username will cause an error for non-admin users.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » order_by | false | none | specifies by which attribute profiles should be sorted | |
| » filters | object | false | none | none | 
| »» user | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» serial_number | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» tls_crypt_v2 | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
| »» last_used | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). | |
| »» not_before | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). | |
| »» not_after | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). | |
| »» comment | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» signing_ca_cn | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» anywhere | false | none | This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches. | 
userRequestParameters
This indicates the filters that can be used for a requesting user parameters. If more than one filter is specified, the items returned must match all of the filters. The anywhere filter is special and can be only used alone.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » order_by | false | none | specifies by which attribute profiles should be sorted | |
| » filters | any | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
| »»» name | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »»» group | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | filters that can be applied to both user and group requests | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » users | [username] | false | none | a list of usernames that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that usernames that are not found in the backend will be missing from the response. | 
| » proplist | false | none | A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned. | 
commonUserGroupFilters
filters that can be applied to both user and group requests
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| admin | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
| autologin | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
| anywhere | false | none | This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches. | 
tokenRequestParameters
parameters to be used when creating a new token-url. For non-admin usage only the profile type should be specified as setting most other parameters to values higher than default will cause errors.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| lifetime | integer | false | none | Optional lifetime in seconds that the token should be valid for. Longer lifetimes than default require admin privileges. | 
| usages | integer | false | none | Optional number of usages that this token can be used to generate a profile. Defaults to a single use if not provided. Specifying more than more usage requires admin privileges. | 
| profile_type | true | none | none | |
| username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | 
logDBRequestParameters
This specifies the filters and parameters for the request of the log database requests. Note, that this currently only includes the fields that were considered necessary of logDBRecord and that some search might not have indices in the database and might be slow.
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » order_by | false | none | Enum representing valid sorting fields for LogDB. | |
| » filters | object | false | none | none | 
| »» start_time | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). Same with relative time for start and end. | |
| »» timestamp | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). Same with relative time for start and end. | |
| »» duration | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» node | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» username | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» active | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
| »» error | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
| »» service | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» virtual_ipv4_address | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» bytes_sent | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» bytes_received | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» gui_version | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» version | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» platform | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| »» anywhere | false | none | This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches. | 
filterTimeOrDuration
This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). Same with relative time for start and end.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| start | string(date-time) | false | none | none | 
| end | string(date-time) | false | none | none | 
| start_relative | string | false | none | none | 
| end_relative | string | false | none | none | 
filterBandwidth
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | any | true | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | string | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | integer | false | none | none | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| operation | string | true | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| operation | less_than | 
| operation | greater_than | 
filterString
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | string | true | none | none | 
| operation | string | true | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| operation | equal | 
| operation | substring | 
| operation | not_equal | 
filterDuration
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | string | true | none | none | 
| operation | string | true | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| operation | less_than | 
| operation | greater_than | 
filterInteger
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | integer | true | none | none | 
| operation | string | true | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| operation | equal | 
| operation | less_than | 
| operation | greater_than | 
| operation | not_equal | 
filterTime
This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞).
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| start | string(date) | false | none | none | 
| end | string(date) | false | none | none | 
filterBool
This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | boolean | true | none | none | 
filterAnywhere
This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| value | string | false | none | the substring to search in all specified fields | 
| fields | [string] | false | none | names of the fields to be searched | 
groupRequestParameters
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » order_by | false | none | specifies by which attribute groups should be sorted | |
| » filters | any | false | none | none | 
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | object | false | none | none | 
| »»» name | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| »» anonymous | false | none | filters that can be applied to both user and group requests | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » enumerate_members | false | none | if this is set to true the response will also contain a list of all members of the group. Otherwise only a count of the members will be given. | |
| » groups | false | none | a list of groups that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that groups that are not found in the backend will be missing from the response. | |
| » proplist | false | none | A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned. | 
accessListRequestParameters
request parameters for the access lists. Name here means: user or group name. Due to way the ACL all represented as strings in the database, sorting and filtering is very limited.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| order_by | string | false | none | none | 
| filters | object | false | none | filters for the access list objects. | 
| » internal_representation | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| » groupname | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| » username | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
| » object_type | string | false | none | Only return users or groups in the response. | 
| groups | false | none | a list of groups that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that groups that are not found in the backend will be missing from the response. | |
| users | [username] | false | none | a list of usernames that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that usernames that are not found in the backend will be missing from the response. | 
Enumerated Values
| Property | Value | 
|---|---|
| order_by | internal_prop_representation | 
| order_by | name | 
| object_type | user | 
| object_type | group | 
| object_type | all | 
enumerateMembersParameter
if this is set to true the response will also contain a list of all members of the group. Otherwise only a count of the members will be given.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | boolean | false | none | if this is set to true the response will also contain a list of all members of the group. Otherwise only a count of the members will be given. | 
userPropList
A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | array,null | false | none | A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned. | 
DMZIP
a DMZ IP and port that will that will forwarded to the client. This maps to the internal dmz_ip user property that is formatted as IP[:proto/start_port[-end_port]]
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| ip | string | true | none | the external IP address of the Access Server | 
| protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| start_port | integer | false | none | the starting port for the dmz. If not specified all ports will be forwarded | 
| end_port | integer | false | none | the end port of the ports that are being forwarded. If not specified only a single port (the start_port) is forwarded. | 
IpService
describes an IP UDP/TCP service or an icmp service
Properties
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | Describes an icmp service type. protocol is always icmp | 
icmpService
Describes an icmp service type. protocol is always icmp
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| type | string | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| type | icmp-any | 
| type | icmp-echo-reply | 
| type | icmp-destination-unreachable | 
| type | icmp-network-unreachable | 
| type | icmp-host-unreachable | 
| type | icmp-protocol-unreachable | 
| type | icmp-port-unreachable | 
| type | icmp-fragmentation-needed | 
| type | icmp-source-route-failed | 
| type | icmp-network-unknown | 
| type | icmp-host-unknown | 
| type | icmp-network-prohibited | 
| type | icmp-host-prohibited | 
| type | icmp-TOS-network-unreachable | 
| type | icmp-TOS-host-unreachable | 
| type | icmp-communication-prohibited | 
| type | icmp-host-precedence-violation | 
| type | icmp-precedence-cutoff | 
| type | icmp-source-quench | 
| type | icmp-redirect | 
| type | icmp-network-redirect | 
| type | icmp-host-redirect | 
| type | icmp-TOS-network-redirect | 
| type | icmp-TOS-host-redirect | 
| type | icmp-echo-request | 
| type | icmp-router-advertisement | 
| type | icmp-router-solicitation | 
| type | icmp-time-exceeded | 
| type | icmp-ttl-zero-during-transit | 
| type | icmp-ttl-zero-during-reassembly | 
| type | icmp-parameter-problem | 
| type | icmp-ip-header-bad | 
| type | icmp-required-option-missing | 
| type | icmp-timestamp-request | 
| type | icmp-timestamp-reply | 
| type | icmp-address-mask-request | 
portRange
Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| protocol | true | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
| start_port | integer | true | none | The start port of the port range | 
| end_port | integer | false | none | The end port of the port range. If not specified, the range will consist of only one single port (start_port) | 
layer4protocol
specifies a Layer 4 protocol (e.g. udp or tcp)
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | string | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | 
Enumerated Values
| Property | Value | 
|---|---|
| anonymous | tcp | 
| anonymous | udp | 
| anonymous | icmp | 
accessRouteListItem
Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works.
- The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. 
- The user/group require the username/groupname property 
- the nat and route type require the subnet property. 
Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class.
Either username or groupname is set to indicate whether this is a user or group assigned access rules.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| groupname | false | none | a group name that is being in used in user management to specify a group name. | |
| access_route | any | false | none | none | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | false | none | Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. - The user/group require the username/groupname property - the nat and route type require the subnet property. Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class. | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | null | false | none | indicator that routes of this type should be deleted | 
continued
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| type | string | false | none | the type of access list this item this is in the user/group. | 
oneOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
not
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | object | false | none | none | 
xor
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
not
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| » anonymous | object | false | none | none | 
Enumerated Values
| Property | Value | 
|---|---|
| type | access_from_ipv6 | 
| type | access_from_ipv4 | 
| type | access_to_ipv4 | 
| type | access_to_ipv6 | 
accessRoute
Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property.
- The user/group require the username/groupname property 
- the nat and route type require the subnet property. 
Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| type | string | false | none | none | 
| accept | boolean | false | none | specifies if we accept or deny this particular access | 
| username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
| groupname | false | none | a group name that is being in used in user management to specify a group name. | |
| subnet | false | none | The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64 | 
Enumerated Values
| Property | Value | 
|---|---|
| type | user | 
| type | group | 
| type | route | 
| type | nat | 
| type | all | 
| type | all_vpn_clients | 
| type | all_s2c_subnets | 
accessRouteSubnet
The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges
For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64|https,udp/1194,tcp/1194,udp/2000-2999|R - 10.0.0.7/24:icmp-any,rdp,imaps - 10.0.0.1/25:icmp-TOS-host-redirect
Note that the services array is optional. A missing service array indicates that the whole subnet is affected regardless of the used layer 4 service (icmp, tcp, udp or other IP protocol)
Properties
allOf
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | false | none | describes an IP subnet. | 
and
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| anonymous | object | false | none | none | 
| » service | false | none | [describes an IP UDP/TCP service or an icmp service] | 
IPsubNet
describes an IP subnet.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet | 
| netip | string | false | none | the network IP address. | 
| prefix_length | integer | false | none | length of the prefix in CIDR notation | 
groupIpRange
An IP Range that describes allowed IP addresses for a group will be represented as on backend as: - “first_ip-last_ip” - “first_ip~numberOfIPs” - “first_ip:last_ip” (IPv4 only, deprecated)
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 range | 
| first_ip | string | false | none | the start address of the IP range. | 
| last_ip | string | false | none | the end address of the IP range. | 
failOverTestResult
The result of a single failover test.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| friendly | string | false | none | Human readable interpretation of the test | 
| status | boolean | true | none | Whether this test succeeded or not | 
| message | string | true | none | detailed string of the test result | 
failOverTestStatus
The result of running the failover tests. The failover test runs a number of subtests. Note that if the connectivity test fails, often the other tests will fail as well.
Properties
| Name | Type | Required | Restrictions | Description | 
|---|---|---|---|---|
| ucarp | false | none | The result of a single failover test. | |
| license_primary | false | none | The result of a single failover test. | |
| license_secondary | false | none | The result of a single failover test. | |
| connectivity | false | none | The result of a single failover test. | 
{
  "header_image": "string",
  "hide_footer": "string",
  "enabled_auth_methods": [
    "saml",
    "userandpassword"
  ],
  "login_text": "Enter your TOTP Authentication code."
}
"autologin"
"niccolo@paganini.it"
"string"
"win_v3"
"serial"
"admin"
"name"
"node"
"asc"
{
  "serial": "1708464983752887'",
  "common_name": "OpenVPN VPN server CA",
  "algorithm": "rsa2048",
  "not_before": "2020-03-27",
  "not_after": "2030-03-26",
  "self_signed": true,
  "signing_ca": "123",
  "signing_ca_cn": "RootCA",
  "device_id": "string",
  "comment": "My toaster running Doom",
  "profile_type": "autologin",
  "tls_crypt_v2": true,
  "last_used": "2019-08-24",
  "username": "string"
}
"admin"
{
  "requires_mfa_enrollment": true,
  "user_type": "admin",
  "mfa_secret": "string",
  "allowed_profiles": [
    "autologin"
  ],
  "enforce_strong_passwords": true,
  "allow_password_change": true
}
{
  "challenge": "If you could be any animal, what would you be and why?",
  "echo": true,
  "challenge_context": "812jh3a8s"
}
{
  "response": "pa$$word",
  "challenge_context": "FJAIIXMAIOFLGAK23",
  "username": "string"
}
"1708464983752887'"
"OpenVPN VPN server CA"
{
  "username": "string",
  "password": "string",
  "totp": "string"
}
{
  "assertion": "string",
  "relay_state": "vpnauth~nod1~Dfk3287761d"
}
{
  "user_properties": {
    "requires_mfa_enrollment": true,
    "user_type": "admin",
    "mfa_secret": "string",
    "allowed_profiles": [
      "autologin"
    ],
    "enforce_strong_passwords": true,
    "allow_password_change": true
  },
  "username": "string",
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
{
  "auth_token": "string",
  "expires_after": "string",
  "renewable_until": "string"
}
{
  "204": null,
  "description": "profile successfully deleted"
}
"Client disconnected for administrative reasons"
"John should not be working after hours"
{
  "daemon_id": "openvpn_7",
  "client_id": 7
}
{
  "reason": "Your password must not include parts of Cthulhu's chant.",
  "title": "Password validation failed"
}
{
  "reason": "config values had errors",
  "detail": {
    "host.name": "Contains invalid character %",
    "server.port": "Must be an integer between 1 and 65335"
  }
}
"string"
"rsa2048"
"ca"
{
  "serial": "1708464983752887'",
  "common_name": "OpenVPN VPN server CA",
  "algorithm": "rsa2048",
  "not_before": "2020-03-27",
  "not_after": "2030-03-26",
  "self_signed": true,
  "signing_ca": "123",
  "signing_ca_cn": "RootCA"
}
{
  "serial": "1708464983752887'",
  "common_name": "OpenVPN VPN server CA",
  "algorithm": "rsa2048",
  "not_before": "2020-03-27",
  "not_after": "2030-03-26",
  "self_signed": true,
  "signing_ca": "123",
  "signing_ca_cn": "RootCA",
  "sha256fp": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "subj_alt_names": [
    "DNS:foo.example.com",
    "DNS:www.openvpn.net",
    "IP:1.2.3.4"
  ],
  "subject": [
    "C=US",
    "ST=Maryland",
    "L=Pasadena",
    "O=DevOrg",
    "OU=FreeSoft",
    "OU=non-free soft",
    "CN=rogue software department"
  ],
  "ca": true
}
{
  "serial": "1708464983752887'",
  "common_name": "OpenVPN VPN server CA",
  "algorithm": "rsa2048",
  "not_before": "2020-03-27",
  "not_after": "2030-03-26",
  "self_signed": true,
  "signing_ca": "123",
  "signing_ca_cn": "RootCA",
  "cert_type": "ca",
  "client_profiles": 0
}
{
  "algorithm": "secp384r1",
  "common_name": "my shiny new CA",
  "cert_template": "spcert",
  "days_to_expiry": 365,
  "private_key_passphrase": "string",
  "signing_ca": "string",
  "subj_alt_dns_names": [
    "vpn-server.example.com"
  ],
  "signing_ca_key": "string",
  "signing_ca_config_key": null,
  "signing_ca_private_key_passphrase": "string"
}
{
  "algorithm": "secp384r1",
  "common_name": "my shiny new CA"
}
{
  "value": 0,
  "default_value": 0,
  "max_value": 0,
  "min_value": 0
}
{
  "value": "string",
  "redacted_value": "PEM encoded private key [rsa2048]",
  "default_value": "string",
  "allowed_values": [
    "string"
  ],
  "type_hint": "ipv4Address"
}
{
  "value": true,
  "default_value": true
}
{
  "value": "string"
}
"default"
"vpn.server.cipher"
{
  "name": "vpn.server.cipher",
  "derived_from": "default",
  "type": "custom",
  "description": "string",
  "category": "deprecated",
  "value": 0,
  "default_value": 0,
  "max_value": 0,
  "min_value": 0
}
"string"
"string"
"36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C"
"https://node1:945"
"cold"
{
  "daemon_id": "openvpn_7",
  "client_id": 7,
  "bytes_sent": 0,
  "bytes_received": 0,
  "commonname": "plato_AUTOLOGIN",
  "username": "plato",
  "connected_since": "2019-08-24T14:15:22Z",
  "datachannel_cipher": "ChaCha20-Poly1305",
  "real_address": "1.2.7.8:23123",
  "virtual_ipv4_address": "10.0.0.7",
  "virtual_ipv6_address": "fd00:f00f::b00f"
}
7
"openvpn_7"
{
  "dco": true,
  "version": "OpenVPN 2.7_git [git:bloom/520bc001b093857c+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] [DCO] built on Nov 30 2023"
}
{
  "available": true,
  "version": "0.2.20230323"
}
{
  "timestamp": "2019-08-24T14:15:22Z",
  "node": "vpn-12.example.com",
  "username": null,
  "start_time": null,
  "duration": null,
  "service": "WEB_ADMIN",
  "active": true,
  "auth": true,
  "platform": "android",
  "version": "2.6.11",
  "proto": "tcp",
  "gui_version": "de.blinkt.openvpn_0.7.48",
  "real_address": "1.2.7.8:23123",
  "server_port": 1194,
  "virtual_ipv4_address": "10.0.0.7",
  "virtual_ipv6_address": "fd00:f00f::b00f",
  "session_id": "gOB8vpI1MEr0vBnm",
  "api_method": "ConfigQuery",
  "bytes_sent": 0,
  "bytes_received": 0,
  "total_bytes": 0,
  "error": "LOCKOUT: user temporarily locked out due to multiple authentication failures",
  "extra": "string"
}
{
  "licensing_type": "unlicensed",
  "current_cc": 3,
  "max_cc": 13,
  "fixed_licenses": [
    {
      "expiry": "2019-08-24T14:15:22Z",
      "key": "string",
      "max_cc": 0
    }
  ]
}
{}
{
  "fixed_licenses": [
    {
      "expiry": "2019-08-24T14:15:22Z",
      "key": "string",
      "max_cc": 0
    }
  ]
}
{
  "region": "eu-central-1",
  "product_code": "3ihdqli79gl9v2jnlzs6nq60h",
  "instance_id": "i-0c1ac1ca2f4b4a23b"
}
{
  "agent_id'": "13014502862141447248",
  "agent_disabled": true,
  "cc_limit": 13,
  "error": "string",
  "fallback_cc'": 2,
  "grace_period": 30,
  "last_successful_update": "2019-08-24T14:15:22Z",
  "total_cc": 0,
  "name": "Test subscription for development",
  "subkey": "ASUYHgkSWvVQFZhJXVdgtEa_AStctYuHirYZeFbZjLvQCWCaViVamXwL_7a289be35f6987c9aec4585c922a740c1b7620d5",
  "billing_id": "tctYuHirYZeFbZjLvQC",
  "next_update": "2019-08-24T14:15:22Z",
  "updates_failed": 0,
  "notes": [
    "Subscription will expire on 1/2/3",
    "Maximum allowed concurrent connections might be limited to 23 by the 'subscription.local_cc_limit' setting"
  ],
  "overdraft": true,
  "server": "asb.sts.openvpn.net",
  "type": "-",
  "state": "SUBSCRIPTION_OK"
}
{
  "token": "a4aL62OFooAjPu4wu6MQCvcmY070hu8B",
  "username": "arne@openvpn.net",
  "expires": "2019-08-24T14:15:22Z",
  "profile_type": "autologin",
  "usages": 1
}
{
  "name": "string",
  "deny": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "deny_web": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "admin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "autologin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "auth_method": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cc_commands": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "totp": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "password_strength": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_password_change": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "reroute_gw": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_generate_profiles": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "password_defined": true,
  "mfa_status": "pending",
  "totp_locked": true,
  "group": "stringsection",
  "static_ipv4": "string",
  "static_ipv6": "string",
  "dmz_ip": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "dmz_ipv6": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "compile": true,
  "totp_secret": "string",
  "totp_admin_only": true,
  "client_to_server_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "cli_script_connect_win_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    },
    "property2": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    }
  }
}
{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "password_defined": true,
  "mfa_status": "pending",
  "totp_locked": true,
  "group": "stringsection",
  "static_ipv4": "string",
  "static_ipv6": "string",
  "dmz_ip": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "dmz_ipv6": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "compile": true,
  "totp_secret": "string",
  "totp_admin_only": true,
  "client_to_server_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}
{
  "name": "string",
  "deny": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "deny_web": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "admin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "autologin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "auth_method": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cc_commands": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "totp": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "password_strength": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_password_change": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "reroute_gw": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_generate_profiles": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "members": [
    "niccolo@paganini.it",
    "hillary@hahn.us",
    "yoyoma"
  ],
  "member_count": 0,
  "subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "dynamic_ranges": [
    {
      "ipv6": true,
      "first_ip": "fd00::18cc:1b01:a772:50e1",
      "last_ip": "fd00::18cc:1b01:a772:80e1"
    }
  ],
  "cli_script_connect_win_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    },
    "property2": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    }
  }
}
{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "members": [
    "niccolo@paganini.it",
    "hillary@hahn.us",
    "yoyoma"
  ],
  "member_count": 0,
  "subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "dynamic_ranges": [
    {
      "ipv6": true,
      "first_ip": "fd00::18cc:1b01:a772:50e1",
      "last_ip": "fd00::18cc:1b01:a772:80e1"
    }
  ],
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}
{
  "name": "string",
  "deny": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "deny_web": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "admin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "autologin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "auth_method": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cc_commands": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "totp": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "password_strength": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_password_change": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "reroute_gw": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_generate_profiles": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "def_deny": true,
  "cli_script_connect_win_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    },
    "property2": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    }
  },
  "group": "stringsection"
}
{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "def_deny": true,
  "cli_script_connect_win_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    },
    "property2": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    }
  },
  "group": "stringsection"
}
{
  "def_deny": true
}
{
  "members": [
    "niccolo@paganini.it",
    "hillary@hahn.us",
    "yoyoma"
  ],
  "member_count": 0,
  "subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ],
  "dynamic_ranges": [
    {
      "ipv6": true,
      "first_ip": "fd00::18cc:1b01:a772:50e1",
      "last_ip": "fd00::18cc:1b01:a772:80e1"
    }
  ]
}
{
  "password_defined": true,
  "mfa_status": "pending",
  "totp_locked": true,
  "group": "stringsection",
  "static_ipv4": "string",
  "static_ipv6": "string",
  "dmz_ip": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "dmz_ipv6": [
    {
      "ip": "123.7.3.1",
      "start_port": 7000,
      "end_port": 7111,
      "protocol": "udp"
    }
  ],
  "compile": true,
  "totp_secret": "string",
  "totp_admin_only": true,
  "client_to_server_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ]
}
{
  "value": "string",
  "inherited": true,
  "inherited_source_type": "default",
  "inherited_source_name": "administrators"
}
{
  "name": "string",
  "deny": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "deny_web": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "admin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "autologin": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "auth_method": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cc_commands": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "totp": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "password_strength": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_password_change": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "reroute_gw": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "allow_generate_profiles": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ]
}
{
  "name": "string",
  "deny": true,
  "deny_web": true,
  "admin": true,
  "autologin": true,
  "auth_method": "string",
  "cc_commands": "string",
  "totp": true,
  "password_strength": true,
  "allow_password_change": true,
  "reroute_gw": true,
  "allow_generate_profiles": true,
  "bypass_subnets": [
    {
      "prefix_length": 21,
      "netip": "131.234.72.0",
      "ipv6": false
    }
  ]
}
{
  "cli_script_connect_win_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_user_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_connect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_mac_admin_disconnect": {
    "value": "string",
    "inherited": true,
    "inherited_source_type": "default",
    "inherited_source_name": "administrators"
  },
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    },
    "property2": {
      "value": "string",
      "inherited": true,
      "inherited_source_type": "default",
      "inherited_source_name": "administrators"
    }
  }
}
{
  "cli_script_connect_win_user_connect": "string",
  "cli_script_connect_win_user_disconnect": "string",
  "cli_script_connect_win_admin_connect": "string",
  "cli_script_connect_win_admin_disconnect": "string",
  "cli_script_connect_mac_user_connect": "string",
  "cli_script_connect_mac_user_disconnect": "string",
  "cli_script_connect_mac_admin_connect": "string",
  "cli_script_connect_mac_admin_disconnect": "string",
  "cli_script_connect_win_env": {
    "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi",
    "lucky_number": "23",
    "SCRIPT_VER": "alpha9"
  },
  "cli_script_connect_mac_env": {
    "property1": "string",
    "property2": "string"
  }
}
"on"
{
  "tag": "DCO_NOT_ACTIVE",
  "message": "Insecure VPN cipher in use",
  "description": "Insecure cipher DES-EDE3-CBC allowed for VPN encryption. Consider removing this cipher from vpn.server.data_ciphers (AES-256-GCM:DES-EDE3-CBC) and/or disabling vpn.server.enable_cipher_fallback (False)",
  "severity": "ok"
}
{
  "status": "on",
  "error": [
    {
      "tag": "DCO_NOT_ACTIVE",
      "message": "Insecure VPN cipher in use",
      "description": "Insecure cipher DES-EDE3-CBC allowed for VPN encryption. Consider removing this cipher from vpn.server.data_ciphers (AES-256-GCM:DES-EDE3-CBC) and/or disabling vpn.server.enable_cipher_fallback (False)",
      "severity": "ok"
    }
  ]
}
{
  "last_restarted": "2019-08-24T14:15:22Z",
  "service_status": {
    "property1": {
      "status": "on",
      "error": []
    },
    "property2": {
      "status": "on",
      "error": []
    }
  },
  "auth_module_status": {
    "property1": "on",
    "property2": "on"
  }
}
{
  "name": "eth0",
  "networks": [
    {
      "netip": "fd00::18cc:1b01:a772:50e1",
      "ipv6": true,
      "prefix_len": "64"
    },
    {
      "netip": "10.0.0.1",
      "ipv6": false,
      "prefix_len": 25
    },
    {
      "netip": "192.168.0.1",
      "ipv6": false,
      "prefix_len": 24
    }
  ]
}
{
  "control_channel_security": "none",
  "installers": [
    "win_v3"
  ],
  "hide_profiles_page": true,
  "password_min_len": 0,
  "disable_open_in_app": true,
  "admin_port": 0,
  "shared_origin": true
}
"none"
{
  "version": "2.13.0-internal",
  "build": "18eba991",
  "web_version": "2.12.7-82fda2",
  "web_override": true,
  "client_version": [
    "27"
  ],
  "os_distribution": "Ubuntu 24.04.6 LTS",
  "architecture": "arm64",
  "cores": 0,
  "os_hostname": "access-server-os-hostname"
}
{
  "eula_version_as": 7,
  "eula_web_hash": "36D7D51F474A84A2A30A41BC92CBA5D9D65F756484011D6F58B9D667F8DBBE9C",
  "eula_accepted": true
}
{
  "notification_type": "CLUSTER_RESTART_PENDING"
}
{
  "rr_dns_hostname": "cluster.example.com",
  "rr_dns_new_nodes": true
}
{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C"
}
{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "mysqluri": "mysql://user:password@mysql.example.com:3306/"
}
{
  "name": "vienna.example.com",
  "api_endpoint": "https://node1:945",
  "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C",
  "mysqluri": "mysql://user:password@mysql.example.com:3306/",
  "rr_dns_hostname": "cluster.example.com",
  "rr_dns_new_nodes": true,
  "rr_update_node": true
}
"mysql://user:password@mysql.example.com:3306/"
{
  "user": "niccolo@paganini.it",
  "profile_type": "autologin",
  "tls_crypt_v2": true,
  "comment": "connected from my iPhone",
  "ignore_missing_user": null
}
{
  "user": "niccolo@paganini.it",
  "installer_type": "win_v3",
  "profile_type": "autologin",
  "tls_crypt_v2": true
}
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc"
}
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "serial",
  "filters": {
    "user": {
      "operation": "substring",
      "value": "vio"
    },
    "serial_number": {
      "value": 400,
      "operation": "less_than"
    },
    "tls_crypt_v2": {
      "value": true
    },
    "last_used": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "not_before": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "not_after": {
      "start": "2019-08-24",
      "end": "2019-08-24"
    },
    "comment": {
      "operation": "substring",
      "value": "vio"
    },
    "signing_ca_cn": {
      "operation": "substring",
      "value": "vio"
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  }
}
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "admin",
  "filters": {
    "name": {
      "operation": "substring",
      "value": "vio"
    },
    "group": {
      "operation": "substring",
      "value": "vio"
    },
    "admin": {
      "value": true
    },
    "autologin": {
      "value": true
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  },
  "users": [
    "niccolo@paganini.it"
  ],
  "proplist": [
    "string"
  ]
}
{
  "admin": {
    "value": true
  },
  "autologin": {
    "value": true
  },
  "anywhere": {
    "value": "bass",
    "fields": [
      "username",
      "group"
    ]
  }
}
{
  "lifetime": 0,
  "usages": 0,
  "profile_type": "autologin",
  "username": "niccolo@paganini.it"
}
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "node",
  "filters": {
    "start_time": {
      "start_relative": "20d",
      "end_relative": "15d 20m"
    },
    "timestamp": {
      "start_relative": "20d",
      "end_relative": "15d 20m"
    },
    "duration": {
      "value": "20d",
      "operation": "less_than"
    },
    "node": {
      "operation": "substring",
      "value": "vio"
    },
    "username": {
      "operation": "substring",
      "value": "vio"
    },
    "active": {
      "value": true
    },
    "error": {
      "value": true
    },
    "service": {
      "operation": "substring",
      "value": "vio"
    },
    "virtual_ipv4_address": {
      "operation": "substring",
      "value": "vio"
    },
    "bytes_sent": {
      "value": "20kb",
      "operation": "less_than"
    },
    "bytes_received": {
      "value": "20kb",
      "operation": "less_than"
    },
    "gui_version": {
      "operation": "substring",
      "value": "vio"
    },
    "version": {
      "operation": "substring",
      "value": "vio"
    },
    "platform": {
      "operation": "substring",
      "value": "vio"
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  }
}
{
  "start_relative": "20d",
  "end_relative": "15d 20m"
}
{
  "value": "20kb",
  "operation": "less_than"
}
{
  "operation": "substring",
  "value": "vio"
}
{
  "value": "20d",
  "operation": "less_than"
}
{
  "value": 400,
  "operation": "less_than"
}
{
  "start": "2019-08-24",
  "end": "2019-08-24"
}
{
  "value": true
}
{
  "value": "bass",
  "fields": [
    "username",
    "group"
  ]
}
{
  "page_size": 0,
  "offset": 0,
  "sort_by": "asc",
  "order_by": "name",
  "filters": {
    "name": {
      "operation": "substring",
      "value": "vio"
    },
    "admin": {
      "value": true
    },
    "autologin": {
      "value": true
    },
    "anywhere": {
      "value": "bass",
      "fields": []
    }
  },
  "enumerate_members": true,
  "groups": [
    "string"
  ],
  "proplist": [
    "string"
  ]
}
{
  "order_by": "internal_prop_representation",
  "filters": {
    "internal_representation": {
      "operation": "substring",
      "value": "vio"
    },
    "groupname": {
      "operation": "substring",
      "value": "vio"
    },
    "username": {
      "operation": "substring",
      "value": "vio"
    },
    "object_type": "user"
  },
  "groups": [
    "string"
  ],
  "users": [
    "niccolo@paganini.it"
  ]
}
true
[ "string" ]
{
  "ip": "123.7.3.1",
  "start_port": 7000,
  "end_port": 7111,
  "protocol": "udp"
}
{
  "protocol": "tcp",
  "start_port": 0,
  "end_port": 0
}
{
  "protocol": "tcp",
  "type": "icmp-any"
}
{
  "protocol": "tcp",
  "start_port": 0,
  "end_port": 0
}
"tcp"
{
  "username": "johann",
  "access_route": {
    "type": "route",
    "accept": "true",
    "subnet": {
      "ipv6": true,
      "prefix_length": 64,
      "netip": "2001:bach:ce1:10::0"
    }
  },
  "type": "access_to_ipv4"
}
{
  "type": "user",
  "accept": true,
  "username": "niccolo@paganini.it",
  "groupname": "string",
  "subnet": {
    "prefix_length": 21,
    "netip": "131.234.72.0",
    "ipv6": false,
    "service": [
      {}
    ]
  }
}
{
  "prefix_length": 21,
  "netip": "131.234.72.0",
  "ipv6": false,
  "service": [
    {
      "protocol": "tcp",
      "start_port": 0,
      "end_port": 0
    }
  ]
}
{
  "prefix_length": 21,
  "netip": "131.234.72.0",
  "ipv6": false
}
{
  "ipv6": true,
  "first_ip": "fd00::18cc:1b01:a772:50e1",
  "last_ip": "fd00::18cc:1b01:a772:80e1"
}
{
  "friendly": "string",
  "status": true,
  "message": "string"
}
{
  "ucarp": {
    "friendly": "string",
    "status": true,
    "message": "string"
  },
  "license_primary": {
    "friendly": "string",
    "status": true,
    "message": "string"
  },
  "license_secondary": {
    "friendly": "string",
    "status": true,
    "message": "string"
  },
  "connectivity": {
    "friendly": "string",
    "status": true,
    "message": "string"
  }
}
Legacy REST API
Access Server API
The Access Server REST API allows programmatic download of OpenVPN connection profiles.
Overview
The Access Server REST API allows programmatic download of OpenVPN connection profiles. This is the same API used by OpenVPN Connect and is compatible with other clients and tools.
- Supports userlogin and autologin profiles. 
- Uses HTTP Basic Authentication. 
- Returns connection profiles as - .ovpnfiles.
- Can be accessed via command-line tools like - curl.
Base URL
https://<ACCESS_SERVER>/rest/<METHOD>
Prerequisites
- Access Server is deployed and accessible. 
- XML-RPC/REST API is enabled under: Admin Web UI > Configuration > CWS Settings. 
- A valid username and password for an Access Server user. 
- Access Server’s HTTPS port is typically - 443, unless configured otherwise.
Authentication
The API uses HTTP Basic Authentication. Include the username:password pair in your request header or via the -u option in curl.
TLS certificate validation is required. If using a self-signed certificate, pass it with --cacert. Avoid using -k unless testing.
If your credentials contain special characters (e.g., @), wrap them in single quotes.
curl -u 'username:password' https://<ACCESS_SERVER>/rest/<METHOD>
Profile Parameters
| Parameter | Description | 
|---|---|
| 
 | The username of the Access Server user for whom the connection profile is requested. | 
| 
 | The specified user's password. | 
| 
 | (Optional) The port on which the client web server listens. This is set to 443 by default, but you can specify a different port if needed. | 
| 
 | Indicates support for TLS Crypt V2, a more secure encryption mechanism for protecting control channel traffic in OpenVPN. | 
| 
 | Specify the device for which the connection profile is being generated. (It helps associate a particular connection profile with a specific device, ensuring the generated profile corresponds to the right device.) | 
Endpoints
GetUserlogin
Retrieves a user-based OpenVPN connection profile (requires username/password at connection time).
Optional query parameters
- tls-cryptv2=1: Enables TLS Crypt V2 (recommended for enhanced security).
- action=import: Triggers direct import in some clients.
Optional headers (to prevent multiple 2FA prompts)
VPN-Session-User: <base64_encoded_user>
VPN-Session-Token: <base64_encoded_token>
Success response
- Content-Type: application/x-openvpn-profile
Error response:
- Content-Type: text/xml
GetAutologin
Retrieves a client-certificate-based profile suitable for unattended clients (no password prompt).
Important
Ensure the user has autologin permission enabled in the Admin Web UI under User Permissions.
Success response
- Content-Type: application/x-openvpn-profile
Error response
- Content-Type: text/xml
Request
curl -u 'username:password' "https://<ACCESS_SERVER>/rest/GetUserlogin?tls-cryptv2=1&action=import"
Request
curl -u 'username:password' https://<ACCESS_SERVER>/rest/GetAutologin
Challenge/Response Authentication
Overview
The REST API supports challenge/response authentication for cases requiring additional user verification. This method is used when the server needs to verify a user's identity through a challenge that the user must respond to before the requested OpenVPN configuration file can be returned.
Here's an overview of how the process works:
- The client sends an authentication request with the user's credentials (username and password) to the Access Server: - curl -u test:mypass https://ACCESS_SERVER/rest/GetUserlogin 
- When additional verification is required (e.g., a Turing test), the server responds with a challenge message instead of the requested configuration file. This response includes the challenge details, formatted as - CRV1.
- The client presents the challenge to the user (e.g., "What is 1 x 3?"). The user enters the response. 
- The client then resubmits the request with the challenge response in the format specified by the server. 
- If the server validates the response, the requested connection profile is returned. 
Challenge/response authentication details
- Receiving a challenge: When the client requests a connection profile (e.g., - GetUserlogin), but the server needs further validation, it responds with a challenge.
- Understanding the challenge message: The challenge message follows the format - CRV1: <flags>:<state_id>:<username_base64>:<challenge_text>, where:- flags: A series of optional, comma-separate flags specifying additional behavior:- E: Echo the response as the user types it.
- R: Indicates that a response is required.
 
- state_id: An opaque string to be returned along with the response.
- username_base64: The base64-encoded username of the user requesting the connection profile.
- challenge_text: The challenge text (e.g., the Turing question) presented to the user.
 
- Responding to the challenge: After displaying the challenge text to the user, the client waits for the user's response. If the - Rflag is present, the response is required. The response may be an empty string if the flag isn't present.
- Resubmitting the response: Once the user responds, the client resubmits the request to the server. 
- Validating the response: If the server successfully validates the response (e.g., '3' as the answer to the Turing test), it returns the requested connection profile, and the client can proceed with the VPN connection. 
Example workflow
- Initial request: - curl -u test:mypass https://ACCESS_SERVER/rest/GetUserlogin 
- Server response (challenge): - <Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>CRV1:R,E:miwN39AlF4k40Fd8X8r9j74FuOoaJKJM:dGVzdA==:Turing test: what is 1 x 3? (9007)</Message> </Error> 
- The user responds to the challenge question, "What is 1x3?" with the answer 3. 
- The client resubmits the request: - curl -u "test:CRV1::miwN39AlF4k40Fd8X8r9j74FuOoaJKJM::3" https://ACCESS_SERVER/rest/GetUserlogin 
- The server verifies the response and returns the connection profile. 
<Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>CRV1:R,E:miwN39AlF4k40Fd8X8r9j74FuOoaJKJM:dGVzdA==:Turing test: what is 1 x 3? (9007)</Message> </Error>
curl -u "test:CRV1::miwN39AlF4k40Fd8X8r9j74FuOoaJKJM::3" https://ACCESS_SERVER/rest/GetUserlogin
Here, the username is decoded from the username_base64, and the state_id and response_text (the user's answer) are appended.
Certificate Verification
When using curl, ensure that the Access Server web server employs a trusted certificate, such as a commercial web certificate. If you use a self-signed CA, ensure this certificate is available to curl or any HTTPS client you're using.
The Access Server web CA certificate can be found at /usr/local/openvpn_as/etc/web-ssl/ca.crt.
You can specify it with a curl option:
--cacert ca.crt
Caution
While you can disable web server certificate verification using the -k option, we discourage this practice for security reasons.
Error Handling
The REST API will return errors in an XML format (in contrast to typical REST JSON responses). These are some common error responses:
- Authentication failed (invalid username/password): - <?xml version="1.0" encoding="UTF-8"?> <Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>AUTH_FAILED: Server Agent XML method requires authentication (9007)</Message> </Error> 
- Permission denied (user lacks autologin privileges): - <?xml version="1.0" encoding="UTF-8"?> <Error> <Type>Internal Server Error</Type> <Synopsis>REST method failed</Synopsis> <Message>NEED_AUTOLOGIN: User 'USERNAME' lacks autologin privilege (9000)</Message> </Error> 
- User not enrolled for authentication: - <?xml version="1.0" encoding="UTF-8"?> <Error> <Type>Access denied</Type> <Synopsis>REST method failed</Synopsis> <Message>You must enroll this user in Authenticator first before you are allowed to retrieve a connection profile. (9008)</Message> </Error> 
- WebAuth fallback: An error will occur if the server is configured for web-based authentication (SAML) but a user attempts to use the REST API instead. The client should offer the option to proceed with SAML authentication. - <Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>Ovpn-WebAuth: providername,flags</Message> </Error> 
