Register user
curl --request POST \
--url https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"email": "<string>",
"password": "<string>",
"name": "<string>",
"phone": "<string>",
"metadata": {}
}
'import requests
url = "https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register"
payload = {
"email": "<string>",
"password": "<string>",
"name": "<string>",
"phone": "<string>",
"metadata": {}
}
headers = {
"X-API-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>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: '<string>',
password: '<string>',
name: '<string>',
phone: '<string>',
metadata: {}
})
};
fetch('https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register', 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://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register",
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>',
'password' => '<string>',
'name' => '<string>',
'phone' => '<string>',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register"
payload := strings.NewReader("{\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-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://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register")
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["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_bodyGate API
Register user
Create a new tenant user account.
POST
/
api
/
v1
/
gate
/
{project_id}
/
auth
/
register
Register user
curl --request POST \
--url https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"email": "<string>",
"password": "<string>",
"name": "<string>",
"phone": "<string>",
"metadata": {}
}
'import requests
url = "https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register"
payload = {
"email": "<string>",
"password": "<string>",
"name": "<string>",
"phone": "<string>",
"metadata": {}
}
headers = {
"X-API-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>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: '<string>',
password: '<string>',
name: '<string>',
phone: '<string>',
metadata: {}
})
};
fetch('https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register', 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://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register",
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>',
'password' => '<string>',
'name' => '<string>',
'phone' => '<string>',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register"
payload := strings.NewReader("{\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-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://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://org-api.hexoforge.dev/api/v1/gate/{project_id}/auth/register")
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["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_bodyCreates a new tenant user. Requires
The user must complete Verify email before logging in.
X-API-Key. Replace {project_id} with your project UUID.
Request body
string
required
Valid email, max 320 characters.
string
required
8–128 characters.
string
Display name, max 256 characters.
string
Phone string, max 32 characters.
object
Arbitrary JSON metadata.
Response
- 201 — verification disabled
- 201 — verification enabled
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "dGhpcyBpcyBhIHJlZnJlc2g...",
"token_type": "bearer",
"expires_in": 900,
"requires_email_verification": false,
"last_login_method": null
}
string
JWT access token.
string
Refresh token (single-use chain).
string
Always
bearer.integer
Access token lifetime in seconds.
boolean
false when email verification is off and tokens are returned.string | null
Previous sign-in method for UX hints (
null on first registration).{
"access_token": null,
"refresh_token": null,
"token_type": "bearer",
"expires_in": null,
"requires_email_verification": true,
"last_login_method": null
}
Status codes
| Code | Meaning |
|---|---|
| 201 | User created |
| 400 | Password validation failed |
| 403 | Registration disabled, user limit, IP block, or firewall deny |
| 409 | Email already registered |
| 429 | Rate limited |