curl --request POST \
--url https://api.useopenwrench.com/api/external/v1/supplier/user/provision \
--header 'Content-Type: application/json' \
--header 'OW-KEY: <api-key>' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"email": "<string>",
"nameGiven": "<string>",
"nameFamily": "<string>",
"roles": [
"<string>"
],
"facilityId": 123,
"title": "<string>",
"department": "<string>",
"isSharedContact": true,
"readOnlyAccess": true,
"hasAccessToAllLocations": true,
"locationIds": [
123
],
"brandIds": [
123
],
"hasAccessToAllStockLocations": true,
"canManageAllStockLocations": true,
"stockLocationIds": [
123
],
"epaCertificationType": "<string>",
"epaCertificationNumber": "<string>",
"password": "<string>",
"passwordResetRequired": true
}
'import requests
url = "https://api.useopenwrench.com/api/external/v1/supplier/user/provision"
payload = {
"email": "<string>",
"nameGiven": "<string>",
"nameFamily": "<string>",
"roles": ["<string>"],
"facilityId": 123,
"title": "<string>",
"department": "<string>",
"isSharedContact": True,
"readOnlyAccess": True,
"hasAccessToAllLocations": True,
"locationIds": [123],
"brandIds": [123],
"hasAccessToAllStockLocations": True,
"canManageAllStockLocations": True,
"stockLocationIds": [123],
"epaCertificationType": "<string>",
"epaCertificationNumber": "<string>",
"password": "<string>",
"passwordResetRequired": True
}
headers = {
"X-API-KEY": "<api-key>",
"OW-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<api-key>',
'OW-KEY': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: '<string>',
nameGiven: '<string>',
nameFamily: '<string>',
roles: ['<string>'],
facilityId: 123,
title: '<string>',
department: '<string>',
isSharedContact: true,
readOnlyAccess: true,
hasAccessToAllLocations: true,
locationIds: [123],
brandIds: [123],
hasAccessToAllStockLocations: true,
canManageAllStockLocations: true,
stockLocationIds: [123],
epaCertificationType: '<string>',
epaCertificationNumber: '<string>',
password: '<string>',
passwordResetRequired: true
})
};
fetch('https://api.useopenwrench.com/api/external/v1/supplier/user/provision', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.useopenwrench.com/api/external/v1/supplier/user/provision",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '<string>',
'nameGiven' => '<string>',
'nameFamily' => '<string>',
'roles' => [
'<string>'
],
'facilityId' => 123,
'title' => '<string>',
'department' => '<string>',
'isSharedContact' => true,
'readOnlyAccess' => true,
'hasAccessToAllLocations' => true,
'locationIds' => [
123
],
'brandIds' => [
123
],
'hasAccessToAllStockLocations' => true,
'canManageAllStockLocations' => true,
'stockLocationIds' => [
123
],
'epaCertificationType' => '<string>',
'epaCertificationNumber' => '<string>',
'password' => '<string>',
'passwordResetRequired' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"OW-KEY: <api-key>",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.useopenwrench.com/api/external/v1/supplier/user/provision"
payload := strings.NewReader("{\n \"email\": \"<string>\",\n \"nameGiven\": \"<string>\",\n \"nameFamily\": \"<string>\",\n \"roles\": [\n \"<string>\"\n ],\n \"facilityId\": 123,\n \"title\": \"<string>\",\n \"department\": \"<string>\",\n \"isSharedContact\": true,\n \"readOnlyAccess\": true,\n \"hasAccessToAllLocations\": true,\n \"locationIds\": [\n 123\n ],\n \"brandIds\": [\n 123\n ],\n \"hasAccessToAllStockLocations\": true,\n \"canManageAllStockLocations\": true,\n \"stockLocationIds\": [\n 123\n ],\n \"epaCertificationType\": \"<string>\",\n \"epaCertificationNumber\": \"<string>\",\n \"password\": \"<string>\",\n \"passwordResetRequired\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("OW-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.useopenwrench.com/api/external/v1/supplier/user/provision")
.header("X-API-KEY", "<api-key>")
.header("OW-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\",\n \"nameGiven\": \"<string>\",\n \"nameFamily\": \"<string>\",\n \"roles\": [\n \"<string>\"\n ],\n \"facilityId\": 123,\n \"title\": \"<string>\",\n \"department\": \"<string>\",\n \"isSharedContact\": true,\n \"readOnlyAccess\": true,\n \"hasAccessToAllLocations\": true,\n \"locationIds\": [\n 123\n ],\n \"brandIds\": [\n 123\n ],\n \"hasAccessToAllStockLocations\": true,\n \"canManageAllStockLocations\": true,\n \"stockLocationIds\": [\n 123\n ],\n \"epaCertificationType\": \"<string>\",\n \"epaCertificationNumber\": \"<string>\",\n \"password\": \"<string>\",\n \"passwordResetRequired\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.useopenwrench.com/api/external/v1/supplier/user/provision")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["OW-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"<string>\",\n \"nameGiven\": \"<string>\",\n \"nameFamily\": \"<string>\",\n \"roles\": [\n \"<string>\"\n ],\n \"facilityId\": 123,\n \"title\": \"<string>\",\n \"department\": \"<string>\",\n \"isSharedContact\": true,\n \"readOnlyAccess\": true,\n \"hasAccessToAllLocations\": true,\n \"locationIds\": [\n 123\n ],\n \"brandIds\": [\n 123\n ],\n \"hasAccessToAllStockLocations\": true,\n \"canManageAllStockLocations\": true,\n \"stockLocationIds\": [\n 123\n ],\n \"epaCertificationType\": \"<string>\",\n \"epaCertificationNumber\": \"<string>\",\n \"password\": \"<string>\",\n \"passwordResetRequired\": true\n}"
response = http.request(request)
puts response.read_body{
"type": "<string>",
"data": {
"email": "<string>",
"nameGiven": "<string>",
"nameFamily": "<string>",
"contactType": "<string>",
"title": "<string>",
"department": "<string>",
"facilityId": 123,
"isSharedContact": true,
"readOnlyAccess": true,
"invitedByEmail": "<string>",
"invitedAt": "2023-11-07T05:31:56Z",
"epaCertificationType": "<string>",
"epaCertificationNumber": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"status": "ok"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}Provision a supplier user
Creates a supplier contact (and, when a password is given, a login-enabled user account) under the API key’s supplier company. Rules: roles must be non-empty and may NOT include admin/super-admin roles (403); the target facility (facilityId, defaulting to the key’s own facility) must belong to the same supplier company (403); an existing account or contact for the email is a 400 conflict. SUPPLIER_TECH roles additionally get a FieldTech record. Without a password, a sign-up invitation email is sent; with one, the account is created active (optionally with passwordResetRequired). Admin-granting shortcuts: any admin role would force hasAccessToAllLocations, but admin roles are rejected here.
curl --request POST \
--url https://api.useopenwrench.com/api/external/v1/supplier/user/provision \
--header 'Content-Type: application/json' \
--header 'OW-KEY: <api-key>' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"email": "<string>",
"nameGiven": "<string>",
"nameFamily": "<string>",
"roles": [
"<string>"
],
"facilityId": 123,
"title": "<string>",
"department": "<string>",
"isSharedContact": true,
"readOnlyAccess": true,
"hasAccessToAllLocations": true,
"locationIds": [
123
],
"brandIds": [
123
],
"hasAccessToAllStockLocations": true,
"canManageAllStockLocations": true,
"stockLocationIds": [
123
],
"epaCertificationType": "<string>",
"epaCertificationNumber": "<string>",
"password": "<string>",
"passwordResetRequired": true
}
'import requests
url = "https://api.useopenwrench.com/api/external/v1/supplier/user/provision"
payload = {
"email": "<string>",
"nameGiven": "<string>",
"nameFamily": "<string>",
"roles": ["<string>"],
"facilityId": 123,
"title": "<string>",
"department": "<string>",
"isSharedContact": True,
"readOnlyAccess": True,
"hasAccessToAllLocations": True,
"locationIds": [123],
"brandIds": [123],
"hasAccessToAllStockLocations": True,
"canManageAllStockLocations": True,
"stockLocationIds": [123],
"epaCertificationType": "<string>",
"epaCertificationNumber": "<string>",
"password": "<string>",
"passwordResetRequired": True
}
headers = {
"X-API-KEY": "<api-key>",
"OW-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<api-key>',
'OW-KEY': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: '<string>',
nameGiven: '<string>',
nameFamily: '<string>',
roles: ['<string>'],
facilityId: 123,
title: '<string>',
department: '<string>',
isSharedContact: true,
readOnlyAccess: true,
hasAccessToAllLocations: true,
locationIds: [123],
brandIds: [123],
hasAccessToAllStockLocations: true,
canManageAllStockLocations: true,
stockLocationIds: [123],
epaCertificationType: '<string>',
epaCertificationNumber: '<string>',
password: '<string>',
passwordResetRequired: true
})
};
fetch('https://api.useopenwrench.com/api/external/v1/supplier/user/provision', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.useopenwrench.com/api/external/v1/supplier/user/provision",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '<string>',
'nameGiven' => '<string>',
'nameFamily' => '<string>',
'roles' => [
'<string>'
],
'facilityId' => 123,
'title' => '<string>',
'department' => '<string>',
'isSharedContact' => true,
'readOnlyAccess' => true,
'hasAccessToAllLocations' => true,
'locationIds' => [
123
],
'brandIds' => [
123
],
'hasAccessToAllStockLocations' => true,
'canManageAllStockLocations' => true,
'stockLocationIds' => [
123
],
'epaCertificationType' => '<string>',
'epaCertificationNumber' => '<string>',
'password' => '<string>',
'passwordResetRequired' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"OW-KEY: <api-key>",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.useopenwrench.com/api/external/v1/supplier/user/provision"
payload := strings.NewReader("{\n \"email\": \"<string>\",\n \"nameGiven\": \"<string>\",\n \"nameFamily\": \"<string>\",\n \"roles\": [\n \"<string>\"\n ],\n \"facilityId\": 123,\n \"title\": \"<string>\",\n \"department\": \"<string>\",\n \"isSharedContact\": true,\n \"readOnlyAccess\": true,\n \"hasAccessToAllLocations\": true,\n \"locationIds\": [\n 123\n ],\n \"brandIds\": [\n 123\n ],\n \"hasAccessToAllStockLocations\": true,\n \"canManageAllStockLocations\": true,\n \"stockLocationIds\": [\n 123\n ],\n \"epaCertificationType\": \"<string>\",\n \"epaCertificationNumber\": \"<string>\",\n \"password\": \"<string>\",\n \"passwordResetRequired\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("OW-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.useopenwrench.com/api/external/v1/supplier/user/provision")
.header("X-API-KEY", "<api-key>")
.header("OW-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\",\n \"nameGiven\": \"<string>\",\n \"nameFamily\": \"<string>\",\n \"roles\": [\n \"<string>\"\n ],\n \"facilityId\": 123,\n \"title\": \"<string>\",\n \"department\": \"<string>\",\n \"isSharedContact\": true,\n \"readOnlyAccess\": true,\n \"hasAccessToAllLocations\": true,\n \"locationIds\": [\n 123\n ],\n \"brandIds\": [\n 123\n ],\n \"hasAccessToAllStockLocations\": true,\n \"canManageAllStockLocations\": true,\n \"stockLocationIds\": [\n 123\n ],\n \"epaCertificationType\": \"<string>\",\n \"epaCertificationNumber\": \"<string>\",\n \"password\": \"<string>\",\n \"passwordResetRequired\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.useopenwrench.com/api/external/v1/supplier/user/provision")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["OW-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"<string>\",\n \"nameGiven\": \"<string>\",\n \"nameFamily\": \"<string>\",\n \"roles\": [\n \"<string>\"\n ],\n \"facilityId\": 123,\n \"title\": \"<string>\",\n \"department\": \"<string>\",\n \"isSharedContact\": true,\n \"readOnlyAccess\": true,\n \"hasAccessToAllLocations\": true,\n \"locationIds\": [\n 123\n ],\n \"brandIds\": [\n 123\n ],\n \"hasAccessToAllStockLocations\": true,\n \"canManageAllStockLocations\": true,\n \"stockLocationIds\": [\n 123\n ],\n \"epaCertificationType\": \"<string>\",\n \"epaCertificationNumber\": \"<string>\",\n \"password\": \"<string>\",\n \"passwordResetRequired\": true\n}"
response = http.request(request)
puts response.read_body{
"type": "<string>",
"data": {
"email": "<string>",
"nameGiven": "<string>",
"nameFamily": "<string>",
"contactType": "<string>",
"title": "<string>",
"department": "<string>",
"facilityId": 123,
"isSharedContact": true,
"readOnlyAccess": true,
"invitedByEmail": "<string>",
"invitedAt": "2023-11-07T05:31:56Z",
"epaCertificationType": "<string>",
"epaCertificationNumber": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"status": "ok"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}{
"message": "<string>",
"type": "<string>",
"status": "error",
"traceId": "<string>"
}Auktoriseringar
OpenWrench shared secret. Required on every request alongside X-API-KEY; issued together with your API key.
Kropp
REQUIRED. Lower-cased and trimmed.
REQUIRED
REQUIRED
REQUIRED, non-empty. Supplier role names (case-insensitive); admin and super-admin roles are rejected.
Target supplier facility; defaults to the API key contact's facility. Must belong to the same supplier company.
Default false
Default false
Location ids the user may access (ignored when hasAccessToAllLocations is true)
Brand ids the user may access (ignored when hasAccessToAllLocations is true)
Default false; forced false when stockLocationIds is non-empty
Default false; forced false when stockLocationIds is non-empty
EPA 608 certification class; validated
When present, an active user account is created with this password instead of sending a sign-up invite
Only meaningful together with password
Svar
The created contact (envelope type "SupplierContact")
Entity type label, e.g. "SupplierContact". Endpoints that derive it via Scala reflection (most generic list/get endpoints) may return the fully qualified server class name instead (e.g. "models.workorder.WorkOrder"); treat this field as informational.
Contact record (abridged - the full Contact model carries additional fields).
Show child attributes
Show child attributes
"ok" on success
ok