Execute token-layer action
curl --request POST \
--url https://api.tokenlayer.network/functions/v1/token-layer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expiresAfter": 300000,
"action": {
"type": "register",
"method": "web3",
"message": "TokenLayer register\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\ntimestamp: 1737600000000",
"signature": "0xaabb..."
},
"nonce": 1737600000000,
"signature": "0x5f2a...",
"signatureChainId": "0x1"
}
'import requests
url = "https://api.tokenlayer.network/functions/v1/token-layer"
payload = {
"expiresAfter": 300000,
"action": {
"type": "register",
"method": "web3",
"message": "TokenLayer register\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\ntimestamp: 1737600000000",
"signature": "0xaabb..."
},
"nonce": 1737600000000,
"signature": "0x5f2a...",
"signatureChainId": "0x1"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
expiresAfter: 300000,
action: {
type: 'register',
method: 'web3',
message: 'TokenLayer register\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\ntimestamp: 1737600000000',
signature: '0xaabb...'
},
nonce: 1737600000000,
signature: '0x5f2a...',
signatureChainId: '0x1'
})
};
fetch('https://api.tokenlayer.network/functions/v1/token-layer', 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.tokenlayer.network/functions/v1/token-layer",
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([
'expiresAfter' => 300000,
'action' => [
'type' => 'register',
'method' => 'web3',
'message' => 'TokenLayer register\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\ntimestamp: 1737600000000',
'signature' => '0xaabb...'
],
'nonce' => 1737600000000,
'signature' => '0x5f2a...',
'signatureChainId' => '0x1'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.tokenlayer.network/functions/v1/token-layer"
payload := strings.NewReader("{\n \"expiresAfter\": 300000,\n \"action\": {\n \"type\": \"register\",\n \"method\": \"web3\",\n \"message\": \"TokenLayer register\\\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\\\ntimestamp: 1737600000000\",\n \"signature\": \"0xaabb...\"\n },\n \"nonce\": 1737600000000,\n \"signature\": \"0x5f2a...\",\n \"signatureChainId\": \"0x1\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.tokenlayer.network/functions/v1/token-layer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expiresAfter\": 300000,\n \"action\": {\n \"type\": \"register\",\n \"method\": \"web3\",\n \"message\": \"TokenLayer register\\\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\\\ntimestamp: 1737600000000\",\n \"signature\": \"0xaabb...\"\n },\n \"nonce\": 1737600000000,\n \"signature\": \"0x5f2a...\",\n \"signatureChainId\": \"0x1\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tokenlayer.network/functions/v1/token-layer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expiresAfter\": 300000,\n \"action\": {\n \"type\": \"register\",\n \"method\": \"web3\",\n \"message\": \"TokenLayer register\\\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\\\ntimestamp: 1737600000000\",\n \"signature\": \"0xaabb...\"\n },\n \"nonce\": 1737600000000,\n \"signature\": \"0x5f2a...\",\n \"signatureChainId\": \"0x1\"\n}"
response = http.request(request)
puts response.read_body{
"actionType": "register",
"name": "register",
"success": true,
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"walletAddress": "<string>",
"method": "web3"
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}Token Layer
Execute token-layer action
Generic action endpoint for Token Layer handlers.
Supported actions:
- register
- createToken
- tradeToken
- sendTransaction
- transferToken
- claimRewards
- createReferralCode
- enterReferralCode
- mintUsd
Authentication modes:
- JWT bearer
- API key bearer
- Wallet signature bearer (Authorization: Bearer 0x…)
For wallet-signature auth:
- signature must be a valid EIP-712 signature over the typed request payload
- nonce is timestamp in milliseconds
- expiresAfter is expiration window in milliseconds
- action.message and action.signature are required for register action
- action.message must include a 13-digit millisecond timestamp (e.g. “timestamp: 1737600000000”)
- action.message timestamp must exactly match nonce and be within expiresAfter
POST
/
token-layer
Execute token-layer action
curl --request POST \
--url https://api.tokenlayer.network/functions/v1/token-layer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expiresAfter": 300000,
"action": {
"type": "register",
"method": "web3",
"message": "TokenLayer register\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\ntimestamp: 1737600000000",
"signature": "0xaabb..."
},
"nonce": 1737600000000,
"signature": "0x5f2a...",
"signatureChainId": "0x1"
}
'import requests
url = "https://api.tokenlayer.network/functions/v1/token-layer"
payload = {
"expiresAfter": 300000,
"action": {
"type": "register",
"method": "web3",
"message": "TokenLayer register\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\ntimestamp: 1737600000000",
"signature": "0xaabb..."
},
"nonce": 1737600000000,
"signature": "0x5f2a...",
"signatureChainId": "0x1"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
expiresAfter: 300000,
action: {
type: 'register',
method: 'web3',
message: 'TokenLayer register\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\ntimestamp: 1737600000000',
signature: '0xaabb...'
},
nonce: 1737600000000,
signature: '0x5f2a...',
signatureChainId: '0x1'
})
};
fetch('https://api.tokenlayer.network/functions/v1/token-layer', 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.tokenlayer.network/functions/v1/token-layer",
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([
'expiresAfter' => 300000,
'action' => [
'type' => 'register',
'method' => 'web3',
'message' => 'TokenLayer register\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\ntimestamp: 1737600000000',
'signature' => '0xaabb...'
],
'nonce' => 1737600000000,
'signature' => '0x5f2a...',
'signatureChainId' => '0x1'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.tokenlayer.network/functions/v1/token-layer"
payload := strings.NewReader("{\n \"expiresAfter\": 300000,\n \"action\": {\n \"type\": \"register\",\n \"method\": \"web3\",\n \"message\": \"TokenLayer register\\\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\\\ntimestamp: 1737600000000\",\n \"signature\": \"0xaabb...\"\n },\n \"nonce\": 1737600000000,\n \"signature\": \"0x5f2a...\",\n \"signatureChainId\": \"0x1\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.tokenlayer.network/functions/v1/token-layer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expiresAfter\": 300000,\n \"action\": {\n \"type\": \"register\",\n \"method\": \"web3\",\n \"message\": \"TokenLayer register\\\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\\\ntimestamp: 1737600000000\",\n \"signature\": \"0xaabb...\"\n },\n \"nonce\": 1737600000000,\n \"signature\": \"0x5f2a...\",\n \"signatureChainId\": \"0x1\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tokenlayer.network/functions/v1/token-layer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expiresAfter\": 300000,\n \"action\": {\n \"type\": \"register\",\n \"method\": \"web3\",\n \"message\": \"TokenLayer register\\\\naddress: 0xafe140dbfe00606990d913c04efd318701c99d17\\\\ntimestamp: 1737600000000\",\n \"signature\": \"0xaabb...\"\n },\n \"nonce\": 1737600000000,\n \"signature\": \"0x5f2a...\",\n \"signatureChainId\": \"0x1\"\n}"
response = http.request(request)
puts response.read_body{
"actionType": "register",
"name": "register",
"success": true,
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"walletAddress": "<string>",
"method": "web3"
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}{
"error": "<string>",
"success": false,
"code": "<string>",
"details": null
}See the integration guide for action-by-action examples and flow:
Authorizations
JWT token or API key
Body
application/json
- Register
- Create Token
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
Envelope for register action
Environment indicator included in typed-data payload
Available options:
Mainnet, Testnet Expiration window in milliseconds
Required range:
x > 0Example:
300000
Register a new wallet address with Token Layer
Show child attributes
Show child attributes
Nonce timestamp in milliseconds. Required for wallet-signature authentication.
Required range:
x > 0Example:
1737600000000
Required when using wallet signature auth (Bearer wallet address)
Pattern:
^0x[a-fA-F0-9]{130}$Example:
"0x5f2a..."
Required when using wallet signature auth. EIP-712 domain chainId in hex.
Pattern:
^0x[0-9a-fA-F]+$Example:
"0x1"
Response
Successful response
- Register Response
- Create Token Response
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
